准备好的语句和bind_param错误处理

时间:2017-09-10 20:13:11

标签: php error-handling prepared-statement

在下面的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中获得语句错误的描述。

1 个答案:

答案 0 :(得分:2)

你不能从尚未执行的事情中得到错误(也没有得到错误),因此第二个条件语句不会抛出错误。您需要检查执行是否成功,而不是bind_param()方法。

然后第三个(条件语句)理论上不会因为您在查询中的内容被抛出错误而被理论上视为有效(查询)语句。

您需要做的是从绑定中移除if(!$statement)语句,但将其保留在执行部分中。

然后您将收到错误。

if($statement = $con->prepare($sqlQuery))的第一个条件语句是有效的,因此else因为它没有被执行而不会抛出错误。

请参阅PHP.net上的以下参考手册,了解如何正确查询/检查错误,并且不要试图重新发明不打算首先抛出错误的内容:

简而言之,错误处理是在查询(及其执行)上完成的,而不是在绑定上。

参考bind_param()上的手册:

该方法没有提及或错误处理的例子。