3

如果您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的调用。但是,可能是因为这是一个警告,所以or中没有数据。因此,我不清楚在哪里可以找到该消息的文本。有任何想法吗?mysqli_stmt->bind_paramsFALSEmysqli->errormysqli_stmt->error

谢谢。

4

2 回答 2

0

尽管您的意图是正确的,但它的措辞很糟糕(这会带来一些错误的答案)并且 - 严格来说 - 与 mysqli 错误无关,而是与所有 PHP 错误一般。

有办法做到这一点

禁止自动显示警告

这个很简单。

display_errors = 0

inphp.ini会将所有 PHP 错误从屏幕上移除。

抓住警告信息并按照我自己的方式显示

您实际上不需要以您自己的方式显示此特定错误,而是显示一个通用的 500 错误页面。有很多方法可以做到这一点。最简单的方法之一是定义一个自定义错误处理程序,它将拦截所有错误并显示您想要的任何文本。只是不要忘记两件重要的事情:

  • 记录错误消息
  • 发送 500 HTTP 标头

但是,更好的方法是让 HTTP 服务器为这样的页面提供服务。它甚至可以正确处理解析错误。

于 2013-08-23T18:14:12.943 回答
0

只要您拥有 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
}

编辑:

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

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

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,看这里。例如,您收到的警告将$errno是 2。

于 2013-08-23T18:53:23.273 回答