这是关于编程 PHP 时可能遇到的警告,错误和通知的一些答案,并且不知道如何修复。这也是社区 Wiki,因此邀请每个人参与添加和维护此列表。
Stack Overflow 上经常弹出诸如“已发送标头”或“调用非对象成员” 之类的问题 。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复,然后显示 OP 在他 / 她的特定情况下要改变哪一行。这些答案不会为网站添加任何价值,因为它们仅适用于 OP 的特定代码。具有相同错误的其他用户不能轻易地从中读取解决方案,因为它们过于本地化。这很难过,因为一旦你理解了根本原因,修复错误是微不足道的。因此,该列表试图以一般的方式解释解决方案。
如果您的问题已被标记为重复,请在下面找到您的错误消息并将修复程序应用于您的代码。答案通常包含进一步调查的链接,以防单独的一般答案不清楚。
如果您想贡献,请添加您的 “收藏” 错误消息,警告或通知,每个答案一个,简短说明它意味着什么(即使它只是突出显示其手册页的术语),可能的解决方案或调试方法和现有问答的清单。此外,随时改善任何现有的答案。
Also, see
当您的脚本尝试将 HTTP 标头发送到客户端但之前已经输出时,会发生这种情况,这导致标头已经发送到客户端。
这是一个E_WARNING
,它不会停止脚本。
一个典型的例子是这样的模板文件:
<html>
<?php session_start(); ?>
<head><title>My Page</title>
</html>
...
session_start()
函数将尝试将带有会话 cookie 的标头发送到客户端。但 PHP 在将<html>
元素写入输出流时已经发送了标头。您必须将session_start()
移动到顶部。
您可以通过在代码触发警告之前浏览行来解决这个问题,并检查它输出的位置。在该代码之前移动任何标题发送代码。
一个经常被忽视的输出是 PHP 关闭后的新行?>
。当它是文件中的最后一件事时,省略?>
被认为是标准做法。同样,此警告的另一个常见原因是当开头<?php
在其前面有一个空的空格,行或不可见字符时,导致 Web 服务器发送标题和空白 / 换行因此当 PHP 开始解析时将不会能够提交任何标题。
如果您的文件中包含多个<?php ... ?>
代码块,则它们之间不应有任何空格。 (注意:如果你有自动构造的代码,你可能有多个块)
还要确保代码中没有任何字节顺序标记,例如,当脚本的编码为带有 BOM 的 UTF-8 时。
相关问题:
发生类似于xyz->method()
代码,其中xyz
不是对象,因此无法调用该method
。
这是一个致命错误,它将停止脚本(向前兼容性通知:从 PHP 7 开始它将成为一个可捕获的错误)。
大多数情况下,这表示代码缺少对错误条件的检查。在调用其方法之前验证对象实际上是对象。
一个典型的例子是
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
在上面的示例中,无法准备查询, prepare()
将为$statement
指定false
。尝试调用execute()
方法将导致致命错误,因为false
是 “非对象”,因为该值是布尔值。
弄清楚为什么你的函数返回一个布尔值而不是一个对象。例如,检查$pdo
对象以查找发生的最后一个错误。有关如何调试此问题的详细信息将取决于如何处理有问题的特定函数 / 对象 / 类的错误。
如果即使->prepare
失败,那么你的$pdo
数据库句柄对象也没有传递到当前作用域 。找到它定义的位置。然后将其作为参数传递,将其存储为属性,或通过全局范围共享它。
另一个问题可能是有条件地创建一个对象,然后尝试调用该条件块之外的方法。例如
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
通过尝试在条件块外部执行方法,可能无法定义您的对象。
相关问题:
也被称为白页死亡或白色死亡屏幕 。当关闭错误报告并发生致命错误(通常是语法错误)时会发生这种情况。
如果启用了错误日志记录,您将在错误日志中找到具体的错误消息。这通常位于名为 “php_errors.log” 的文件中,位于中心位置(例如,许多 Linux 环境中的/var/log/apache2
)或脚本本身的目录(有时在共享托管环境中使用)。
有时,暂时启用错误显示可能更为直接。然后白页将显示错误消息。请小心,因为访问该网站的每个人都可以看到这些错误。
这可以通过在脚本顶部添加以下 PHP 代码来轻松完成:
ini_set('display_errors', 1); error_reporting(~0);
代码将打开错误显示并将报告设置为最高级别。
由于ini_set()
在运行时执行,因此它对解析 / 语法错误没有影响。这些错误将出现在日志中。如果要在输出中显示它们(例如在浏览器中),则必须将display_startup_errors
指令设置为true
。在php.ini
或.htaccess
执行此操作,或者在运行时之前影响配置的任何其他方法执行此操作 。
您可以使用相同的方法设置log_errors和error_log指令以选择您自己的日志文件位置。
查看日志或使用显示,您将获得更好的错误消息和脚本停止的代码行。
相关问题:
相关错误: