如何在不同的环境中获取mysqli错误?

在我的LOCAL / DEV环境中,mysqli查询正在执行OK 。 但是,当我在我的WEBHOST环境上传它,我得到这个错误;

致命错误:调用一个非对象的成员函数bind_param()…

这里是代码:

global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc); 

要检查我的查询,我试图通过控制面板phpmyadmin执行查询,结果是OK

如果有任何信息不足,请告诉我,以便我可以立即提供。

首先,在你所有的环境中,mysqli连接之前总是有这个行:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

之后,所有的mysql错误将被转移到PHP例外。 未捕获的exception又会导致PHP致命错误。 因此,如果出现mysql错误,您将得到一个传统的PHP错误,这将立即让您意识到错误原因。 堆栈跟踪将引导您到发生错误的确切位置。

请注意,您必须能够看到一般的PHP错误 。 这里确实涉及到不同的环境问题:

  • 在一个现场,你必须偷看到错误日志,所以,设置必须是

     error_reporting(E_ALL); ini_set('display_errors',0); ini_set('log_errors',1); 
  • 而在本地开发服务器上可以在屏幕上显示错误:

     error_reporting(E_ALL); ini_set('display_errors',1); 

还有一些你不应该做的事情:

  • 使用错误抑制运算符( @
  • 使用die()echo或其他函数无条件地在屏幕上打印错误消息。 PHP已经可以回显了,不需要任何帮助。
  • 手动testing查询结果(如if($result) ),这是没有意义的。 要么你的查询失败,你已经得到了错误的例外,或者是没事的,没有什么可以testing的
  • 使用try..catch来回显错误信息。 再次,PHP可以做的更好,更好。