php - 从 mysqli bind_param 捕获警告信息

标签 php mysql mysqli prepared-statement

如果您使用错误数量的参数执行 mysqli_stmt->bind_params(...),您会在浏览器中收到以下警告:

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]:
Number of variables doesn't match number of parameters in prepared statement in ...

解决编码问题很容易,但我发现自己捕获该警告以控制它的显示方式并不容易(将来我可能会引发更多警告)。我想:

  • 禁止自动显示警告
  • 捕获警告消息并按照我自己的方式显示

简单地调用 @mysqli_stmt->bind_params(...) 似乎可以抑制显示的默认警告消息。这是最好的方法吗?

我似乎从 mysqli 获得的唯一信息是对 mysqli_stmt->bind_params 的调用返回 FALSE。然而,也许因为这是一个警告,mysqli->errormysqli_stmt->error 中没有数据。因此,我不清楚在哪里可以找到该消息的文本。有什么想法吗?

谢谢。

最佳答案

只要您有 PHP 5.3+,您要查找的方法就是 error_get_last - PHP docs .这是一个简单的例子:

$success = @$mysqli_stmt->bind_params(...)
if ( !$success ) {
    $einfo = error_get_last();
    $an_output_str = "Error of type (".$einfo['type']."): ".$einfo['message'];
    // $einfo['file'] and $einfo['line'] are also filled with useful info
}

编辑:

正如下面另一位先生所建议的那样,展望 future ,考虑一种更通用的警告/错误解决方案可能是明智的,这些警告/错误无法通过返回值和/或易于阅读的错误值设置来干净地处理.在这种情况下,您可能想要探索 set_error_handler,它在 PHP 4.01 中一直受到支持 - PHP Docs .

最基本的实现可能看起来像这样(模仿我之前写的):

function deal_with_error($errno,$errstr,$errfile,$errline) {
    $an_output_str = "Error of type (".$errno."): ".$errstr;
    // $errfile, $errline also have useful info
}

set_error_handler("deal_with_error");

关于$errno的不同取值,看看here .例如,您收到的警告的 $errno 为 2。

关于php - 从 mysqli bind_param 捕获警告信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409051/

相关文章:

php - 如何使用关系在 yii SQL 语句上创建别名?

Mysql - 通过查询更新表。重复 key 更新不起作用

php - 如果现有 mysql 数据重复或更多,如何编辑 "unique"

php - Laravel 9/Bootstrap - 在以下位置找不到 Vite list

javascript - 使用 ajax 中的值填充下拉列表

php - 如何使用多个表的数据格式化嵌套的json

php - 使用带有复选框和连接表的日期范围过滤数据

php - 如何在php mysql中实现反向ajax来获取数据库更新

mysql - 禁用mysql缓存

php - 看起来 SQL 的 WHERE 子句和 JOIN 不能一起工作