这是什么?

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


当前回答

警告:count():参数必须是数组或实现Countable的对象

不言而喻的;传递给count()函数的参数必须是可数的,通常是数组。

可能的问题是传递了一个标量值,如字符串或整数,或者对象没有实现Countable接口。在有问题的变量上使用var_dump()可以显示是否是这种情况。

其他回答

致命错误:调用未定义的函数XXX

在尝试调用尚未定义的函数时发生。常见的原因包括缺少扩展和包含,有条件的函数声明,函数声明中的函数或简单的拼写错误。

例1 -条件函数声明

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,fn()将永远不会被声明,因为$someCondition不为真。

例2 -函数声明中的函数

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,只有在调用createFn()时才声明fn。注意,后续调用createFn()将触发一个关于重新声明现有函数的错误。

在PHP内置函数中也可以看到这种情况。尝试在官方手册中搜索该函数,并检查它属于哪个“扩展”(PHP模块),以及哪些版本的PHP支持它。

如果缺少扩展,请安装该扩展并在php.ini中启用它。请参阅PHP手册中的安装说明,以了解函数在扩展中的显示。你也可以使用你的包管理器(例如Debian或Ubuntu中的apt, Red Hat或CentOS中的yum),或共享托管环境中的控制面板来启用或安装扩展。

如果该函数是在您正在使用的PHP的新版本中引入的,那么您可以在手册或评论部分中找到替代实现的链接。如果它已从PHP中删除,请查找有关原因的信息,因为可能不再需要它了。

如果缺少include,请确保在调用函数之前包含声明该函数的文件。

如果出现错别字,请改正错别字。

相关问题:

https://stackoverflow.com/search?q=Fatal+error%3A+Call+to+undefined+function

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注入

致命错误:超过XX秒的最大执行时间

每个PHP页面请求或脚本调用都度量PHP代码执行了多长时间。如果达到配置的限制,脚本将使用此消息中止。

注意,时间通常不包括发生在PHP“外部”的事情,例如等待数据库结果的时间,或使用shell_exec执行的外部程序等。例外情况是当PHP在Windows上运行时,测量的时间是“时钟时间”,并且确实包括这些外部等待时间。

常见的原因

无限循环。写错的while, do…while或for循环可能永远不会完成,这意味着PHP将永远持续运行。甚至foreach循环也可以是无限的,例如循环遍历一个Iterator对象或生成器函数。 庞大的数据集。即使您的循环不是无限的,如果它正在做很多工作,如果它正在处理大量的结果,它可能需要很长时间才能完成。

改变限制

如果你知道你有一个缓慢的过程,你可以配置时间限制:

在php.ini中,使用max_execution_time设置。 在脚本运行时,使用set_time_limit函数。注意,调用这个函数会将测量的时间重置为零,因此执行set_time_limit(10);意思是“再给10秒钟,不管脚本已经花了多长时间”。

这两种机制都应该给出一个秒数,或者特殊值0,表示“不限制”。设置“无限制”对于你真正想在后台永远运行的命令行脚本是最有用的;对于网页,最好设置一些有限值,即使它非常大,以防止代码中的错误导致整个系统失去响应。

解析错误:语法错误,意外的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语法错误;以及如何解决这些问题?

致命错误:无法重新声明类[类名]

致命错误:无法重新声明[函数名]

这意味着您要么使用了相同的函数/类名两次,并且需要重命名其中一个,要么是因为您在应该使用require_once或include_once的地方使用了require或include。

在PHP中声明类或函数时,它是不可变的,以后不能用新值声明。

考虑下面的代码:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index . php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

对do_stuff()的第二次调用将产生上述错误。通过将require更改为require_once,我们可以确定包含MyClass定义的文件将只被加载一次,并且可以避免错误。