在下面的PHP代码中,准备好的语句有意导致错误,以测试bind_param并执行,添加$ bikes。
在execute函数中返回错误信息;但是,在bind_param中,虽然发生了错误,但它不会返回任何错误信息。
如何在bind_param中获取错误信息?
$sqlQuery = "INSERT INTO the_cars (cars) VALUES (?)";
if($statement = $con->prepare($sqlQuery)){
if(!$statement->bind_param("s", $cars, $bikes)){ //bikes should not be here
$errors = $statement->error; //error is empty
};
if(!$statement->execute()){
$errors1 = $statement->error; // error: No data supplied for parameters in prepared statement
};
}else{
$errors = $con->error;
}
编辑:
PHP手册似乎表明在bind_param中应该处理错误。 请参阅本文的以下部分:示例#3 INSERT准备一次,多次执行»/ *预备语句,阶段2:绑定并执行* /
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
这似乎也是某些职位所倡导的立场。例如:
MySQLi prepared statements error reporting
但是,我做了几次尝试,而且我无法在bind_param中获得语句错误的描述。
答案 0 :(得分:2)
你不能从尚未执行的事情中得到错误(也没有得到错误),因此第二个条件语句不会抛出错误。您需要检查执行是否成功,而不是bind_param()
方法。
然后第三个(条件语句)理论上不会因为您在查询中的内容被抛出错误而被理论上视为有效(查询)语句。
您需要做的是从绑定中移除if(!$statement)
语句,但将其保留在执行部分中。
然后您将收到错误。
if($statement = $con->prepare($sqlQuery))
的第一个条件语句是有效的,因此else
因为它没有被执行而不会抛出错误。
请参阅PHP.net上的以下参考手册,了解如何正确查询/检查错误,并且不要试图重新发明不打算首先抛出错误的内容:
简而言之,错误处理是在查询(及其执行)上完成的,而不是在绑定上。
参考bind_param()
上的手册:
该方法没有提及或错误处理的例子。