0

次の MySqli クエリがあります。

    $run = 0;
$result = $conn->query("SELECT title, author,i.isbn13, i.sku, quantity, weight, listed_price
from book
LEFT JOIN inventory i on book.isbn13 = i.isbn13
where quantity > 0 and i.isbn13 like '978%' limit $run, 5");

次に、Amazon の API を実行して XML データを返します。次に、それを解析してテーブルを次のように更新します。

    $conn->query("update book set author = '" . addslashes($amazonResult['Author']) . "', title ='" . addslashes($amazonResult['Title']) . "',
         edition='" . addslashes($amazonResult['Edition']) . "',
         weight='" . $amazonResult['Weight'] . "', publisher='" . addslashes($amazonResult['Publisher']) . "', binding='" . $amazonResult['Binding'] . "',
         pub_date='" . $amazonResult['PublishDate'] . "', listed_price = '" .$amazonResult['ListPrice'] . "'
         where isbn13 = '" . $amazonResult['isbn'] . "'");

$run を更新:

$run=$run+5;

もう一度ループさせます。それでも、私の出力はテーブルの最初の 5 行をスキップし、次の 5 行を返します。また、約 20 レコードを実行した後、再び 5 行をスキップします。それが処理する行は、正しく処理されます。これは、クエリのエコーで確認できます。Navicat でクエリを使用すると、$run を 0 に置き換えます。すべて問題なく表示され、最初の 5 行が返されます。

私が間違っていたこと、またはこれを修正する方法はありますか? 過去にこれに遭遇したことはなく、さまざまなレポートにほぼ同じクエリを使用しています。

4

1 に答える 1

0

特定の範囲のレコードを返す場合は、必ずorder by句も追加してください。MySQL は、クエリ間で行の順序を変更する場合があります。

もう 1 つの、おそらくさらにもっともらしい原因は、クエリが失敗する場合があることです。たとえば、フィールドの 1 つに無効な文字が含まれていると、クエリが壊れて、mysqli クエリの結果ではなく false が返され、何も出力されない可能性があります。

文字列をエスケープするために使用addslashesしていますが、それは適切な方法ではありません。mysqli_real_escape_stringを使用できますが、さらに優れた方法として、パラメーター化されたクエリ (準備済みステートメント) を使用できます。

于 2013-07-29T15:30:13.130 に答える