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+5;

并让它再次循环。然而,我的输出跳过了表中的前 5 行并返回了接下来的 5 行。此外,在运行了大约 20 条左右的记录后,它又跳过了 5 行。它处理的行是正确的,我通过查询的回显来验证。当我在 Navicat 中使用查询时,将 $run 替换为 0,一切正常,返回前 5 行。

知道我做错了什么或如何解决这个问题吗?我过去从未遇到过这种情况,并且对不同的报告使用几乎相同的查询。

4

1 回答 1

0

如果要返回特定范围的记录,请确保还添加一个order by子句。MySQL 可能会更改查询之间的行顺序。

另一个可能更合理的原因是查询有时会失败。例如,如果其中一个字段包含无效字符,它可能会破坏您的查询,返回 false 而不是 mysqli 查询结果,因此无法输出任何内容。

您正在使用addslashes转义字符串,但这不是正确的方法。您可以使用mysqli_real_escape_string,甚至更好:使用参数化查询(准备好的语句)。

于 2013-07-29T15:30:13.130 回答