开发者问题收集

参考 - 这个错误在 PHP 中是什么意思?

2012-10-07
281095

这是什么?

这是一些有关您在编写 PHP 程序时可能会遇到的警告、错误和通知的答案,但不知道如何修复它们。这也是一个社区 Wiki,因此欢迎所有人参与添加和维护此列表。

为什么会这样?

“标头已发送” “调用非对象的成员” 这样的问题经常出现在 Stack Overflow 上。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复它们,然后向 OP 展示在特定情况下需要更改哪一行。这些答案不会给网站增加任何价值,因为它们仅适用于 OP 的特定代码。遇到相同错误的其他用户无法轻松从中读出解决方案,因为它们太本地化了。这很可悲,因为一旦你理解了根本原因,修复错误就很简单了。因此,此列表尝试以通用的方式解释解决方案。

我应该怎么做?

如果您的问题被标记为此问题的重复,请在下面找到您的错误消息并将修复应用于您的代码。答案通常包含进一步的链接以供调查,以防仅从一般答案中不清楚。

如果您想做出贡献,请添加您“最喜欢的”错误消息、警告或通知,每个答案一个,简短描述其含义(即使它只是突出显示其手册页中的术语),可能的解决方案或调试方法以及有价值的现有问答列表。此外,请随意改进任何现有答案。

列表

3个回答

警告:无法修改标头信息 - 标头已发送

当您的脚本尝试将 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 时。

相关问题:

2012-10-07

致命错误:在非对象上调用成员函数...

发生在类似于 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();

通过尝试在条件块之外执行方法,您的对象可能未定义。

相关问题:

2012-10-07

什么都看不到。页面是空白的。

也称为 死机白页 死机白屏 。当错误报告功能关闭并且发生致命错误(通常是语法错误)时,就会发生这种情况。

如果您启用了错误日志记录,您将在错误日志中找到具体的错误消息。这通常位于名为“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 指令来选择您自己的日志文件位置。

查看日志或使用显示,您将获得更好的错误消息和脚本停止的代码行。

相关问题:

相关错误:

2012-10-07