这是什么?
这是许多关于在编写PHP时可能遇到的警告、错误和注意事项的答案,但不知道如何修复它们。这也是一个社区Wiki,因此每个人都被邀请参与添加和维护此列表。
这是为什么?
像"Headers already sent"或"Calling a member of a non-object"这样的问题经常在堆栈溢出时弹出。这些问题的根源总是一样的。因此,这些问题的答案通常会重复它们,然后显示OP在特定情况下要更改哪一行。这些答案不会给网站增加任何价值,因为它们只适用于操作系统的特定代码。具有相同错误的其他用户无法轻松地从中读取解决方案,因为它们太本地化了。这很可悲,因为一旦你了解了根本原因,修复错误就微不足道了。因此,这个列表试图用一种通用的方式来解释解决方案。
我应该在这里做什么?
如果您的问题已标记为此问题的副本,请在下面找到错误消息,并对代码应用修复程序。答案通常包含进一步的调查链接,以防仅仅从一般答案中看不清楚。
如果您想参与,请添加您“最喜欢”的错误消息、警告或通知、每个答案一条、简短的说明(即使只是在手册页中突出显示术语)、可能的解决方案或调试方法以及有价值的现有Q&a列表。另外,请随时改进任何现有的答案。
名单
- Nothing is seen. The page is empty and white.(也称为死亡白页/屏幕)
- Code doesn't run/what looks like parts of my PHP code are output
- Warning: Cannot modify header information - headers already sent
- Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given又名
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource公元
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given(或类似变体) - Warning: [function] expects parameter 1 to be resource, boolean given
- Warning: [function]: failed to open stream: [reason]
- Warning: open_basedir restriction in effect
- Warning: Division by zero
- Warning: Illegal string offset 'XXX'
- Warning: count(): Parameter must be an array or an object that implements Countable
- Parse error: syntax error, unexpected '['
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
- Parse error: syntax error, unexpected 'require_once' (T_REQUIRE_ONCE), expecting function (T_FUNCTION)
- Parse error: syntax error, unexpected T_VARIABLE
- Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes)
- Fatal error: Call to a member function ... on a non-object or null
- Fatal Error: Call to Undefined function XXX
- Fatal Error: Cannot redeclare XXX
- Fatal error: Can't use function return value in write context
- Fatal error: Declaration of AAA::BBB() must be compatible with that of CCC::BBB()'
- Fatal error: Using $this when not in object context
- Fatal error: Object of class Closure could not be converted to string
- Fatal error: Undefined class constant
- Notice: Array to string conversion
- Notice: Trying to get property of non-object error
- Notice: Undefined variable or property
- Notice: Undefined Index
- Notice: Undefined offset XXX[参考]
- Notice: Uninitialized string offset: XXX
- Notice: Use of undefined constant XXX - assumed 'XXX'
- MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... at line ...
- Strict Standards: Non-static method [<class>::<method>] should not be called statically
- Warning: function expects parameter X to be boolean/string/integer
- HTTP Error 500 - Internal server error
- Deprecated: Array and string offset access syntax with curly braces is deprecated
另外,请参见:
Tags:
什么都没看见。这一页是空的和白色的。
也被称为死亡白页或死亡白屏。当错误报告关闭并且发生致命错误(通常是语法错误)时,就会发生这种情况。
如果启用了错误日志记录,则会在错误日志中找到具体的错误消息。这通常位于名为“php_errors.log”的文件中,或者位于中心位置(例如许多Linux环境中的
/var/log/apache2
),或者位于脚本本身的目录中(有时在共享宿主环境中使用)。有时,临时启用错误显示可能更简单。然后,白色页面将显示错误消息。小心,因为这些错误对每个访问网站的人都是可见的。
这可以通过在脚本顶部添加以下PHP代码来轻松完成:
代码将打开错误显示并将报告设置为最高级别。
因为^{} 是在运行时执行的,所以它对解析/语法错误没有影响。这些错误将出现在日志中。如果还想在输出中显示它们(例如在浏览器中),则必须将^{} 指令设置为
true
。在php.ini
或.htaccess
或any other method that affects the configuration before runtime中执行此操作。您可以使用相同的方法设置log_errors和error_log指令来选择您自己的日志文件位置。
查看日志或使用显示,您将得到更好的错误消息和脚本停止的代码行。
相关问题:
相关错误:
警告:无法修改标题信息-标题已发送
当脚本尝试将HTTP头发送到客户端但之前已经有输出时发生,这导致头已发送到客户端。
这是一个^{} ,它不会停止脚本。
典型的例子是这样的模板文件:
session_start()
函数将尝试将带有会话cookie的头发送到客户端。但是PHP在将<html>
元素写入输出流时已经发送了头。你得把session_start()
移到上面。您可以通过在触发警告的代码之前遍历行并检查其输出位置来解决这个问题。在该代码之前移动任何发送头代码。
一个经常被忽略的输出是PHP关闭后的新行
?>
。当?>
是文件中的最后一项内容时,省略它被认为是一种标准做法。同样,此警告的另一个常见原因是,当开头的<?php
前面有空格、行或不可见字符时,导致web服务器发送头和空白/换行符,因此当PHP开始解析时将无法提交任何头。如果文件中有多个
<?php ... ?>
代码块,则它们之间不应该有任何空格。(注意:如果有自动构造的代码,则可能有多个块)还要确保代码中没有任何字节顺序标记,例如脚本编码为带BOM的UTF-8时。
相关问题:
致命错误:调用成员函数。。。在非对象上
与
xyz->method()
类似的代码发生,其中xyz
不是对象,因此无法调用method
。这是一个致命错误,将停止脚本(转发兼容性注意:从PHP 7开始,它将成为一个可捕获的错误)。
通常这是代码缺少错误条件检查的迹象。在调用对象的方法之前,请验证该对象实际上是一个对象。
一个typical的例子是
在上面的示例中,无法准备查询,
prepare()
将把false
分配给$statement
。尝试调用execute()
方法将导致致命错误,因为false
是“非对象”,因为该值是布尔值。找出为什么函数返回的是布尔值而不是对象。例如,检查
$pdo
对象以查找最后发生的错误。有关如何调试的详细信息将取决于如何处理有关特定函数/对象/类的错误。如果连
->prepare
都失败了,那么$pdo
数据库句柄对象didn't get passed into the current scope。找到它的定义。然后将其作为参数传递、存储为属性或通过全局范围共享。另一个问题可能是有条件地创建一个对象,然后试图在该条件块之外调用一个方法。例如
如果试图在条件块外执行方法,则可能无法定义对象。
相关问题:
相关问题 更多 >
编程相关推荐