这是什么?

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


当前回答

HTTP错误500 -内部服务器错误

HTTP状态代码500和典型的Apache或浏览器警告是一个非常广泛的消息。这不是实际的错误。要弄清楚是web服务器配置错误(.htaccess)还是PHP致命错误,你必须查看error.log。

你通常可以在下面找到webservers日志:

/var/log/apache2 on Linux servers, often used for local and virtual hosts. /var/www/_user12345_/logs or similar on shared hosting plans. Usually there's a logs/ directory alongside each htdocs/ folder. C:\xampp\apache\logs\error.log for WAMP/XAMPP distributions of Apache+PHP. Alternatively just use a file search feature to locate anything called "error.log". Or look into your Apache httpd.conf and its ErrorLog directive. /var/log/nginx/nginx_error.log for NGINX. C:\inetpub\logs\LogFiles for IIS. Luckily this is uncommon still, but journalctl -r -u apache2.service could also hold parts of the log on Linux setups.

它是一个文本文件。搜索与错误时间最接近的条目,并使用错误消息的重要部分(从“PHP error:…”到“in line…”)进行进一步的google搜索。

[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message:PHP error: Unfiltered inputvariable $_JSON['pokestop_lng'] in filyfile.php on line 845

对于FPM设置,你经常会看到致命的PHP错误。而旧的mod_php(共享主机)配置经常混合警告和通知(通常也值得检查)。

如果没有配置为使用系统或Apache日志机制,您可能还需要查看PHP的error.log。一般来说,保留默认值并启用error_display + error_reporting来显示具体的错误会更简单。HTTP 500全捕获页面不过是PHP死机白屏幕的一个变种。

参见:

500内部服务器错误的php文件,而不是html 我怎么能让PHP显示错误,而不是给我500内部服务器错误 如何在IIS7上显示和记录PHP错误? 如何修复WordPress内部服务器的500个错误

其他回答

严格标准:非静态方法[<class>::<method>]不应该被静态调用

当您试图在类上调用静态的非静态方法时发生,并且您在error_reporting()设置中也有E_STRICT标志。

例子:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br()或$ HTML::br()

实际上,您可以通过不向error_reporting()添加E_STRICT来避免此错误,例如

error_reporting(E_ALL & ~E_STRICT);

因为对于PHP 5.4.0及以上版本,E_STRICT包含在E_ALL [ref]中。但这并不可取。解决方案是将你想要的静态函数定义为实际的静态函数:

public static function br() {
  echo '<br>';
}

或者按常规调用函数:

$html = new HTML();
$html->br();

相关问题:

我如何解决“非静态方法xxx:xxx()不应该在PHP 5.4中被静态调用?”

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

范围解析操作符也被称为“Paamayim Nekudotayim”,源自希伯来语פייםנקדיים”。意思是“双冒号”。

如果您无意中在代码中放入::,则通常会发生此错误。

相关问题:

参考:PHP语法错误;以及如何解决这些问题? PHP中两个冒号是什么意思? 在PHP中::(双冒号)和->(箭头)之间的区别是什么? 意外T_PAAMAYIM_NEKUDOTAYIM,期望T_NS_Separator

文档:

范围解析运算符(::)

致命错误:调用未定义的函数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

警告:[function]期望参数1是给定的布尔值

(一个更通用的警告:mysql_fetch_array()期望参数1是resource,给定布尔值)

资源是PHP中的一种类型(就像字符串、整数或对象一样)。资源是一个不透明的blob,本身没有固有的有意义的值。资源特定于一组PHP函数或扩展并由其定义。例如,Mysql扩展定义了两种资源类型:

MySQL模块中使用了两种资源类型。第一个是数据库连接的链接标识符,第二个是保存查询结果的资源。

cURL扩展定义了另外两种资源类型:

... 一个卷曲手柄和一个卷曲多手柄。

当var_dump时,这些值看起来像这样:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

这就是大多数资源的全部,某种类型((curl))的数字标识符((1))。

您携带这些资源并将它们传递给不同的函数,这些资源对这些函数有一定的意义。通常,这些函数在后台分配特定的数据,而资源只是它们用来在内部跟踪这些数据的引用。


“…期望参数1为resource,给定布尔值”的错误通常是一个未检查的操作的结果,该操作应该创建一个资源,但却返回false。例如,fopen函数有这样的描述:

返回值 成功时返回文件指针资源,错误时返回FALSE。

因此在这段代码中,$fp要么是类型为(stream)的资源(x),要么为false:

$fp = fopen(...);

如果你没有检查fopen操作是否成功或失败,因此$fp是一个有效的资源还是假的,并将$fp传递给另一个期望资源的函数,你可能会得到上述错误:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

你总是需要错误检查函数的返回值,这些函数试图分配资源,可能会失败:

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

相关的错误:

警告:mysql_fetch_array()期望参数1是resource, boolean给定

警告:除以零

警告信息“除零”是新PHP开发人员最常被问到的问题之一。此错误不会导致异常,因此,一些开发人员偶尔会通过在表达式之前添加错误抑制操作符@来抑制警告。例如:

$value = @(2 / 0);

但是,就像任何警告一样,最好的方法是追踪警告的原因并解决它。警告的原因将来自任何实例,其中你试图除以0,一个变量等于0,或一个变量没有被分配(因为NULL == 0),因为结果将是'undefined'。

要纠正此警告,您应该重写表达式以检查值是否为0,如果为0,则执行其他操作。如果值为0,要么不除法,要么将值改为1,然后再除法,这样除法的结果相当于只除以额外的变量。

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

相关问题:

警告:除以零 使用PHP和MySQL 在WordPress主题中除以零错误 如何抑制“除零”错误 如何用0求除法?