有没有办法对$ stmt-> bind_param进行错误检查?

时间:2017-10-13 19:03:18

标签: php mysql prepared-statement

以下是我在网页上提交新表单的代码。我整天都在研究这个问题,而且声明在bind_param上失败了。

$query = "  INSERT INTO table
                                    (   
                                        AbandonedComments,                                          
                                        DetectorComments,                                           
                                        FireExComments,                                         
                                        PestComments,                                       
                                        SanitationComments
                                    )
                                VALUES
                                    (   
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?;
                                    )";   
                $stmt = $mysqli->prepare($query);   
                $stmt->bind_param("sssss",
                        $_POST['GeneralComment'],
                        $_POST['SmokeDetectorComment'],
                        $_POST['fireExComments'],
                        $_POST['PestComments'],
                        $_POST['SanitationComments']
                );
$stmt->execute();
$stmt->close();

我已将该部分包装在try / catch,if / else中,并已测试以查看值是否正在通过。

  • try / catch没有捕获,但它也没有成功
  • if / else既没有运行。
  • 所有值都相应地传递。

我知道execute()可以被错误检查,因为它返回一个布尔值,但是我没有在bind_param上找到任何东西。

编辑:我在发布此消息后立即与我的老板交谈,他指出了错误,并解释说没有错误检查'bind_param'但是'prepare'和'execute'都会返回boolean并且你可以检查那里。

4 个答案:

答案 0 :(得分:4)

 VALUES
                                    (   
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?; <<< trailing semi-colon

注意那里的分号?

它没有抛出错误的原因是因为在PHP和其他语言中,被认为是一个有效的字符,是一个&#34;语句的结尾&#34;并位于所有占位符的末尾(请参阅编辑)。

参考:

  

与在C或Perl中一样,PHP要求在每个语句结尾处以分号结束指令。 PHP代码块的结束标记自动表示分号;你不需要一个分号来终止PHP块的最后一行。块的结束标记将包括紧接着的新行(如果存在)。

您声明查询(绑定)失败;它要么失败又有理由而你没有检查真正的错误,否则就会无声地失败。

您也无法检查绑定上的错误,检查查询中的错误以及错误报告,如果这也是与PHP相关的问题。

编辑:

但是,您的查询读取的内容如下:

 VALUES
                                    (   
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?; <<< trailing semi-colon                                         
                                        ?
                                     )";

...然后那将是一个完全不同的球赛,因为最后一个占位符永远不会被使用,并且声明在第四个占位符处停止。

您可以而且应该使用条件语句,将您当前的$stmt->execute();语句修改为!并使用&#34; not&#34;运算符,转换为&#34;如果查询未执行&#34;

if(!$stmt->execute()) {
    echo "Error: " . mysqli_error($mysqli);
}else{
    echo "Success";
}

答案 1 :(得分:2)

我认为你错误地插入了分号

VALUES
                                    (   
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?,                                          
                                        ?**;**
                                    )"

答案 2 :(得分:2)

当您拨打prepare()而不是bind_param()时,语法检查已完成。

$stmt = $mysqli->prepare($query) or die($mysqli->error);

但是,bind_param()应报告错误,因为$stmtFALSE。它应该抱怨在非对象上调用方法。

答案 3 :(得分:2)

正如@Barmar所示,如果您不启用例外,那么您必须检查每个mysqli调用以获取false的响应。 IIRC,每个mysqli函数都会在出错时返回false。

您应该只配置mysqli来为prepare()错误引发异常。这不是默认设置,因此您必须启用它。但是如何从文档中做到这一点并不明显。

http://php.net/manual/en/mysqli-driver.report-mode.php显示了一个示例。

mysqli_report(MYSQLI_REPORT_STRICT);

$link = mysqli_connect(...);

执行此操作后,您的prepare()应该引发异常,因为SQL语法错误,其他人指出的您的values子句中的额外分号。

我总是很惊讶很少有人使用mysqli启用异常。我猜他们只是没有注意到文档中关于mysqli_report()的部分。它真的很埋没。

使用PDO的开发人员似乎更常见的是启用异常。默认情况下也不启用此功能,但在文档中更容易找到:http://php.net/manual/en/pdo.error-handling.php