2012-07-07 88 views
3

根據php手冊,您可以通過詢問$ stmt-> error和$ stmt-> errno來檢索任何預先準備的語句方法中的錯誤,但是bind_param方法從來沒有似乎將這些設置爲錯誤,任何人都可以證實這一點?或者告訴我我錯過了什麼?

例如:

echo "Start\n"; 
$db = new mysqli('localhost','test','xxxxxx','test'); 

$val = 1; 

$st = $db->prepare('insert into tblTest set field1=?'); 
if($st == false) 
{ 
    printf("prepare: %s %d\n",$db->error,$st->errno); 
} 

$rs = $st->bind_param('is', $val); 
if($rs == false) 
{ 
    printf("bind_param: %s %d\n",$st->error,$st->errno); 
} 

$rs = $st->execute(); 
if($rs == false) 
{ 
    printf("execute: %s %d\n",$st->error,$st->errno); 
} 

$rs = $st->close(); 
if($rs == false) 
{ 
    printf("close: %s %d\n",$st->error,$st->errno); 
} 
echo "Finish\n"; 

從命令行顯示運行以上:

Start 
PHP Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in test.php on line 14 
bind_param: 0 
execute: No data supplied for parameters in prepared statement 2031 
Finish 

所以PHP是看到此作爲警告,bind_param被返回false,但錯誤&錯誤號是不組。執行也失敗,並已正確設置錯誤& errno

這是一個錯誤?

+0

是否記錄爲做其他事情而不是在失敗時返回false? – Mat 2012-07-07 11:43:36

+0

mysql_error的PHP手冊指出$ stmt-> error會返回「最近調用的語句函數可能成功或失敗的錯誤消息」。我會爭辯說,對bind_param的調用是失敗的最近調用的語句函數。 – Chris 2012-07-07 12:59:03

回答

6

MySQLi::errorMySQLi::errno是錯誤代碼和由RDBMS返回到PHP的郵件集裝箱,設立的語句時,PHP代碼中遇到錯誤。對bind_param()(參數不足)的錯誤調用顯然不會與RDBMS進行通信,因此不會從RDBMS接收到其錯誤。

根據to the docs,bind_param()返回布爾FALSE失敗。所以你需要驗證它被成功調用。

$rs = $st->bind_param('is', $val); 
if ($rs) { 
    $st->execute(); 
} 
+0

感謝您的回覆,我確實在代碼中使用了bind_param的返回值,我正在構建的類然後拋出一個Exception來指示失敗的東西,但是在異常中返回有意義的錯誤會比較有用,而不是隻是「bind_param失敗」或其他。 PHP手冊具有誤導性,因爲它指出$ stmt->錯誤返回「最近調用的語句函數的錯誤消息,可能會成功或失敗」。 – Chris 2012-07-07 12:55:31

+1

@ user1508636是的我同意在文檔中有一點誤導,但不幸的是,您需要一些自定義PHP錯誤處理程序來將這些PHP調用錯誤與MySQLi錯誤一起旋轉。 – 2012-07-08 19:31:22