这是什么?
这是一些关于在编程PHP时可能遇到的警告、错误和注意事项的答案,而不知道如何修复它们。这也是一个社区维基,所以每个人都被邀请加入和维护这个列表。
为什么会这样?
Questions like "Headers already sent" or "Calling a member of a non-object" pop up frequently on Stack Overflow. The root cause of those questions is always the same. So the answers to those questions typically repeat them and then show the OP which line to change in their particular case. These answers do not add any value to the site because they only apply to the OP's particular code. Other users having the same error cannot easily read the solution out of it because they are too localized. That is sad because once you understood the root cause, fixing the error is trivial. Hence, this list tries to explain the solution in a general way to apply.
我该怎么做呢?
如果您的问题被标记为此问题的副本,请在下面找到您的错误消息并将修复应用于您的代码。答案通常包含进一步的调查链接,以防仅从一般答案中不清楚。
如果您想投稿,请添加您“最喜欢的”错误消息、警告或通知,每个答案一条,简短描述它的含义(即使它只是突出显示手册页的术语),可能的解决方案或调试方法,以及现有的有价值的问答列表。此外,请随意改进任何现有的答案。
列表
Nothing is seen. The page is empty and white. (also known as White Page/Screen Of Death)
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 a.k.a.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
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: Maximum execution time of XX seconds exceeded
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()'
Return type of AAA::BBB() should either be compatible with CCC::BBB(), or the #[\ReturnTypeWillChange] attribute should be used
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
Fatal error: Uncaught TypeError: Argument #n must be of type x, y given
Notice: Array to string conversion (< PHP 8.0) or Warning: Array to string conversion (>= PHP 8.0)
Notice: Trying to get property of non-object error
Notice: Undefined variable or property
"Notice: Undefined Index", or "Warning: Undefined array key"
Notice: Undefined offset XXX [Reference]
Notice: Uninitialized string offset: XXX
Notice: Use of undefined constant XXX - assumed 'XXX' / Error: Undefined constant 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: Arrays and strings offset access syntax with curly braces is deprecated
还看到:
这个符号在PHP中是什么意思?
警告:数组到字符串的转换
注意:数组到字符串的转换
(PHP 7.4之前的一个通知,PHP 8.0之后的一个警告)
如果你试图将数组视为字符串,就会发生这种情况:
$arr = array('foo', 'bar');
echo $arr; // Notice: Array to string conversion
$str = 'Something, ' . $arr; // Notice: Array to string conversion
数组不能简单地与字符串回显或连接,因为结果没有很好地定义。PHP将使用字符串“Array”来代替数组,并触发通知,指出这可能不是预期的结果,您应该检查这里的代码。你可能想要这样的东西:
echo $arr[0]; // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar
或者循环数组:
foreach($arr as $key => $value) {
echo "array $key = $value";
// displays first: array 0 = foo
// displays next: array 1 = bar
}
如果这个通知出现在您意想不到的地方,这意味着您认为是字符串的变量实际上是一个数组。这意味着你的代码中有一个错误,使这个变量成为一个数组,而不是你期望的字符串。
解析错误:语法错误,意外的T_VARIABLE
可能的场景
我似乎找不到我的代码出了什么问题。以下是我的全部错误:
解析错误:语法错误,意外的T_VARIABLE在x行
我正在尝试的
$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';
回答
解析错误:程序的语法问题,例如在语句的末尾遗漏了分号,或者像上面的情况一样,遗漏了。操作符。解释器在遇到解析错误时停止运行程序。
简单地说,这是一个语法错误,这意味着您的代码中有一些东西阻止了它被正确解析,从而无法运行。
您应该做的是仔细检查错误所在的行周围是否有任何简单的错误。
该错误消息意味着,在文件的第x行,PHP解释器期望看到一个开括号,但相反,它遇到了名为T_VARIABLE的东西。T_VARIABLE这个东西叫做令牌。它是PHP解释器表达程序不同基本部分的方式。当解释器读入程序时,它将您所编写的内容转换为令牌列表。无论你在程序中放入一个变量,解释器的列表中都会有一个aT_VARIABLE令牌。
不错的阅读:解析器令牌列表
因此,请确保在php.ini中至少启用了E_PARSE。产品脚本中不应该存在解析错误。
我总是建议在编码时添加以下语句:
error_reporting(E_ALL);
PHP错误报告
另外,使用IDE是个好主意,它可以让你在输入时知道解析错误。你可以使用:
NetBeans(一个漂亮的免费软件)(在我看来是最好的)
PhpStorm(戈登叔叔喜欢这个:P,付费计划,包含专有和免费软件)
Eclipse(美女与野兽,免费软件)
相关问题:
参考:PHP语法错误;以及如何解决这些问题?
致命错误:允许的内存大小XXX字节已耗尽(已尝试分配XXX字节)
没有足够的内存来运行脚本。PHP已达到内存限制并停止执行。这个错误是致命的,脚本停止。内存限制的值可以在php.ini文件中配置,也可以使用ini_set('memory_limit', '128 M');在脚本中(将覆盖php.ini中定义的值)。内存限制的目的是防止一个PHP脚本占用所有可用内存,导致整个web服务器瘫痪。
The first thing to do is to minimise the amount of memory your script needs. For instance, if you're reading a large file into a variable or are fetching many records from a database and are storing them all in an array, that may use a lot of memory. Change your code to instead read the file line by line or fetch database records one at a time without storing them all in memory. This does require a bit of a conceptual awareness of what's going on behind the scenes and when data is stored in memory vs. elsewhere.
如果在脚本没有执行内存密集型工作时发生此错误,则需要检查代码以查看是否存在内存泄漏。memory_get_usage函数是您的朋友。
相关问题:
所有“Fatal error: Allowed memory size of XXX bytes exhausted”问题
警告:mysql_fetch_array()期望参数1是resource, boolean给定
首先,也是最重要的:
请不要在新代码中使用mysql_*函数。它们不再被维护,并且已被正式弃用。看到红框了吗?转而学习准备语句,并使用PDO或MySQLi——本文将帮助您选择哪一种。如果您选择PDO,这里有一个很好的教程。
当您试图从mysql_query的结果中获取数据但查询失败时,就会发生这种情况。
这是一个警告,不会停止脚本,但会使您的程序出错。
您需要检查mysql_query返回的结果by
$res = mysql_query($sql);
if (!$res) {
trigger_error(mysql_error(),E_USER_ERROR);
}
// after checking, do the fetch
相关问题:
Mysql_fetch_array()期望参数1是resource,在select中给出的布尔值
所有“mysql_fetch_array()期望参数1是资源,布尔给定”的问题
相关的错误:
警告:[function]期望参数1是给定的布尔值
其他mysql*函数也期望mysql结果资源作为参数将出于同样的原因产生相同的错误。
注意:未定义变量
在尝试使用以前未定义的变量时发生。
一个典型的例子是
foreach ($items as $item) {
// do something with item
$counter++;
}
如果您之前没有定义$counter,上面的代码将触发通知。
正确的方法是在使用变量之前设置它
$counter = 0;
foreach ($items as $item) {
// do something with item
$counter++;
}
类似地,变量在其作用域之外是不可访问的,例如在使用匿名函数时。
$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) {
// Prefix is undefined
return "${prefix} ${food}";
}, $food);
这应该使用use来传递
$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) use ($prefix) {
return "${prefix} ${food}";
}, $food);
注意:未定义的属性
此错误的含义大致相同,但指的是对象的属性。重用上面的示例,这段代码将触发错误,因为没有设置counter属性。
$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
// do something with item
$obj->counter++;
}
相关问题:
所有关于Stackoverflow的PHP“注意:未定义变量”问题
“注意:未定义的变量”,“注意:未定义的索引”,“注意:未定义的偏移量”使用PHP
参考:什么是变量作用域,哪些变量可以从哪里访问,什么是“未定义变量”错误?
什么也看不见。页面是空白的,白色的。
也被称为白页死亡或白屏幕死亡。当错误报告被关闭并且发生致命错误(通常是语法错误)时,就会发生这种情况。
如果启用了错误日志记录,您将在错误日志中找到具体的错误消息。这通常在一个名为“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指令来选择您自己的日志文件位置。
查看日志或使用显示,您将得到更好的错误消息和脚本停止的代码行。
相关问题:
PHP的白屏死机
白屏死机!
PHP不显示错误消息
PHP在错误时释放500 -在哪里有文档?
如何在PHP中获得有用的错误消息?
关于Stackoverflow的所有PHP“死亡白页”问题
相关的错误:
解析错误:语法错误,意外的T_XXX
致命错误:调用成员函数…在一个非物体上
代码不运行/我的PHP代码的某些部分被输出