参考 - 这个错误在 PHP 中是什么意思?
这是什么?
这是一些有关您在编写 PHP 程序时可能会遇到的警告、错误和通知的答案,但不知道如何修复它们。这也是一个社区 Wiki,因此欢迎所有人参与添加和维护此列表。
为什么会这样?
像 “标头已发送” 或 “调用非对象的成员” 这样的问题经常出现在 Stack Overflow 上。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复它们,然后向 OP 展示在特定情况下需要更改哪一行。这些答案不会给网站增加任何价值,因为它们仅适用于 OP 的特定代码。遇到相同错误的其他用户无法轻松从中读出解决方案,因为它们太本地化了。这很可悲,因为一旦你理解了根本原因,修复错误就很简单了。因此,此列表尝试以通用的方式解释解决方案。
我应该怎么做?
如果您的问题被标记为此问题的重复,请在下面找到您的错误消息并将修复应用于您的代码。答案通常包含进一步的链接以供调查,以防仅从一般答案中不清楚。
如果您想做出贡献,请添加您“最喜欢的”错误消息、警告或通知,每个答案一个,简短描述其含义(即使它只是突出显示其手册页中的术语),可能的解决方案或调试方法以及有价值的现有问答列表。此外,请随意改进任何现有答案。
列表
- 什么都看不到。页面空白且呈白色。 (也称为 白页/死机屏幕 )
- 代码无法运行/输出的是我的 PHP 代码的某些部分
- 警告:无法修改标头信息 - 标头已发送
-
警告:mysql_fetch_array() 要求参数 1 为资源,布尔值已给出
又名
警告:mysql_fetch_array():提供的参数不是有效的 MySQL 结果资源 - 警告: [function] 要求参数 1 为资源,给定布尔值
- 警告: [function] :无法打开流: [reason]
- 警告:open_basedir 限制生效
- 警告:除以零
- 警告:非法字符串偏移量“XXX”
- 警告:count():参数必须是数组或实现 Countable 的对象
- 解析错误:语法错误,意外的 '['
- 解析错误:语法错误,意外的 T_XXX
- 解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE
- 解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM
- 解析错误:语法错误,意外的“require_once”(T_REQUIRE_ONCE),预期函数(T_FUNCTION)
- 解析错误:语法错误,意外的 T_VARIABLE
- 致命错误:允许的内存大小 XXX 字节已耗尽(试图分配 XXX 字节)
- 致命错误:超出最大执行时间 XX 秒
- 致命错误:在...上调用成员函数非对象或 null
- 致命错误:调用未定义的函数 XXX
- 致命错误:无法重新声明 XXX
- 致命错误:无法在写入上下文中使用函数返回值
- 致命错误:AAA::BBB() 的声明必须与 CCC::BBB() 的声明兼容 '
- AAA::BBB() 的返回类型应与以下类型兼容应使用 CCC::BBB() 或 #[\ReturnTypeWillChange] 属性
- 致命错误:在不在对象上下文中使用 $this
- 另请参阅:
警告:无法修改标头信息 - 标头已发送
当您的脚本尝试将 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 指令来选择您自己的日志文件位置。
查看日志或使用显示,您将获得更好的错误消息和脚本停止的代码行。
相关问题:
- PHP 的白屏死机
- 白屏死机!
- PHP 不显示错误消息
- PHP 出现错误时发出 500 - 在哪里记录了此信息?
- 如何在 PHP 中获取有用的错误消息?
- Stackoverflow 上的所有 PHP“White Page of Death”问题
相关错误: