私のコードは現在、を使用mysqli::query
してチェックしていますmysqli::$warning_count
。整数列にテキストを挿入しようとすると、0
が挿入され、警告が生成されます。ただし、準備されたステートメントを学習し始めたばかりで、同じクエリに対して警告は生成されません。
これが私のコードからの抜粋です:
$db_err_msg = 'Database Error: Failed to update profile';
$sql = "UPDATE tblProfiles SET intBookId = ? WHERE lngProfileId = ?";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$book = 'CA';
$id = 10773;
$stmt->bind_param('ii', $book, $id) or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
echo '$stmt->affected_rows is ', $stmt->affected_rows, "\n";
if ($mysqli->warning_count) {
$warnings = $stmt->get_warnings();
do {
trigger_error('Database Warning (' . $warnings->errno . '): '
. $warnings->message, E_USER_WARNING);
} while ( $warnings->next() );
}
else {
echo 'no warnings', "\n";
}
次の出力が生成されます。
$stmt->affected_rows は 1
警告なし
intBookId
列にはTINYINT
データ型があることに注意してください。を使用すると同じクエリで警告が生成されますが、mysqli::query
準備済みステートメントを使用すると警告が生成されません。
厳密モードを有効にしても役に立ちません。を使用すると警告がエラーに変わりますmysqli::query
が、準備されたステートメントを使用すると、列は暗黙のうちに0
;で更新されます。
記録のために、私のアプリケーションは、この時点に到達する前にすでに広範な検証を行っています。しかし、誤って見逃してしまう可能性のあるものをキャッチする方法として、この追加の検証が必要でした。
注: PDO に切り替えることは、現在のプロジェクトの範囲を超えています。
MySQLi のプリペアド ステートメントでこの問題が発生するのはなぜですか? これは予想される動作ですか?