这是什么?
这是许多关于警告、错误和您在编写PHP时可能遇到的注意事项的答案,并且不知道如何修复它们。这也是一个社区Wiki,所以每个人都被邀请加入和维护这个列表。
为什么会这样呢?
像“已发送的标题”或“调用非对象的成员”这样的问题经常出现在堆栈溢出上。这些问题的根源总是一样的。因此,这些问题的答案通常会重复这些问题,然后在特定情况下显示要更改的行。这些答案不会增加站点的任何价值,因为它们只适用于OP的特定代码。其他具有相同错误的用户无法轻松地从其中读取解决方案,因为他们太本地化了。这是可悲的,因为一旦您理解了根本原因,修复错误是微不足道的。因此,这个列表试图以一种通用的方式来解释解决方案。
我在这里该怎么办?
如果您的问题已被标记为此问题的副本,请在下面找到您的错误信息,并将修复程序应用于您的代码。答案通常包含进一步的链接,以调查,如果它不应该是明确的从一般的答案。
如果您想要投稿,请添加您的“最喜欢”错误消息、警告或通知,每个答案一条,简短的描述它的含义(即使它只是在手册页面突出显示术语),一个可能的解决方案或调试方法,以及一个有价值的现有问答列表。同时,也可以随意改进现有的答案。
名单
另见:
发布于 2012-10-07 15:21:03
警告:无法修改标题信息-已发送的标头
当脚本试图向客户端发送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 ... ?>代码块,则它们之间不应该有任何空格。(注意:如果有自动构造的代码,则可能有多个块)
还要确保您的代码中没有任何Byte Order标记,例如,当脚本的编码是带有BOM的UTF-8时。
相关问题:
发布于 2012-10-07 15:11:00
致命错误:调用成员函数..。在非物体上
发生在类似于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();通过尝试在条件块之外执行方法,您的对象可能不会被定义。
相关问题:
发布于 2012-10-07 21:06:14
什么都看不见。这一页又空又白。
也被称为死亡的白页或死亡的白色屏幕。当关闭错误报告并发生致命错误(通常是语法错误)时,就会发生这种情况。
如果启用了错误日志记录,您将在错误日志中找到具体的错误消息。这通常是在一个名为"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或运行时中这样做。
您可以使用相同的方法来设置错误和日志指令,以选择您自己的日志文件位置。
查看日志或使用显示,您将得到一个更好的错误消息和代码行,您的脚本将停止。
相关问题:
相关错误:
https://stackoverflow.com/questions/12769982
复制相似问题