引用-这个错误在PHP中是什么意思?

2024-03-28 19:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这是什么?

这是许多关于在编写PHP时可能遇到的警告、错误和注意事项的答案,但不知道如何修复它们。这也是一个社区Wiki,因此每个人都被邀请参与添加和维护此列表。

这是为什么?

"Headers already sent""Calling a member of a non-object"这样的问题经常在堆栈溢出时弹出。这些问题的根源总是一样的。因此,这些问题的答案通常会重复它们,然后显示OP在特定情况下要更改哪一行。这些答案不会给网站增加任何价值,因为它们只适用于操作系统的特定代码。具有相同错误的其他用户无法轻松地从中读取解决方案,因为它们太本地化了。这很可悲,因为一旦你了解了根本原因,修复错误就微不足道了。因此,这个列表试图用一种通用的方式来解释解决方案。

我应该在这里做什么?

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

如果您想参与,请添加您“最喜欢”的错误消息、警告或通知、每个答案一条、简短的说明(即使只是在手册页中突出显示术语)、可能的解决方案或调试方法以及有价值的现有Q&a列表。另外,请随时改进任何现有的答案。

名单

另外,请参见:


Tags: ofto答案stringparse错误functionerror
3条回答

什么都没看见。这一页是空的和白色的。

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

如果启用了错误日志记录,则会在错误日志中找到具体的错误消息。这通常位于名为“php_errors.log”的文件中,或者位于中心位置(例如许多Linux环境中的/var/log/apache2),或者位于脚本本身的目录中(有时在共享宿主环境中使用)。

有时,临时启用错误显示可能更简单。然后,白色页面将显示错误消息。小心,因为这些错误对每个访问网站的人都是可见的。

这可以通过在脚本顶部添加以下PHP代码来轻松完成:

ini_set('display_errors', 1); error_reporting(~0);

代码将打开错误显示并将报告设置为最高级别。

因为^{}是在运行时执行的,所以它对解析/语法错误没有影响。这些错误将出现在日志中。如果还想在输出中显示它们(例如在浏览器中),则必须将^{}指令设置为true。在php.ini.htaccessany other method that affects the configuration before runtime中执行此操作。

您可以使用相同的方法设置log_errorserror_log指令来选择您自己的日志文件位置。

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

相关问题:

相关错误:

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

当脚本尝试将HTTP头发送到客户端但之前已经有输出时发生,这导致头已发送到客户端。

这是一个^{},它不会停止脚本。

典型的例子是这样的模板文件:

<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开始,它将成为一个可捕获的错误)。

通常这是代码缺少错误条件检查的迹象。在调用对象的方法之前,请验证该对象实际上是一个对象。

一个typical的例子是

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

在上面的示例中,无法准备查询,prepare()将把false分配给$statement。尝试调用execute()方法将导致致命错误,因为false是“非对象”,因为该值是布尔值。

找出为什么函数返回的是布尔值而不是对象。例如,检查$pdo对象以查找最后发生的错误。有关如何调试的详细信息将取决于如何处理有关特定函数/对象/类的错误。

如果连->prepare都失败了,那么$pdo数据库句柄对象didn't get passed into the current scope。找到它的定义。然后将其作为参数传递、存储为属性或通过全局范围共享。

另一个问题可能是有条件地创建一个对象,然后试图在该条件块之外调用一个方法。例如

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

如果试图在条件块外执行方法,则可能无法定义对象。

相关问题:

相关问题 更多 >