我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。

很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?

是否有一种方法可以让PHP像Java那样产生有用的错误消息?


当前回答

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

其他回答

对于那些使用nginx并且即使文件<?PHP echo 123;在我的情况下,我在nginx配置文件中没有这个必要的PHP选项:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_params文件中没有这个选项,所以PHP不起作用,日志中也没有任何错误。

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

此外,使用xdebug可以获得更详细的信息。

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

除了这里所有精彩的答案,我还想特别提一下MySQLi和PDO库。

为了……

总是看到数据库相关的错误,和 避免检查方法的返回类型以查看是否出现了错误

最好的选择是将库配置为抛出异常。

MySQLi

将此添加到脚本顶部附近

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

最好放在使用新的mysqli()或mysqli_connect()之前。

PDO

在连接实例上将PDO::ATTR_ERRMODE属性设置为PDO::ERRMODE_EXCEPTION。你可以在构造函数中这样做

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

或者在创造之后

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

打开错误报告是正确的解决方案,但是它似乎不会在打开它的程序中生效,而只会在随后包含的程序中生效。

因此,我总是创建一个文件/程序(我通常称之为“genwrap.php”),它的代码本质上与这里流行的解决方案相同。打开错误报告),然后它还包括我实际想要调用的页面。

实现这个调试有两个步骤;

首先,创建genwrap.php,然后把下面的代码放进去:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

第二,将你想要调试的程序/页面的链接改为通过genwrap.php,

例如:改变:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

to

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */