参考 – 这个错误在PHP中意味着什么?

这是什么?

这是关于在编程PHP时可能遇到的警告,错误和通知的一些答案,并且不知道如何解决。 这也是一个社区Wiki,所以每个人都被邀请参与添加和维护这个列表。

为什么是这样?

诸如“Headers already sent”或“调用非对象的成员”之类的问题在Stack Overflow上经常popup。 这些问题的根本原因总是一样的。 所以这些问题的答案通常会重复,然后向他们展示OP在他/她的特定情况下要改变哪条线。 这些答案不增加任何价值的网站,因为他们只适用于OP的特定代码。 具有相同错误的其他用户不能轻易地从中读取解决scheme,因为它们太本地化。 这是可悲的,因为一旦你明白了根本原因,纠正错误是微不足道的。 因此,这个列表试图以一般的方式来解释解决scheme。

我应该在这里做什么?

如果您的问题已被标记为重复,请在下面find您的错误消息,并将修复应用到您的代码。 答案通常包含进一步的调查链接,以防单独从一般答案中不清楚。

如果你想贡献,请添加你的“最喜欢的”错误信息,警告或通知,每个答案一个,简短的描述是什么意思(即使它只是突出显示手册页的条款),一个可能的解决scheme或debugging方法和有价值的现有问答清单。 此外,随时提高任何现有的答案。

列表

  • 什么都看不到 该页面是空白的。 (也被称为白页/死亡屏幕
  • 代码不运行/看起来像我的PHP代码的部分输出
  • 警告:不能修改标题信息 – 已经发送的标题
  • 警告:mysql_fetch_array()期望参数1是资源,布尔给定 aka
    警告:mysql_fetch_array():提供的参数不是有效的MySQL结果资源 aka
    警告:mysqli_num_rows()期望参数1是mysqli_result,布尔给定 (或类似的变化)
  • 警告: [函数]期望参数1是资源,布尔给定
  • 警告: [function] :未能打开stream: [原因]
  • 警告:有效的open_basedir限制
  • 警告:除以零
  • 警告:非法string偏移“XXX”
  • parsing错误:语法错误,意外的'['
  • parsing错误:语法错误,意外的T_XXX
  • parsing错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE
  • parsing错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM
  • parsing错误:语法错误,意外的'require_once'(T_REQUIRE_ONCE),期待函数(T_FUNCTION)
  • parsing错误:语法错误,意外的T_VARIABLE
  • 致命错误:允许XXX字节的内存大小用尽(试图分配XXX字节)
  • 致命错误:调用一个非对象的成员函数
  • 致命错误:调用未定义的函数XXX
  • 致命错误:无法重新声明XXX
  • 致命错误:不能在写入上下文中使用函数返回值
  • 致命错误:AAA :: BBB()声明必须与CCC :: BBB() ' 声明兼容
  • 致命错误:当不在对象上下文中时使用$ this
  • 注意:数组到string的转换
  • 注意:试图获取非对象错误的属性
  • 注意:未定义的variables
  • 注意:未定义的索引
  • 注意:未定义偏移量XXX [参考]
  • 注意:未初始化的string偏移量:XXX
  • 注意:使用未定义的常量XXX – 假定为“XXX”
  • MySQL:你的SQL语法错误; 检查对应于您的MySQL服务器版本的手册,以便在…附近使用正确的语法…
  • 严格的标准:非静态方法[<class> :: <method>]不应被静态调用

另见

  • 参考 – 这个符号在PHP中意味着什么?

警告:不能修改标题信息 – 已经发送的标题

脚本尝试向客户端发送HTTP标头时发生,但之前已经输出,导致标头已经发送到客户端。

这是一个E_WARNING ,它不会停止脚本。

一个典型的例子是这样的模板文件:

 <html> <?php session_start(); ?> <head><title>My Page</title> </html> ... 

session_start()函数将尝试发送包含会话cookie的头文件给客户端。 但是,PHP在将<html>元素写入输出stream时已经发送了头文件。 你必须将session_start()移到顶端。

你可以通过遍历代码触发警告之前的行来解决这个问题,并检查它输出的位置。 在代码之前移动任何标题发送代码。

一个经常被忽视的输出是在PHPclosures之后的新行?> 。 当它是文件中的最后一个东西时,忽略?>被认为是一个标准的做法。 同样,这个警告的另一个常见原因是当开始的<?php在它之前有一个空的空格,行或不可见的字符时,导致web服务器发送头文件和空白/换行符,因此当PHP开始分析时将不能提交任何标题。

如果你的文件中有多个<?php ... ?>代码块,那么它们之间不应该有空格。 (注意:如果您的代码是自动构build的,则可能有多个块)

还要确保代码中没有任何字节顺序标记,例如脚本的编码是带有BOM的UTF-8时。

相关问题:

  • PHP已经发送了头文件
  • 所有的PHP“头已经发送”Stackoverflow的问题
  • 字节顺序标记
  • 什么PHP函数创build输出?

致命错误:调用一个非对象的成员函数

发生类似于xyz->method()代码,其中xyz不是对象,因此该method不能被调用。

这是一个致命的错误,将停止脚本(向前兼容性通知:它将成为一个PHP 7开始的可捕获错误)。

大多数情况下,这是代码缺less错误条件检查的信号。 在调用方法之前validation一个对象实际上是一个对象。

一个典型的例子是

 // ... some code using PDO $statement = $pdo->prepare('invalid query', ...); $statement->execute(...); 

在上面的例子中,查询不能被准备, prepare()会把false赋给$statement 。 试图调用execute()方法将导致致命错误,因为false是一个“非对象”,因为该值是一个布尔值。

找出你的函数为什么返回一个布尔值而不是一个对象。 例如,检查$pdo对象是否发生了最后一个错误。 有关如何debugging的详细信息将取决于如何处理有关特定function/对象/类的错误。

如果即使->prepare失败,那么你的$pdo数据库句柄对象也不会被传入当前的作用域 。 find它的定义。 然后将其作为parameter passing,将其作为属性存储,或通过全局范围共享。

相关问题:

  • 调用一个非对象的成员函数
  • 列出所有的PHP“致命的错误:调用一个非对象的成员函数…在Stackoverflow的问题

什么都看不到 该页面是空白的。

也被称为死亡白页死亡的 白色屏幕 。 发生错误报告时会发生这种情况,并发生致命错误(通常是语法错误)。

如果您启用了错误日志logging,则会在错误日志中find具体的错误消息。 这通常在一个名为“php_errors.log”的文件中,或者在一个中央位置(例如许多Linux环境中的/var/log/apache2 )或脚本本身的目录中(有时用于共享主机环境)。

有时候可能会更直接地暂时显示错误。 白页将显示错误信息。 小心,因为这些错误是每个访问该网站的人都可见的。

这可以通过在脚本的顶部添加以下PHP代码轻松完成:

 ini_set('display_errors', 1); error_reporting(~0); 

该代码将打开错误显示并将报告设置为最高级别。

由于ini_set()在运行时被执行,所以对parsing/语法错误没有影响。 这些错误将出现在日志中。 如果你想在输出中显示它们(例如在浏览器中),你必须将display_startup_errors指令设置为true 。 在php.ini.htaccess或者运行时影响configuration的任何其他方法执行此操作 。

您可以使用相同的方法来设置log_errors和error_log指令来select您自己的日志文件位置。

查看日志或使用显示器,你会得到一个更好的错误信息和你的脚本停止的代码行。

相关问题:

  • PHP的死亡白屏
  • 死亡的白色屏幕!
  • PHP不显示错误消息
  • 错误发布500的PHP – 这是在哪里logging?
  • 如何在PHP中获取有用的错误消息?
  • 所有PHP的“死亡白页”问题Stackoverflow

相关错误:

  • parsing错误:语法错误,意外的T_XXX
  • 致命错误:调用一个非对象的成员函数
  • 代码不运行/看起来像我的PHP代码的部分输出

注意:未定义的索引

当您尝试通过数组中不存在的键访问数组时,会发生这种情况。

Undefined Index通知的一个典型例子是( 演示 )

 $data = array('foo' => '42', 'bar'); echo $data['spinach']; echo $data[1]; 

spinach1都不存在于arrays中,导致E_NOTICE被触发。

解决scheme是确保索引或偏移量在访问该索引之前存在。 这可能意味着您需要修复程序中的错误,以确保这些索引在您期望的时候确实存在。 或者这可能意味着您需要使用array_key_existsisset来testing索引是否存在:

 $data = array('foo' => '42', 'bar'); if (array_key_exists('spinach', $data)) { echo $data['spinach']; } else { echo 'No key spinach in array'; } 

如果你有像这样的代码:

 <?php echo $_POST['message']; ?> <form method="post" action=""> <input type="text" name="message"> ... 

那么$_POST['message']在第一次加载这个页面时将不会被设置,你将会得到上面的错误。 只有在提交表单并且第二次运行此代码时,数组索引才存在。 你通常检查这个:

 if ($_POST) .. // if the $_POST array is not empty // or if ($_SERVER['REQUEST_METHOD'] == 'POST') .. // page was requested with POST 

相关问题:

  • 参考:“注意:未定义的variables”和“注意:未定义的索引”
  • 所有的PHP“注意:未定义索引”Stackoverflow的问题
  • http://php.net/arrays

警告:mysql_fetch_array()期望参数1是资源,布尔给定

首先和最重要的是:

请不要在新代码中使用mysql_*函数 。 他们不再维护,并正式弃用 。 看到红色的盒子 ? 了解准备好的语句 ,并使用PDO或MySQLi – 本文将帮助您决定哪些。 如果你selectPDO, 这里是一个很好的教程 。


当您尝试从mysql_query的结果中提取数据但是查询失败时,会发生这种情况。

这是一个警告,不会停止脚本,但会使你的程序错误。

你需要检查mysql_query by返回的结果

 $res = mysql_query($sql); if (!$res) { die(mysql_error()); } // after checking, do the fetch 

相关问题:

  • mysql_fetch_array()期望参数1是资源,布尔在select中给出
  • 所有“mysql_fetch_array()期望参数1是资源,布尔给予”问题在Stackoverflow

相关错误:

  • 警告: [函数]期望参数1是资源,布尔给定

其他的mysql*函数,也期望一个MySQL结果资源作为参数将产生相同的错误,同样的原因。

致命错误:当不在对象上下文中时使用$ this

$this是PHP中的一个特殊variables,不能被赋值。 如果在不存在的上下文中访问它,则给出这个致命错误。

这个错误可能会发生:

  1. 如果静态调用非静态方法。 例:

     class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar(); 

    如何解决:重新检查你的代码, $this只能在对象上下文中使用,不应该用在静态方法中。 另外,静态方法不应该访问非静态属性。 使用self::$static_property来访问静态属性。

  2. 如果一个类方法的代码已经被复制到一个普通的函数中,或者仅仅是全局的作用域, 并且保存$this特殊的variables。
    如何解决:查看代码并用另一个replacevariablesreplace$this

相关问题:

  1. 调用非静态方法为静态: PHP致命错误:当不在对象上下文中时使用$ this
  2. 复制代码: 致命错误:当不在对象上下文中时使用$ this
  3. 所有“当不在对象上下文中使用$ this”Stackoverflow的问题

parsing错误:语法错误,意外的T_XXX

当你在意想不到的地方有T_XXX标记 ,不平衡的(多余的)圆括号,使用短标记而不在php.ini中激活它,等等。

相关问题:

  • 参考: PHPparsing/语法错误; 以及如何解决它们?
  • parsing错误:语法错误:意外的'{'
  • parsing错误:语法错误,我的PHP代码中的文件意外结束
  • parsing错误:语法错误,意外的“<”in – 修复?
  • parsing错误:语法错误,意外的'?'

进一步的帮助请看:

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

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

示例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内置函数。 尝试在官方手册中search该function,并检查它所属的“扩展”(PHP模块),以及PHP支持哪些版本。

如果缺less扩展名,请安装该扩展名并在php.ini中启用。 您也可以使用您的软件包pipe理器(例如apt in Debian或Ubuntu, yum in Red Hat或CentOS)来启用或安装扩展程序。控制面板在共享主机环境中。

如果该函数是从您正在使用的PHP新版本中引入的,则可以在手册或其注释部分find指向其他实现的链接。 如果它已从PHP中删除,请查找有关原因的信息,因为它可能不再必要。

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

如有错别字,请修正错字。

相关问题:

致命错误:不能在写入上下文中使用函数返回值

这通常在直接使用empty函数时发生。

例:

 if (empty(is_null(null))) { echo 'empty'; } 

这是因为empty是一个语言结构而不是一个函数,在5.5之前的PHP版本中,它不能用一个expression式作为它的参数来调用。 在PHP 5.5之前, empty()的参数必须是一个variables ,但是一个任意的expression式(比如一个函数的返回值)在PHP 5.5+中是允许的。

empty ,尽pipe它的名字,实际上并不检查一个variables是否为“空”。 相反,它会检查一个variables是否不存在,或== false 。 expression式(就像例子中的is_null(null) )总是被认为是存在的,所以这里的empty只是检查是否等于false。 你可以用这里replaceempty() ! ,例如if (!is_null(null)) ,或者显式比较为false,例如if (is_null(null) == false)

相关问题:

  • 致命错误:不能使用函数的返回值

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

此错误通常是由于您忘记正确地转义传递给MySQL查询的数据而造成的。

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

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

这个代码可以被包含在一个页面中,并提交一个表单来提交,例如http://example.com/edit.php?id=10 (编辑postn°10)

如果提交的文字包含单引号,会发生什么? $query将最终与:

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

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

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

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

文档:

  • 我怎样才能防止在PHP中的SQL注入?
  • mysql_real_escape_string()
  • mysqli_real_escape_string()
  • 如何从“Bobby Tables”XKCD漫画工作SQL注入?
  • SQL注入绕过mysql_real_escape_string()

致命错误:允许内存大小为XXX字节耗尽(试图分配XXX字节)

没有足够的内存来运行脚本。 PHP已达到内存限制,并停止执行它。 这个错误是致命的,脚本停止。 内存限制的值可以在php.ini文件中configuration,也可以使用ini_set('memory_limit', '128 M'); 在脚本中(它将覆盖在php.ini定义的值)。 内存限制的目的是防止单个PHP脚本吞噬所有可用内存,并使整个Web服务器停机。

首先要做的是尽量减less脚本所需的内存量。 例如,如果你正在将一个大文件读入一个variables,或者从一个数据库中取出许多logging并将它们全部存储在一个数组中,那么这可能会占用大量的内存。 将代码更改为逐行读取文件,或者逐个读取数据库logging,而不将它们全部存储在内存中。 这确实需要一点概念性的意识,看看幕后发生了什么,以及数据何时存储在内存中而不是其他地方。

如果在脚本没有执行内存密集型工作时发生此错误,则需要检查代码以查看是否存在内存泄漏。 memory_get_usage函数是你的朋友。

相关问题:

  • 所有“致命错误:允许XXX字节的内存大小用尽”Stackoverflow的问题

parsing错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE

当整个复杂variables构造不包含在{}时,尝试引用带双引号string的带引号的键的数组值时,经常遇到此错误。

错误情况:

这将导致Unexpected T_ENCAPSED_AND_WHITESPACE

 echo "This is a double-quoted string with a quoted array key in $array['key']"; //---------------------------------------------------------------------^^^^^ 

可能的修复:

在双引号string中,PHP将允许使用引用的数组键string,并且不会发出E_NOTICE 。 所以上面可以写成:

 echo "This is a double-quoted string with an un-quoted array key in $array[key]"; //------------------------------------------------------------------------^^^^^ 

整个复杂数组variables和密钥可以用{}括起来,在这种情况下, 应该引用它们以避免E_NOTICE 。 PHP文档为复杂variables推荐了这个语法。

 echo "This is a double-quoted string with a quoted array key in {$array['key']}"; //--------------------------------------------------------------^^^^^^^^^^^^^^^ // Or a complex array property of an object: echo "This is aa double-quoted string with a complex {$object->property->array['key']}"; 

当然,上述任何一种方法的替代方法是连接数组variables,而不是插入它:

 echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside."; //----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^ 

有关参考,请参阅PHPstring手册页中的“ variables分析 ”部分

parsing错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM

范围parsing运算符也被称为“Paamayim Nekudotayim”来自希伯来语פעמייםנקודתיים。 意思是“双冒号”或“双点双击”。

这个错误通常会发生,如果你不经意间把::放在你的代码。

相关问题:

  • 参考: PHPparsing/语法错误; 以及如何解决它们?
  • 两个冒号在PHP中意味着什么?
  • PHP中的(双冒号)和 – >(箭头)有什么区别?
  • 意外的T_PAAMAYIM_NEKUDOTAYIM,期待T_NS_Separator

文档:

  • 范围分辨率运算符(::)

致命错误:无法重新声明class [class name]

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

这意味着您要么使用相同的函数/类名称两次,而需要重命名其中一个,或者是因为您已经使用requireinclude应该使用require_onceinclude_once

当在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定义的文件只会被加载一次,并且会避免错误。

注意:未定义的variables

当您尝试使用先前未定义的variables时会发生。

一个典型的例子是

 foreach ($items as $item) { // do something with item $counter++; } 

如果您之前没有定义$counter ,上面的代码将触发通知。

正确的方法是在使用它之前设置variables,即使它只是一个空string

 $counter = 0; foreach ($items as $item) { // do something with item $counter++; } 

相关问题:

  • 所有的PHP“注意:未定义的variables”Stackoverflow的问题
  • PHP:“注意:未定义的variables”,“注意:未定义的索引”和“注意:未定义的偏移量”
  • 参考:什么是variables作用域,哪些variables可以从哪里访问,什么是“未定义的variables”错误?

注意:使用未定义的常量XXX – 假定为“XXX”

在代码中使用标记时,会出现此通知,并且该标记看起来是常量,但未定义该名称的常量。

此通知最常见的原因之一是未能引用用作关联数组键的string。

例如:

 // Wrong echo $array[key]; // Right echo $array['key']; 

另一个常见原因是在variables名前面缺less$ (美元)符号:

 // Wrong echo varName; // Right echo $varName; 

当您尝试访问由该库定义的常量时,也可能表示缺less所需的PHP扩展或库。

相关问题:

  • PHP错误信息“注意:使用undefined常量”是什么意思?

警告: [function] :未能打开stream: [原因]

当你通常通过includerequirefopen调用一个文件,而PHP找不到这个文件,或者没有足够的权限来加载这个文件时,就会发生这种情况。

这可能是由于各种原因而发生的:

  • 文件path是错误的
  • 文件path是相对的
  • 包括path是错误的
  • 权限过于限制
  • SELinux生效
  • 还有很多 …

一个常见的错误是不使用绝对path。 这可以通过使用像__DIR__dirname(__FILE__)这样的完整path或魔术常量来轻松解决:

 include __DIR__ . '/inc/globals.inc.php'; 

要么:

 require dirname(__FILE__) . '/inc/globals.inc.php'; 

确保使用正确的path是解决这些问题的一个步骤,这也可能与不存在的文件,防止访问的文件系统权限或PHP本身打开的基于文件限制有关。

快速解决此问题的最佳方法是遵循下面的故障排除清单。

相关问题:

  • 疑难解答清单:未能打开stream

相关错误:

  • 警告:有效的open_basedir限制

警告:有效的open_basedir限制

此警告可能会出现与文件和目录访问相关的各种function。 它警告configuration问题。

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

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

修正通常是改变PHPconfiguration ,相关的设置叫做open_basedir

有时会使用错误的文件或目录名称,然后修复使用正确的文件或目录名称。

相关问题:

  • 有效的open_basedir限制。 文件(/)不在允许的path中:
  • 所有的PHP“警告:有效的open_basedir限制”在Stackoverflow Querstions

parsing错误:语法错误,意外的T_VARIABLE

可能的情况

我似乎无法find我的代码出错的地方。 这是我的完整错误:

parsing错误:语法错误,第x行出现意外的T_VARIABLE

我正在尝试

 $sql = 'SELECT * FROM dealer WHERE id="'$id.'"'; 

回答

parsing错误:你的程序的语法问题,比如在语句的末尾留下一个分号,或者像上面那样,丢失了. 运营商。 遇到parsing错误时,解释器停止运行程序。

简而言之,这是一个语法错误,这意味着代码中的某些内容会阻止它被正确parsing并因此正在运行。

你应该做的是仔细检查错误的地方,以防止任何简单的错误。

该错误消息意味着在文件的第x行中,PHP解释器希望看到一个T_VARIABLE括号,而是遇到了一个名为T_VARIABLE东西。 那T_VARIABLE被称为一个token 。 这是PHP解释器expression程序不同基本部分的方式。 当解释程序读入程序时,它会将您写入的内容转换为令牌列表。 无论你在程序中放置一个variables,解释器列表中都有一个T_VARIABLE标记。

阅读良好:parsing器令牌列表

所以请确保您至less在您的php.ini启用了E_PARSE 。 生产脚本中不应该存在parsing错误。

我始终build议在编码时添加以下语句:

 error_reporting(E_ALL); 

PHP错误报告

另外一个好主意,使用一个IDE,它会让你知道在input时parsing错误。 您可以使用:

  1. NetBeans (美好的自由软件)(在我看来是最好的)
  2. PhpStorm (舅舅Gordon喜欢这个:P,付费计划,包含专有和免费软件)
  3. Eclipse (美女与野兽,免费软件)

相关问题:

  • 参考: PHPparsing/语法错误; 以及如何解决它们?

注意:未初始化的string偏移: *

正如名字所指出的那样,这种types的错误发生在最有可能尝试迭代的时候,或者从一个不存在的键的数组中find一个值。

考虑一下你正在试图显示$string每一个字母

 $string = 'ABCD'; for ($i=0, $len = strlen($string); $i <= $len; $i++){ echo "$string[$i] \n"; } 

上面的例子会生成( 在线演示 ):

 A B C D Notice: Uninitialized string offset: 4 in XXX on line X 

而且,只要脚本完成回显D ,就会得到这个错误,因为在for()循环中,你已经告诉PHP向你显示从'ABCD'第一到第五个string字符。循环开始从0开始计数,并在达到4时回声D ,它将引发一个偏移错误。

类似的错误:

  • 非法string偏移“选项1”

parsing错误:语法错误,意外的'['

这个错误来自两个variables:

变化1

 $arr = [1, 2, 3]; 

这个数组初始化器语法只在PHP 5.4中引入; 它会在之前的版本中引发parsing器错误。 如果可能,请升级安装或使用旧的语法:

 $arr = array(1, 2, 3); 

参见手册中的这个例子 。

变化2

 $suffix = explode(',', 'foo,bar')[1]; 

在PHP 5.4中也引入了数组解引用函数结果。 如果无法升级,则需要使用(临时)variables:

 $parts = explode(',', 'foo,bar'); $suffix = $parts[1]; 

参见手册中的这个例子 。

警告: [函数]期望参数1是资源,布尔给定

(更一般的变化警告:mysql_fetch_array()期望参数1是资源,布尔给定 )

资源是PHP中的一种types (如string,整数或对象)。 资源是一个不具有内在价值的不透明的团体。 资源是特定于某些PHP函数或扩展集定义的。 例如,Mysql扩展定义了两种资源types :

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

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

一个cURL句柄和一个cURL多句柄。

var_dump ed时,值如下所示:

 $resource = curl_init(); var_dump($resource); resource(1) of type (curl) 

这就是所有的资源是一个特定types( (curl) )的数字标识符( (1) (curl) )。

你将这些资源带到身边,并将它们传递给不同的function,这样的资源就意味着什么。 通常这些函数在后台分配某些数据,而资源只是用来在内部跟踪这些数据的参考。


…期望参数1是资源,布尔给定 ”错误通常是本应创build资源的未经检查的操作的结果,但返回false 。 例如, fopen函数有这样的描述:

返回值

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

So in this code, $fp will either be a resource(x) of type (stream) or false :

 $fp = fopen(...); 

If you do not check whether the fopen operation succeed or failed and hence whether $fp is a valid resource or false and pass $fp to another function which expects a resource, you may get the above error:

 $fp = fopen(...); $data = fread($fp, 1024); Warning: fread() expects parameter 1 to be resource, boolean given 

You always need to error check the return value of functions which are trying to allocate a resource and may fail :

 $fp = fopen(...); if (!$fp) { trigger_error('Failed to allocate resource'); exit; } $data = fread($fp, 1024); 

Related Errors:

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

Notice: Trying to get property of non-object error

Happens when you try to access a property of an object while there is no object.

A typical example for a non-object notice would be

 $users = json_decode('[{"name": "hakre"}]'); echo $users->name; # Notice: Trying to get property of non-object 

In this case, $users is an array (so not an object) and it does not have any properties.

This is similar to accessing a non-existing index or key of an array (see Notice: Undefined Index ).

This example is much simplified. Most often such a notice signals an unchecked return value, eg when a library returns NULL if an object does not exists or just an unexpected non-object value (eg in an Xpath result, JSON structures with unexpected format, XML with unexpected format etc.) but the code does not check for such a condition.

As those non-objects are often processed further on, often a fatal-error happens next on calling an object method on a non-object (see: Fatal error: Call to a member function … on a non-object ) halting the script.

It can be easily prevented by checking for error conditions and/or that a variable matches an expectation. Here such a notice with a DOMXPath example:

 $result = $xpath->query("//*[@id='detail-sections']/div[1]"); $divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object 

The problem is accessing the nodeValue property (field) of the first item while it has not been checked if it exists or not in the $result collection. Instead it pays to make the code more explicit by assigning variables to the objects the code operates on:

 $result = $xpath->query("//*[@id='detail-sections']/div[1]"); $div = $result->item(0); $divText = "-/-"; if ($div) { $divText = $div->nodeValue; } echo $divText; 

Related errors:

  • 注意:未定义的索引
  • Fatal error: Call to a member function … on a non-object

Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .

例:

 $var = "test"; echo $var["a_key"]; 

If you think the variable should be an array, see where it comes from and fix the problem there.

Code doesn't run/what looks like parts of my PHP code are output

If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?> tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.

To actually run your PHP scripts, you need:

  • a web server which executes your script
  • to set the file extension to .php, otherwise the web server won't interpret it as such*
  • to access your .php file via the web server

* Unless you reconfigure it, everything can be configured.

This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:

 file://C:/path/to/my/file.php 

This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:

 http://localhost/my/file.php 

You may also want to check whether you're using short open tags <? instead of <?php and your PHP configuration has turned short open tags off.

Also see PHP code is not being executed, instead code shows on the page

Warning: mysql_connect(): Access denied for user 'name'@'host'

This warning shows up when you connect to a MySQL/MariaDB server with invalid or missing credentials (username/password). So this is typically not a code problem, but a server configuration issue.

  • See the manual page on mysql_connect("localhost", "user", "pw") for examples.

  • Check that you actually used a $username and $password .

    • It's uncommon that you gain access using no password – which is what happened when the Warning: said (using password: NO) .
    • Only the local test server usually allows to connect with username root , no password, and the test database name.

    • You can test if they're really correct using the command line client:
      mysql --user="username" --password="password" testdb

    • Username and password are case-sensitive and whitespace is not ignored. If your password contains meta characters like $ , escape them, or put the password in single quotes .

    • Most shared hosting providers predeclare mysql accounts in relation to the unix user account (sometimes just prefixes or extra numeric suffixes). See the docs for a pattern or documentation, and CPanel or whatever interface for setting a password.

    • See the MySQL manual on Adding user accounts using the command line. When connected as admin user you can issue a query like:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Or use Adminer or WorkBench or any other graphical tool to create, check or correct account details.

    • If you can't fix your credentials, then asking the internet to "please help" will have no effect. Only you and your hosting provider have permissions and sufficient access to diagnose and fix things.

  • Verify that you could reach the database server, using the host name given by your provider:
    ping dbserver.hoster.example.net

    • Check this from a SSH console directly on your webserver. Testing from your local development client to your shared hosting server is rarely meaningful.

    • Often you just want the server name to be "localhost" , which normally utilizes a local named socket when available. Othertimes you can try "127.0.0.1" as fallback.

    • Should your MySQL/MariaDB server listen on a different port, then use "servername:3306" .

    • If that fails, then there's a perhaps a firewall issue. (Off-topic, not a programming question. No remote guess-helping possible.)

  • When using constants like eg DB_USER or DB_PASSWORD , check that they're actually defined .

    • If you get a "Warning: Access defined for 'DB_USER'@'host'" and a "Notice: use of undefined constant 'DB_PASS'" , then that's your problem.

    • Verify that your eg xy/db-config.php was actually included and whatelse.

  • Check for correctly set GRANT permissions .

    • It's not sufficient to have a username + password pair.

    • Each MySQL/MariaDB account can have an attached set of permissions.

    • Those can restrict which databases you are allowed to connect to, from which client/server the connection may originate from, and which queries are permitted.

    • The "Access denied" warning thus may as well show up for mysql_query calls, if you don't have permissions to SELECT from a specific table, or INSERT / UPDATE , and more commonly DELETE anything.

    • You can adapt account permissions when connected per command line client using the admin account with a query like:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • If the warning shows up first with Warning: mysql_query(): Access denied for user ''@'localhost' then you may have a php.ini-preconfigured account/password pair .

    • Check that mysql.default_user= and mysql.default_password= have meaningful values.

    • Oftentimes this is a provider-configuration. So contact their support for mismatches.

  • Find the documentation of your shared hosting provider:

    • eg HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting , or just google yours´.

    • Else consult your webhosting provider through their support channels.

  • Note that you may also have depleted the available connection pool . You'll get access denied warnings for too many concurrent connections. (You have to investigate the setup. That's an off-topic server configuration issue, not a programming question.)

  • Your libmysql client version may not be compatible with the database server. Normally MySQL and MariaDB servers can be reached with PHPs compiled in driver. If you have a custom setup, or an outdated PHP version, and a much newer database server, or significantly outdated one – then the version mismatch may prevent connections. (No, you have to investigate yourself. Nobody can guess your setup).

More references:

  • Serverfault: mysql access denied for 'root'@'name of the computer'
  • Warning: mysql_connect(): Access denied
  • Warning: mysql_select_db() Access denied for user ''@'localhost' (using password: NO)
  • Access denied for user 'root'@'localhost' with PHPMyAdmin

Btw, you probably don't want to use mysql_* functions anymore . Newcomers often migrate to mysqli , which however is just as tedious. Instead read up on PDO and prepared statements .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

Notice: Array to string conversion

This simply happens if you try to treat an array as a string:

 $arr = array('foo', 'bar'); echo $arr; // Notice: Array to string conversion $str = 'Foo ' . $arr; // Notice: Array to string conversion 

An array cannot simply be echo 'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:

 echo $arr[0]; $str = 'Foo ' . join(', ', $arr); 

If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.

Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. 例如:

 $value = @(2 / 0); 

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

 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 } 

Related Questions:

  • warning: division by zero
  • Warning: Division By Zero Working on PHP and MySQL
  • Division by zero error in WordPress Theme
  • How to suppress the “Division by zero” error
  • How to catch a division by zero?

Strict Standards: Non-static method [<class>::<method>] should not be called statically

Occurs when you try to call a non-static method on a class as it was static, and you also have the E_STRICT flag in your error_reporting() settings.

例如:

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

HTML::br() or $html::br()

You can actually avoid this error by not adding E_STRICT to error_reporting() , eg

 error_reporting(E_ALL & ~E_STRICT); 

since as for PHP 5.4.0 and above, E_STRICT is included in E_ALL [ ref ]. But that is not adviceable. The solution is to define your intended static function as actual static :

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

or call the function conventionally :

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

Related questions :

  • How can I solve "Non-static method xxx:xxx() should not be called statically in PHP 5.4?

Fatal error: [TraitA] and [TraitB] define the same property ([$x]) in the composition of [ClassC]

Occurs when a class attempts to use multiple Traits , where two or more of those Traits have defined a property by the same name, and with the property having differing initial values.

例:

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

Problematic: While it's possible to resolve conflicts between competing methods , there is currently no syntax that would resolve a conflict between two competing properties. The only solution at this time is to refactor ; ie, avoid a conflict between property names that produces a fatal error.


Related Questions:

  • PHP Traits: How to resolve a property name conflict?
  • Traits – property conflict with parent class