我一直在使用準備好的插入語句幾年,並假設它正確地綁定參數或會給出一個錯誤,但它似乎不像以下PHP綁定並插入記錄沒有任何錯誤,但將應該是int的字符串更改爲零。因此,防止SQL注入攻擊可能是正確的,但最終會在表中出現虛假記錄。例如:MYSQLI準備語句bind_param類型不起作用
$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環境中。誰能告訴我發生了什麼事?
我想你想檢查stmt錯誤 - '$ stmt-> error'而不是db連接錯誤'$ dbc-> error'。 – Sean
對不起,這是一個錯字。 $ stmt->錯誤不會給出錯誤,但是這是預期的,因爲bind_param返回true。 bind_param錯誤報告顯然是無用的! –