Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can';如果bind_param()不匹配,则无法捕获MySQLi异常_Php_Mysqli - Fatal编程技术网

Php Can';如果bind_param()不匹配,则无法捕获MySQLi异常

Php Can';如果bind_param()不匹配,则无法捕获MySQLi异常,php,mysqli,Php,Mysqli,因此,如果我在创建连接之前打开mysqli_报告(mysqli_报告错误| mysqli_报告严格),我希望它以异常的形式报告所有错误,这似乎是真的。然而,由于某种原因,我收到了一个错误警告,我 显然,无法捕获绑定变量或类型的bind_param()中是否存在不匹配。下面是一个示例消息,如果我使用太少或太多的变量进行绑定,我会得到这个消息 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配 这是一个带有mysqli\u sql\u异常的bug吗?我可以很明

因此,如果我在创建连接之前打开
mysqli_报告(mysqli_报告错误| mysqli_报告严格)
,我希望它以异常的形式报告所有错误,这似乎是真的。然而,由于某种原因,我收到了一个错误警告,我 显然,无法捕获绑定变量或类型的
bind_param()
中是否存在不匹配。下面是一个示例消息,如果我使用太少或太多的变量进行绑定,我会得到这个消息

警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配

这是一个带有mysqli\u sql\u异常的bug吗?我可以很明显地压制这个警告,但这似乎有点不切实际。另一方面,如果我做了
@
,我仍然会得到一条有意义的消息

未为准备语句中的参数提供数据


尽管如此,如果可能的话,我还是不想这样做,但这似乎是唯一的办法,除非我完全错过了什么。我很惊讶我在任何地方都找不到关于这个的任何信息。我想我可以用
set\u error\u handler()
做点什么,但我真的认为对于这种情况,抑制警告是一个更好的选择。

是的,驱动程序中仍然存在不一致性。并不是每个错误都被翻译成
ErrorException
,但有些仍然只是PHP警告。似乎只有一个自定义错误处理程序是唯一的解决方案。

这已在中修复,但在此期间,您可以执行类似的操作(尽管我确信存在其他解决方案)以确保抛出异常。注意,我没有取消警告-尽管如果需要,可以使用
if(!@$stmt->bind_param…{


我想你想要的是
mysqli\u report(mysqli\u report\u STRICT)
。不,对不起,这不是答案你是对的!根据文档
mysqli\u report\u STRICT
应该“,这里的情况似乎不是这样。我试过了,也得到了一个警告。嗯……我实际上在使用PHP7.1。也许他们还没有解决这个问题。你是对的,我做了错误的测试。所以,是的,自定义错误处理程序是唯一的解决方案
protected function Bind(mysqli $db, mysqli_stmt $stmt, array $data): void {
    // bind_param can fail and will only generate warning, defect fixed in PHP 8 https://bugs.php.net/bug.php?id=75813
    if (!$stmt->bind_param(str_repeat('s', count($data)), ... $data)) {
        // if bind_param has failed but no db error is set, let this continue and it will trigger exception in Execute
        if ($db->errno) {
            throw new mysqli_sql_exception($db->error);
        }
    }
}