mysqli を使用した準備済み更新が、WHERE 句で参照されている行ではなく、テーブル内のすべての行を更新していることに気付きました。これが起こっている理由について、私は困惑しています。以下の簡略化されたコードを使用してテストを実行しましたが、それでも発生します。PHP 5.3.18 とクライアント API ライブラリ バージョン 5.0.96 を使用しています。
$mysqli = new mysqli("localhost", "user", "pass", "db");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "UPDATE test SET first_name = ? WHERE last_name = ?";
if(!$stmt = $mysqli->prepare($query)) {
die("Unable to prepare<br />");
}
$first = 'test';
$second = 'something';
$stmt->bind_param("ss", $first, $second);
if (!$stmt->execute()) {
die("Could not execute<br />");
}
echo "done";
クエリは実行されますが、テーブル内のすべての行の first_name が更新されます。はい、"something" を含む last_name があります。いいえ、他の 3 つのテスト行には last_name = something がありません。これはライブラリに問題がありますか?私のPHP設定?もしかして睡眠不足?何?
ああ...さらに...「UPDATE test SET first_name = ? WHERE id = ?」のようなクエリを使用すると IDを使用するようにパラメータを更新すると、機能します。単一の行のみを更新します。では、WHERE 句で last_name 列を使用できないのはなぜですか?