这是什么?

这是一些关于在编程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中是什么意思?


当前回答

MySQL:你的SQL语法有错误;检查手册,对应于您的MySQL服务器版本的正确语法使用近…排队……

这个错误通常是因为您忘记正确转义传递给MySQL查询的数据。

一个不应该做的事情(“坏主意”)的例子:

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

这段代码可以包含在一个表单提交的页面中,URL为http://example.com/edit.php?id=10(编辑帖子n°10)

如果提交的文本包含单引号会发生什么?$query将以:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

当这个查询被发送到MySQL时,它会抱怨语法错误,因为中间有一个额外的单引号。

为了避免这样的错误,在查询中使用数据之前,必须始终转义数据。

在SQL查询中使用数据之前转义数据也是非常重要的,因为如果您不这样做,您的脚本将对SQL注入开放。SQL注入可能导致记录、表或整个数据库的更改、丢失或修改。这是一个非常严重的安全问题!

文档:

如何防止PHP中的SQL注入? mysql_real_escape_string () mysqli_real_escape_string () 如何从“Bobby表”XKCD漫画的SQL注入工作? 绕过mysql_real_escape_string()的SQL注入

其他回答

致命错误:[TraitA]和[TraitB]在[ClassC]组合中定义相同的属性([$x])

当类试图使用多个trait时发生,其中两个或多个trait定义了同名的属性,且属性具有不同的初始值。

例子:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

问题:虽然可以解决相互竞争的方法之间的冲突,但目前没有语法可以解决两个相互竞争的属性之间的冲突。此时唯一的解决方案是重构;也就是说,避免属性名之间产生致命错误的冲突。


相关问题:

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代码的某些部分被输出

解析错误:语法错误,意外的T_XXX

当你在意想不到的地方有T_XXX令牌,不平衡的(多余的)括号,在php.ini中使用短标记而没有激活它,以及更多情况时发生。

相关问题:

参考:PHP语法错误;以及如何解决这些问题? 解析错误:语法错误:意外的“{” 解析错误:语法错误,在我的PHP代码文件意外结束 解析错误:语法错误,意外的“<”-修复? 解析错误:语法错误,意外的'?'

如需进一步帮助,请参阅:

http://phpcodechecker.com/ -它确实为你的语法问题提供了一些更有用的解释。

警告: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结果资源作为参数将出于同样的原因产生相同的错误。

警告:open_basedir限制生效

此警告可以与与文件和目录访问相关的各种函数一起出现。它警告一个配置问题。

当它出现时,这意味着已禁止访问某些文件。

警告本身不会破坏任何东西,但如果文件访问被阻止,脚本通常无法正常工作。

修复方法通常是更改PHP配置,相关设置称为open_basedir。

有时使用了错误的文件或目录名称,解决方法是使用正确的名称。

相关问题:

Open_basedir限制生效。文件(/)不在允许路径内: 所有PHP的“警告:open_basedir限制在有效”的查询在Stackoverflow