2012-07-07 114 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