参考-这个错误在PHP中是什么意思? 这是什么?

参考-这个错误在PHP中是什么意思? 这是什么?,php,debugging,error-handling,warnings,custom-error-handling,Php,Debugging,Error Handling,Warnings,Custom Error Handling,这是一些关于在编写PHP时可能遇到的警告、错误和注意事项的答案,您不知道如何修复它们。这也是一个社区Wiki,因此邀请所有人参与添加和维护此列表 为什么会这样? 堆栈溢出时经常会出现诸如或之类的问题。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复这些问题,然后在特定情况下向OP显示要更改的行。这些答案不会给网站增加任何价值,因为它们只适用于OP的特定代码。具有相同错误的其他用户无法轻松从中读取解决方案,因为他们太本地化了。这是可悲的,因为一旦您了解了根本原因,修复错误就变得微不足道

这是一些关于在编写PHP时可能遇到的警告、错误和注意事项的答案,您不知道如何修复它们。这也是一个社区Wiki,因此邀请所有人参与添加和维护此列表

为什么会这样? 堆栈溢出时经常会出现诸如或之类的问题。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复这些问题,然后在特定情况下向OP显示要更改的行。这些答案不会给网站增加任何价值,因为它们只适用于OP的特定代码。具有相同错误的其他用户无法轻松从中读取解决方案,因为他们太本地化了。这是可悲的,因为一旦您了解了根本原因,修复错误就变得微不足道了。因此,本列表试图以一种通用的方式解释解决方案

我在这里该怎么办? 如果您的问题已被标记为此问题的副本,请在下面找到您的错误消息,并对代码应用修复。答案通常包含进一步的链接,以防仅仅从一般答案中不清楚

如果您想参与,请添加您最喜欢的错误消息、警告或通知、每个答案一条、简短描述其含义(即使只是在手册页面上突出显示术语)、可能的解决方案或调试方法以及有价值的现有问答列表。此外,请随时改进任何现有答案

名单 也被称为白页/死亡屏幕 a、 k.a。 ' [参考] 另见:

致命错误:调用成员函数。。。关于非对象 发生在类似于xyz->method的代码中,其中xyz不是对象,因此无法调用该方法

这是一个致命错误,将停止脚本转发兼容性通知:从PHP7开始,它将成为一个可捕获的错误

这通常是代码缺少错误条件检查的迹象。在调用对象的方法之前,验证该对象实际上是对象

例如

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
foreach ($items as $item) {
    // do something with item
    $counter++;
}
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
在上面的示例中,无法准备查询,而prepare将为$statement分配false。尝试调用execute方法将导致致命错误,因为false是非对象,因为该值是布尔值

找出函数返回布尔值而不是对象的原因。例如,检查$pdo对象以查找上次发生的错误。有关如何调试的详细信息将取决于特定函数/对象/类的错误处理方式

如果->准备失败,那么$pdo数据库句柄对象也会失败。找到定义它的地方。然后将其作为参数传递、存储为属性或通过全局作用域共享

另一个问题可能是有条件地创建一个对象,然后尝试在该条件块之外调用一个方法。比如说

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();
通过尝试在条件块之外执行该方法,可能无法定义对象

相关问题:

警告:mysql_fetch_数组期望参数1为资源,给定布尔值 首先,也是最重要的:

。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO

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

这是一个警告,不会停止脚本,但会使程序出错

您需要通过以下方式检查mysql\u查询返回的结果:

相关问题:

相关错误:

其他mysql*函数如果也希望将mysql结果资源作为参数,则会出于相同的原因产生相同的错误。

警告:无法修改标头信息-标头已发送 当脚本尝试将HTTP头发送到客户端,但之前已经有输出,导致头已发送到客户端时发生

这是一个错误,它不会停止脚本

典型的示例是这样的模板文件:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...
$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)
session_start函数将尝试将带有会话cookie的头发送到客户端。但是PHP在将元素写入输出流时已经发送了头。您必须将会话从开始移动到顶部

您可以通过查看触发警告的代码之前的行并检查其输出位置来解决此问题。将任何头发送代码移到该代码之前

一个经常被忽略的输出是PHP结束后的新行?>。当?>是文件中的最后一项内容时,省略?>被视为标准做法。类似地,此警告的另一个常见原因是打开解析错误:语法错误,意外的T_XXX 当出现意外位置、不平衡的多余括号、在php.ini中使用短标记而不激活它等情况时发生

相关问题:

参考: < p> 有关更多帮助,请参阅:

-这确实为您的语法问题提供了一些更有用的解释。 分析错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM 范围解析操作符也被称为Paamayim Nekudotayim,来自希伯来语‎. 意思是双冒号

如果不小心在代码中放入::,通常会发生此错误

相关问题:

参考: 文件:

致命错误:已用尽XXX字节的允许内存大小,尝试分配XXX字节 内存不足,无法运行脚本。PHP已达到内存限制并停止执行。此错误是致命的,脚本将停止。的值可以在php.ini文件中配置,也可以使用ini_set'memory_limit'、'128m'进行配置;在脚本中,它将覆盖php.ini中定义的值。内存限制的目的是防止单个PHP脚本占用所有可用内存并导致整个web服务器停机

首先要做的是尽量减少脚本所需的内存量。例如,如果您正在将一个大文件读入一个变量,或者正在从数据库中获取许多记录并将它们全部存储在一个数组中,那么可能会占用大量内存。将代码更改为逐行读取文件,或一次获取一条数据库记录,而不将它们全部存储在内存中。这确实需要对幕后发生的事情以及数据存储在内存和其他地方的时间有一点概念性的了解

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

相关问题:

致命错误:不在对象上下文中使用$this 无法分配的。如果在它不存在的上下文中访问它,则会出现此致命错误

可能会发生以下错误:

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

class Foo {
   protected $var;
   public function __construct($var) {
       $this->var = $var;
   }

   public static function bar () {
       // ^^^^^^
       echo $this->var;
       //   ^^^^^
   }
}

Foo::bar();
如何修复:再次检查代码,$这只能在对象上下文中使用,不应在静态方法中使用。此外,静态方法不应访问非静态属性。使用self::$static_属性访问静态属性

如果类方法中的代码已复制到普通函数中,或仅复制到全局范围中,并保留$this特殊变量。 如何修复:查看代码并用不同的替换变量替换$this

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
}
相关问题:

将非静态方法调用为静态: 复制代码: 致命错误:无法在写上下文中使用函数返回值 这通常发生在直接使用空函数时

例如:

if (empty(is_null(null))) {
  echo 'empty';
}
$var = "test";
echo $var["a_key"];
这是因为它是一个语言构造而不是函数,在5.5之前的PHP版本中,不能使用表达式作为参数来调用它。在PHP5.5之前,empty的参数必须是变量,但PHP5.5+中允许使用任意表达式,如函数的返回值

empty,不管其名称如何,实际上并不检查变量是否为空。相反,它检查变量是否不存在,或者==false。示例中类似is_nullnull的表达式将始终被视为存在,因此此处empty仅检查它是否等于false。你可以用!,e、 如果!is_nullnull,或显式与false比较,例如is_NullNullNull==false

相关问题:

注意:未定义索引 当您试图通过数组中不存在的密钥访问数组时发生

未定义索引通知的典型示例如下

spinach和1都不存在于数组中,导致触发

解决方案是在访问该索引之前确保该索引或偏移量存在。这可能意味着您需要修复程序中的一个bug,以确保这些索引在您期望的时候确实存在。或者,这可能意味着您需要使用或测试索引是否存在:

如果您有如下代码:

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

MySQL:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以获取可在附近使用的正确语法。。。在第一线。。。 导致此错误的原因通常是您忘记正确转义传递给MySQL查询的数据

下面是一个不做坏事的例子:

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);
该代码可以包含在一个页面中,该页面包含一个要提交的表单,以及一个URL,例如编辑第10条帖子

如果提交的文本包含单引号,会发生什么情况$查询结果将为:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';
当这个查询被发送到MySQL时,它会抱怨语法错误,因为中间有一个额外的单引号。

为了避免此类错误,在查询中使用之前,必须始终转义数据

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

文件:

警告:open_basedir限制生效 此警告可能与与文件和目录访问相关的各种功能一起出现。它会警告配置问题

当它出现时,表示已禁止访问某些文件

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

修复通常是更改,调用相关设置

有时使用错误的文件名或目录名,修复方法是使用正确的文件名或目录名

相关问题:

什么也没看见。这一页是空白的。 也被称为死亡的白色页面或死亡的白色屏幕。当关闭错误报告并且经常发生致命错误时,就会发生这种情况

如果启用了错误日志记录,您将在错误日志中找到具体的错误消息。这通常位于一个名为php_errors.log的文件中,在许多Linux环境中位于中心位置,例如/var/log/apache2,或者在共享托管环境中有时使用的脚本目录中

有时,临时启用错误显示可能更简单。然后,白色页面将显示错误消息。请小心,因为访问网站的每个人都可以看到这些错误

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

ini_set('display_errors', 1); error_reporting(~0);
代码将打开错误显示,并将报告设置为最高级别

由于在运行时执行,因此对解析/语法错误没有影响。这些错误将出现在日志中。如果要在输出中显示它们,例如在浏览器中,则必须将指令设置为true。在php.ini中或在.htaccess中或通过

您可以使用相同的方法设置和指令以选择自己的日志文件位置

查看日志或使用显示器,您将得到一条更好的错误消息和脚本停止的代码行

相关问题:

相关错误:

注意:使用未定义的常数XXX-假定为“XXX” 或者,在PHP 7.2或更高版本中:

警告:使用未定义的常量XXX-假定为“XXX”,这将在未来版本的PHP中引发错误 当代码中使用了一个标记,并且它看起来是一个常量,但没有定义该名称的常量时,就会出现此通知

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

例如:

// Wrong
echo $array[key];

// Right
echo $array['key'];
$value = @(2 / 0);
另一个常见原因是变量名称前面缺少$DOULAR符号:

// Wrong
echo varName;

// Right
echo $varName;
或者您可能拼错了其他常量或关键字:

// Wrong
$foo = fasle;

// Right
$foo = false;
当您试图访问所需的PHP扩展或库定义的常量时,它也可能是缺少该库的标志

相关问题:

注意:未定义的变量 在尝试使用以前未定义的变量时发生

一个典型的例子是

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
foreach ($items as $item) {
    // do something with item
    $counter++;
}
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
如果您以前没有定义$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来传递

注意:未定义的属性 此错误的含义大致相同,但指的是对象的属性。重用上面的示例,此代码将触发错误,因为尚未设置计数器属性

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}
相关问题:

致命错误:调用未定义的函数XXX 在尝试调用尚未定义的函数时发生。常见原因包括缺少扩展和包含、条件函数声明、函数声明中的函数或简单的打字错误

示例1-条件函数声明

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

示例2-函数声明中的函数

在这种情况下,只有在调用createFn后才会声明fn。请注意,对createFn的后续调用将触发有关重新声明现有函数的错误

您还可以在PHP内置函数中看到这一点。尝试在中搜索函数,并检查它属于哪个扩展PHP模块,以及哪些版本的PHP支持它

如果缺少扩展,请安装该扩展并在php.ini中启用它。请参阅PHP手册中的安装说明,了解您的函数出现在其中的扩展。您还可以使用软件包管理器启用或安装扩展,例如Debian或Ubuntu中的apt、Red Hat或CentOS中的yum,或共享主机环境中的控制面板

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

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

如果输入错误,请修复输入错误

相关问题:

警告:[函数]:无法打开流:[原因] 当您通常通过include、require或fopen调用文件,而PHP找不到该文件或没有足够的权限加载该文件时,就会发生这种情况

发生这种情况的原因多种多样:

文件路径错误 文件路径是相对的 包含路径错误 权限限制太多 SELinux生效 还有更多。。。 一个常见的错误是不使用绝对路径。这可以通过使用完整路径或类似_DIR _或dirname _FILE _;来轻松解决:

或:

确保使用正确的路径是解决这些问题的一个步骤,这也可能与不存在的文件、阻止访问的文件系统权限或PHP本身对OpenBaseDir的限制有关

快速解决此问题的最佳方法是按照下面的故障排除清单进行操作

相关问题:

相关错误:

致命错误:无法重新声明类[类名] 致命错误:无法重新声明[函数名] 这意味着您要么使用相同的函数/类名两次,需要重命名其中一个,要么是因为您使用了require或include,而您应该使用require\u或include\u一次

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

考虑以下代码:

class.php

index.php

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

Parse error:syntax error、意外的T\u ENCAPSED\u和\u WHITESPACE 当整个复变量构造未包含在{}中时,在双引号字符串内尝试引用带引号的键进行插值时,最常遇到此错误

错误案例: 这将导致意外的T_装箱_和_空白:

可能的修复方法: 在双引号字符串中,PHP将允许使用未加引号的数组键字符串,并且不会发出E_通知。因此,上述内容可以写成:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^
整个复杂数组变量和键可以包含在{}中,在这种情况下,应该引用它们以避免出现E_通知。建议对复杂变量使用此语法

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 a a double-quoted string with a complex {$object->property->array['key']}";
当然,上述任何一种方法的替代方法都是将数组变量串联起来,而不是插值:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^
有关参考信息,请参阅

警告中有关变量解析的部分:[function]预期参数1为资源,布尔值为给定值 一个更普遍的变化

资源在PHP中是一种类似字符串、整数或对象的语言。资源是一个不透明的blob,它本身没有内在的有意义的值。资源是特定于某一组PHP函数或扩展的,并由其定义。例如,Mysql扩展:

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

cURL扩展定义了另一个:

。。。卷曲控制柄和卷曲多控制柄

当var_转储时,值如下所示:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...
$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)
这就是大多数资源的全部,一个特定类型的数字标识符1

您可以随身携带这些资源,并将它们传递给不同的功能,对于这些功能来说,这些资源意味着什么。通常,这些函数在后台分配某些数据,而资源只是它们用来在内部跟踪这些数据的引用

这个。。。预期参数1是资源,布尔给定错误通常是本应创建资源的未检查操作的结果,但返回false。例如,具有以下描述:

返回值

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

因此,在这段代码中,$fp要么是stream类型的resourcex,要么是false:

如果不检查fopen操作是否成功或失败,以及$fp是否为有效资源或false,并将$fp传递给另一个需要资源的函数,则可能会出现上述错误:

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

Warning: fread() expects parameter 1 to be resource, boolean given
您始终需要错误检查尝试分配资源但可能失败的函数的返回值:

相关错误:

分析错误:语法错误,意外的T_变量 可能的情景

我似乎找不到我的代码哪里出错了。以下是我的全部错误:

分析错误:语法错误,第x行出现意外的T_变量

我在尝试什么

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

解析 错误:程序的语法有问题,例如在语句结尾处留下分号,或者像上面的例子一样,遗漏了。操作人员解释器在遇到解析错误时停止运行程序

简单地说,这是一个语法错误,意味着代码中有某种东西阻止它被正确解析并因此而运行

你应该做的是仔细检查错误所在的线周围是否有任何简单的错误

该错误消息意味着在文件的x行中,PHP解释器希望看到一个开括号,但是它遇到了一个名为T_变量的东西。这个T_变量叫做令牌。这是PHP解释器表达程序不同基本部分的方式。当解释器读入一个程序时,它会将您所写的内容翻译成一个标记列表。在程序中放置变量的任何地方,解释器列表中都有aT_变量标记

因此,请确保在php.ini中至少启用E_解析。生产脚本中不应存在分析错误

我一直建议在编码时添加以下语句:

error_reporting(E_ALL);

另外,一个好主意是使用IDE,它可以让您在键入时知道解析错误。您可以使用:

在我看来,免费软件是最好的 戈登叔叔喜欢这个:P,付费计划,包含专有和自由软件 美女与野兽,自由软件 相关问题:

参考: 注意:未初始化的字符串偏移量:* 正如名称所示,当您很可能试图迭代或从具有不存在键的数组中查找值时,就会发生此类错误

以您为例,您正在尝试显示$string中的每个字母

而且,一旦脚本完成回显D,您就会得到错误,因为在for循环中,您已经告诉PHP显示“ABCD”中存在的从第一个到第五个字符串字符,但是由于循环从0开始计数,并在达到4时回显,因此将抛出偏移错误

类似错误:

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

// Wrong
echo $array[key];

// Right
echo $array['key'];
$value = @(2 / 0);
但是,与任何警告一样,最好的方法是追踪警告的原因并解决它。警告的原因将来自任何一个实例,其中您试图除以0、一个等于0的变量或一个由于NULL==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
}
相关问题:

严格标准:不应静态调用非静态方法[::] 在尝试调用类上的非静态方法时发生,因为它是静态的,并且在错误报告设置中也有E_STRICT标志

例如:

class HTML {
   public function br() {
      echo '<br>';
   }
}
因为对于PHP5.4.0及以上版本,E_STRICT包含在E_ALL[]中。但这是不可取的。解决方案是将预期静态功能定义为实际静态功能:

相关问题:

分析错误:语法错误,意外的“[” 此错误有两个变量:

变体1 此数组初始值设定项语法仅在PHP 5.4中引入;它将在之前的版本中引发解析器错误。如果可能,请升级安装或使用旧语法:

$arr = array(1, 2, 3);
另请参见手册中的

变化2 PHP 5.4中还引入了数组解引用函数结果。如果无法升级,则需要使用临时变量:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];
另请参阅手册。

代码未运行/我的PHP代码的某些部分似乎已输出 如果您的PHP代码没有任何结果和/或您在网页中看到部分文字PHP源代码输出,您可以非常确定您的PHP没有实际执行。如果您在浏览器中使用View source,您可能看到的是整个PHP源代码文件。由于PHP代码嵌入在标记中浏览器将尝试将这些内容解释为HTML标记,结果可能看起来有些混乱

要实际运行PHP脚本,您需要:

执行脚本的web服务器 将文件扩展名设置为.php,否则web服务器将不会将其解释为.php* 通过web服务器访问.php文件 *除非重新配置,否则一切都可以配置

最后一个特别重要。双击文件可能会打开它 在浏览器中使用以下地址:

file://C:/path/to/my/file.php
这完全绕过了您可能正在运行的任何web服务器,并且不会对文件进行解释。您需要访问web服务器上文件的URL,可能类似于:

http://localhost/my/file.php
您可能还需要检查是否正在使用短打开标记注意:数组到字符串的转换 如果尝试将数组视为字符串,则会发生这种情况:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion
数组不能简单地用字符串进行回显或连接,因为结果没有很好地定义。PHP将使用字符串数组代替数组,并触发通知,指出这可能不是预期的结果,您应该在此处检查代码。你可能想要这样的东西:

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
}
如果此通知出现在您不期望的地方,则表示您认为是字符串的变量实际上是数组。这意味着您的代码中有一个bug,它使该变量成为一个数组,而不是您期望的字符串。

注意:尝试获取非对象错误的属性 在没有对象的情况下尝试访问对象的属性时发生

非对象通知的一个典型示例是

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
foreach ($items as $item) {
    // do something with item
    $counter++;
}
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
在本例中,$users是一个数组,因此不是对象,也没有任何属性

这类似于访问数组中不存在的索引或键,请参见

这个例子简化了很多。最常见的情况是,此类通知表示未检查的返回值,例如,如果对象不存在,则库返回NULL,或者仅返回意外的非对象值,例如,在Xpath结果中,具有意外格式的JSON结构,具有意外格式的XML等。但代码不检查此类条件

由于这些非对象通常会被进一步处理,因此在对非对象调用对象方法时,通常会发生致命错误。请参见:停止脚本

通过检查错误条件和/或变量是否符合预期,可以很容易地防止这种情况。这里有这样一个通知和一个示例:

问题是访问第一个项的nodeValue属性字段时,尚未检查它是否存在于$result集合中。相反,通过将变量分配给代码操作的对象,使代码更加明确是值得的:

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

警告:字符串偏移量“XXX”非法 当您尝试使用方括号语法访问数组元素时,会发生这种情况,但您是在字符串上执行此操作,而不是在数组上执行此操作,因此该操作显然没有意义

例如:

if (empty(is_null(null))) {
  echo 'empty';
}
$var = "test";
echo $var["a_key"];
如果您认为该变量应该是一个数组,请查看它的来源并解决该问题。

警告:mysql\u connect:user'name'@'host'的访问被拒绝 当您使用无效或缺少凭据用户名/密码连接到MySQL/MariaDB服务器时,会显示此警告。因此,这通常不是代码问题,而是服务器配置问题

有关示例,请参见上的手册页

检查您是否实际使用了$username和$password

不使用密码访问是很少见的——当警告:使用密码:否时就会发生这种情况。 通常只有本地测试服务器允许使用用户名root、无密码和测试数据库名称进行连接

您可以使用命令行客户端测试它们是否正确: mysql-user=username-password=password testdb

用户名和密码区分大小写,不忽略空格。如果您的密码包含元字符,如$,请将其转义,或输入密码

大多数共享主机提供程序都是与unix用户帐户相关的mysql帐户,有时只是前缀或额外的数字后缀。请参阅文档了解模式或文档,以及CPanel或任何用于设置密码的界面

请参阅有关使用命令行的MySQL手册。当以管理员用户身份连接时,您可以发出如下查询: 创建由“新密码”标识的用户“用户名”@“本地主机”

或使用或任何其他图形工具创建、检查或更正帐户详细信息

如果您无法修复您的凭据,那么请求internet帮助将没有任何效果。只有您和您的主机提供商有权限和足够的访问权限来诊断和修复问题

验证是否可以使用提供商提供的主机名访问数据库服务器: ping dbserver.hoster.example.net

直接从Web服务器上的SSH控制台检查这一点。从本地开发客户机到共享托管服务器的测试很少有意义

通常,您只希望服务器名为localhost,它通常在可用时使用本地命名套接字。其他情况下,您可以尝试127.0.0.1作为备用

如果您的MySQL/MariaDB服务器在另一个端口上侦听,则使用servername:3306

如果失败,那么可能是防火墙问题。离题,不是编程问题。没有远程猜测帮助 可能

当使用诸如DB_USER或DB_PASSWORD之类的常量时,请检查它们是否实际有效

如果您收到警告:为“DB_USER”@“host”定义了访问权限,并收到通知:使用未定义的常量“DB_PASS”,那么这就是您的问题

验证您的示例xy/db-config.php是否已包含在内,以及其他内容

检查是否正确设置了权限

只有用户名+密码对是不够的

每个MySQL/MariaDB帐户都可以附加一组权限

这些限制可以限制允许连接到哪些数据库、连接可能来自哪个客户机/服务器以及允许哪些查询

因此,如果您没有从特定表中进行选择、插入/更新以及更常见的删除任何内容的权限,那么访问被拒绝警告也可能会出现在调用中

当使用管理员帐户和以下查询连接每个命令行客户端时,您可以: 将数据库中的所有内容。*授予“用户名”@“本地主机”

如果警告首先显示为警告:mysql\u query:Access denied for user@'localhost',则您可能有一个错误

检查mysql.default\u user=和mysql.default\u password=是否具有有意义的值

通常这是一个提供者配置。因此,请联系他们的支持人员以了解不匹配的情况

查找共享主机提供商的文档:

e、 例如,,,,或只是谷歌你的´

否则,请通过其支持渠道咨询您的网络主机提供商

请注意,您可能还耗尽了可用的连接池。您将收到太多并发连接的拒绝访问警告。您必须调查设置。这是一个离题的服务器配置问题,而不是编程问题

您的libmysql客户端版本可能与数据库服务器不兼容。通常,可以通过在驱动程序中编译的PHP访问MySQL和MariaDB服务器。如果您有一个自定义设置,或者一个过时的PHP版本,以及一个更新得多的数据库服务器,或者一个明显过时的数据库服务器,那么版本不匹配可能会阻止连接。不,你必须调查你自己。没有人能猜到你的设置

更多参考资料:

顺便说一句,你可能不想使用。新来的人经常迁移到美国,但这同样乏味。相反,请仔细阅读。 $db=new-pdomsql:host=localhost;dbname=testdb,用户名,密码

不推荐使用:不推荐使用带大括号的数组和字符串偏移量访问语法 在PHP 7.4.0之前,字符串偏移量和数组元素可以通过大括号{}访问:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1
自PHP 7.4.0以来,该选项已被弃用,并生成警告:

不推荐使用:不推荐使用带大括号的数组和字符串偏移量访问语法

必须使用方括号[]来访问字符串偏移量和数组元素:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

链接到一个试图机械地解决这个问题的PHP。

您可能还想提到它是如何在非静态方法中使用闭包的,以及在5.4中是如何解决的。@hakre我说的是闭包中的静态调用。类似于$closure=function{self::method;}。@KendallHopkins:这是另一个错误:致命错误:当没有类作用域处于活动状态时无法访问self::但是使用$this可以触发bespoken致命错误:当不在对象上下文中时使用$this:$closure=function{$this->method;};这通常发生在共享主机上,人们通常不会将自己锁定在目录之外:-只是一个注释。如果mysql\u查询还不够糟糕,那么在上面加上或死都是雪上加霜。我遇到的问题是$res=mysql\u query$query如果查询成功,则返回1,因此它被认为是真的。因此,当将mysql\u查询的结果传递给mysql\u fetch\u数组时,通知会显示。@mboy对于返回resultset的SELECT、SHOW、DESCRIBE、EXPLAIN和其他语句,mysql\u查询成功时返回资源,错误时返回FALSE。对于其他类型的SQL语句,INSERT、UPDATE、DELETE、DROP等,mysql\u查询成功时返回TRUE,错误时返回FALSE。@xdazz这就是我面临的问题,INSERT UPDATE返回TRUE,因此我无法消除此错误mysql\u fetch\u数组希望参数1是资源,select中给出的布尔值请参见-对git消除此错误有何建议?@mboy mysql\u fetch\u数组用于select查询,对于插入和更新,您不需要获取结果集,也没有结果集允许您获取。此外,如果不这样做,您的站点将被机器人攻击automatically@gladoscc单击编辑并修改答案。我知道它可以改进。或者使用准备好的sql查询。另外,要将讨论移出评论,请转到meta questionX Ref:;其他地方:看看这个,还有这个X-Ref:我认为最常见的原因是忘记了变量前面的$,而不是数组;为什么不是-1呢?这就是~0的计算结果,而且不那么神秘。我认为两者的神秘性相似~0是更明确的IMO:对空位集i求反。E启用所有标志-1不是mea
nt代表«未找到»,就像C中的strpos一样,但作为一个设置了所有标志的位集,因为-1是二进制1111'1111'1111'1111,代表32位。哎呀,1111'1111'1111'1111实际上是16位,但我希望你理解我的意思。你可能得到这个结果的另一个原因是因为你把return设置为false;在PHP代码中,如果使用WordPress,请检查主题文件。当我将一个站点升级到WordPress的新版本时,我无法更新主题,因为它已经好几年没有更新了。这个问题突然出现了。原来functions.php文件有多个块,中间有空格。@RoyLeban如果文件中有多个块。。。我不知道这是什么意思。什么是街区?一个块是否由多个块组成?如果可能,请在PHP.ini配置文件中启用“输出缓冲”功能。它用于解决此问题。它发送html文件,并保存在输出缓冲区中,仅在脚本停止后发送到客户端,因此,如果在不同的位置发出两个报头,那么旧的报头将被新的报头替换;或$a=:;。值得一提的是使用自动加载,而诸如或甚至现在已被弃用的标准通过省去您使用require/include yourself bar的一些奇怪的边缘情况来解决这个问题。mysql允许通过php ini设置进行自动连接,然后使用不同的命令前缀给出相同的错误消息,例如,警告:mysql_查询:用户@'localhost'的访问被拒绝,密码为:NO in…-没什么,哈,完全忘了!可能最后一次在PHP3左右使用它。json_decode现在默认返回stdclass的实例,因此示例代码实际上可以工作。@HugoZink:它实际上会并且总是会返回该示例的数组:-另外,您是否可以为您的写作提供参考,json_decode现在默认返回stdclass的实例?我在变更日志中找不到,根据PHP手册的页面,默认情况下,assoc参数设置为false。此参数决定函数是否返回stdclass而不是关联数组。json_decode'[{name:hakre}]',true将返回数组,否则,如果stdclass objectset为0,则将停止错误,但这是否真的比您所说的不应使用的抑制效果好(我同意)?我建议大多数情况下,可能会返回其他消息或值。例如,如果$var1确实==0,则可以将$var3设置为$var2。即使不这样做,else也根本不需要,因为两种情况下的赋值都是相同的,所以ifI之外的NOELSE和assign都倾向于使用if!空$\u POST['message']{//do stuff}
$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion
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
}
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object
$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;
$var = "test";
echo $var["a_key"];
$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1
$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1