2

eBayからxmlデータを取得し、その結果をMySQLに入れる作業をしていますが、データの取得は正常に機能しますが、いくつかのxmlタグ値の整数値が正しくないため、データベースへの入力は失敗します。

xmlタグの値は「true」(引用符なし)という単語であり、これはdbsqlです。

CREATE TABLE ebay_categories (
CategoryID int(10) NOT NULL default '0',
CategoryLevel int(5) NOT NULL default '0',
CategoryName varchar(120) NOT NULL default '',
CategoryParentID int(10) NOT NULL default '0',
LeafCategory int(1) NOT NULL default '0',
AutoPayEnabled int(1) NOT NULL default '0',
Expired int(1) NOT NULL default '0',
IntlAutosFixedCat int(1) NOT NULL default '0',
Virtual int(1) NOT NULL default '0',
LSD int(1) NOT NULL default '0',
ORPA int(1) NOT NULL default '0',
PRIMARY KEY  (CategoryID),
KEY catlevel (CategoryLevel),
KEY parent (CategoryParentID),
KEY ape (AutoPayEnabled),
KEY expired (Expired),
KEY IAFC (IntlAutosFixedCat),
KEY virtual (Virtual),
KEY lsd (LSD),
KEY orpa (ORPA),
KEY leaf (LeafCategory)
) TYPE=MyISAM; 

私はint、tinyint、Boolean(tinyintに頼る)を無駄に試しましたが、それでもこの問題が発生します。LeafCategoryなどのint型としてvarcharを使用してテストを実行し、すべてが正常に機能したため、db接続に問題はありません。

db挿入の前に正規表現を介して検索および置換することなくできることがありますか?

編集:

    $query = "INSERT INTO `ebay_categories` (`CategoryID`, `LeafCategory`)VALUES           ('$xmlCategoryID', '$xmlLeafCategory')";

    if (mysqli_query($link, $query)) {
    echo "Successfully inserted " . mysqli_affected_rows($link) . " row";
} else {
    echo "Error occurred: " . mysqli_error($link);
}

クライアントコードからアンラップされたSQLステートメントは次のとおりです。

    INSERT INTO `ebay_categories` 
                (`CategoryID`, `LeafCategory`)
         VALUES 
                ('$xmlCategoryID', '$xmlLeafCategory')";
4

1 に答える 1

2

あなたが持っているエラーは、XMLの少なくとも1つのレコードが$xmlCategoryIDまたは$xmlLeafCategoryのいずれかの有効な整数以外のものを持っていることを示しています。

何をすべきか?

A.次のように、エラーメッセージに問題のあるデータを表示させることができます。

  echo "Error occurred: " . mysqli_error($link);
  echo "Bad data was either ##$xmlCategoryID## or ##$xmlLeafCategory##.";

エラーメッセージで空の文字列を検出できるように、## $value##を使用したことに注意してください。あなたはおそらくこれを行うべきです。

B.これらの列の列定義を変更して、NOTNULL宣言を削除してみてください。実際にこれらの値の1つが空の場合、これで問題が解決する可能性があります。

bigintC.この情報に値が必要な可能性があります。つまり、非常に大きな数になる可能性があります。

D. null値や不正な値を気にせずに検出できない場合は、これを試すことができます。

INSERT INTO `ebay_categories` 
             (`CategoryID`, `LeafCategory`)
      VALUES 
             (CAST(IFNULL('$xmlCategoryID',-1) AS INT)
            (CAST(IFNULL('$xmlLeafCategory',-1) AS INT)

これにより、null値が-1になり、非整数値が0になります。

編集:ああ、私は今理解しています。leafCategoryアイテムはXMLの数値ではなく、true / false/emptyの値です。おそらく偽と空は同じことを意味します。

SQLのcaseステートメントを使用してtrue/otherを1/0に変換し、これを試してください。

INSERT INTO `ebay_categories` 
             (`CategoryID`, `LeafCategory`)
      VALUES (
              '$xmlCategoryID',
              CASE '$xmlLeafCategory' WHEN 'true' THEN 1 ELSE 0 END
              )

最後に、危険!プリペアドステートメントを使用する必要があり、XMLファイルから抽出するこれらの値をサニタイズする必要があります。そうしないと、誰かがソフトウェアをだまして、汚染されたXMLファイルを提供することでデータベースを破壊することができます。SQLインジェクションについて読んでください。

于 2012-11-15T14:28:14.843 に答える