【问题标题】:Can't catch MySQLi exception if bind_param() has mismatch如果 bind_param() 不匹配,则无法捕获 MySQLi 异常
【发布时间】:2018-01-02 03:53:42
【问题描述】:

因此,如果我在创建连接之前输入mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),我希望它以异常的形式报告所有错误,它似乎确实如此。但是,由于某种原因,我收到了错误警告 如果bind_param() 中的绑定变量或类型不匹配,显然无法捕捉到。如果我使用太少或太多的变量来绑定,我会收到一条示例消息。

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

这是mysqli_sql_exception 的错误吗?我可以明显地压制警告,但这似乎有点骇人听闻。另一方面,如果我这样做@,无论如何我仍然会收到一条有意义的消息。

没有为准备好的语句中的参数提供数据

不过,如果可能的话,我宁愿不这样做,但这似乎是唯一的方法,除非我完全错过了一些东西。我很惊讶我在任何地方都找不到有关此的任何信息。我想我可以用set_error_handler() 做点什么,但老实说,我认为在这种情况下抑制警告是更好的选择。

【问题讨论】:

  • 我在想你想要的是mysqli_report(MYSQLI_REPORT_STRICT)
  • 不,抱歉,这不是答案
  • 你是对的!根据文档MYSQLI_REPORT_STRICT 应该是“Throw mysqli_sql_exception for errors instead of warnings”,看来这里不是这种情况。我试过了,我也收到了警告。

标签: php mysqli


【解决方案1】:

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

【讨论】:

  • 嗯..我实际上使用的是 PHP 7.1。也许他们还没有解决这个问题。
  • 你是对的,我做错了测试。所以是的,自定义错误处理程序是唯一的解决方案
【解决方案2】:

这已在PHP 8.0.0 中修复 - 但与此同时,您可以执行类似的操作(尽管我确信存在其他解决方案)以确保引发异常。请注意,我没有取消警告 - 尽管您可以根据需要使用 if (!@$stmt->bind_param...) {

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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2019-03-13
    • 2021-10-09
    相关资源
    最近更新 更多