这个错误在PHP中意味着什么?
这是什么?
这是关于在编程PHP时可能遇到的警告,错误和通知的一些答案,并且不知道如何解决。 这也是一个社区Wiki,所以每个人都被邀请参与添加和维护这个列表。
为什么是这样?
诸如“头文件已发送”或“调用非对象成员”等问题经常在堆栈溢出时弹出。 这些问题的根本原因总是相同的。 所以这些问题的答案通常会重复它们,然后显示OP在他/她的特定情况下要改变哪条线。 这些答案不会给网站增加任何价值,因为它们只适用于OP的特定代码。 具有相同错误的其他用户不能轻易地从中读取解决方案,因为它们太本地化。 这很令人伤心,因为一旦你明白了根本原因,纠正错误就很简单。 因此,这份清单试图以通用的方式解释解决方案。
我应该在这里做什么?
如果您的问题已被标记为与此相同,请在下面找到您的错误消息并将修复应用到您的代码。 答案通常包含进一步的调查链接,以防单独从一般答案中不清楚。
如果您想贡献,请添加您的“最喜欢的”错误消息,警告或通知,每个答案一个,简短描述它的含义(即使它只是突出显示手册页中的术语),可能的解决方案或调试方法和一份有价值的现有问答清单。 此外,请随时改进任何现有答案。
列表
警告:mysql_fetch_array():提供的参数不是有效的MySQL结果资源aka
警告:mysqli_num_rows()期望参数1为mysqli_result,给定的布尔值(或类似的变体)
另见
警告:不能修改标题信息 - 已经发送的标题
脚本尝试向客户端发送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()
会将false
赋给$statement
。 试图调用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指令来选择您自己的日志文件位置。
查看日志或使用显示器,您将获得更好的错误消息以及脚本停止的代码行。
相关问题:
相关错误: