2013-02-07 32 views
1

爲什麼當綁定到無效類型的參數時,我沒有收到錯誤?例如:準備好的語句,與錯誤的數據綁定不會引發錯誤

$mysqli = new mysqli(HOST, USERNAME, PASSWORD, SCHEMA); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: " . $mysqli->connect_error; 
} 

$stmt = $mysqli->prepare("update app_site_group set name_eng=?, name_fra=? where app_site_group_id=?"); 

$one = "one"; 
$two = "two"; 
$three = "a"; 
$stmt->bind_param('ssi',$one,$two,$three); 

$stmt->execute(); 

第三個參數在需要整數時作爲字符串傳遞。它不會引發錯誤(除了影響0行外)。

回答

3

作爲整數提供的i是類型MySQLi將傳遞值作爲查詢。但是,API本身並不關心它獲取的值是字符串還是整數。 PHP/MySQLi將轉換成將字符串傳遞給RDBMS時爲整數。

因此,數字外觀的字符串將被轉換爲等效整數。對於像您的'a'這樣的非數字字符串,結果將爲整數0,它可能與您的數據中的行匹配或不匹配。

echo (int)'a'; 
// 0 

所以你的情況已執行的查詢看上去像

update app_site_group set name_eng = 'one', name_fra = 'two' where app_site_group_id = 0 

如果你有其中app_site_group_id = 0,那麼這些將被匹配的行。因此,除了使用準備好的語句外,重要的是始終確認參數的內容,以確保它們包含理智的值。

+0

非常好的答案! – Kermit

+0

@ michael-berkowski感謝您的澄清! – TekiusFanatikus