私は準備された挿入ステートメントを数年間使用しており、パラメーターを適切にバインドしているか、エラーが発生すると想定していましたが、次のphpがエラーなしでレコードをバインドおよび挿入するのではなく、intである必要がある文字列をゼロに変更するようには見えません. したがって、SQL インジェクション攻撃を防ぐには問題ないかもしれませんが、テーブルに偽のレコードが作成されることになります。例えば:
$q = "INSERT INTO `table` (id1, id2) VALUES (?, ?)";
$stmt = mysqli_stmt_init($dbc);
$stmt->prepare($q);
$id1 = 'aaaaaaa';
$id2= 'aaaaaaa';
$result = $stmt->bind_param('ii', $id1, $id2);
echo '<p>' . $result . '</p>'; // Trying to bind a string to an int returns true!
echo $dbc->error; // nothing
$stmt->execute(); // inserts record changing $id2 to zero but auto-increments primary key $id1
echo $dbc->error; // nothing
これは、Apache/2.2.14、PHP/5.3.1、および MySQL 5.1.41 を使用する Xampp 環境で実行されています。誰が何が起こっているのか教えてもらえますか?