参考-此错误在 PHP 中意味着什么?

共30个回答, 标签: php mysql oop debugging warnings

这是怎麽?

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

为什么会这样?

"标头已经发送" 或 "调用非对象的成员"这样的问题经常会在堆栈溢出上出现。这些问题的根源总是一样的。因此, 这些问题的答案通常会重复这些问题, 然后向 op 显示在他的特殊情况下要改变哪一行。这些答案不会为网站添加任何值, 因为它们仅适用于 OP 的特定代码。具有相同错误的其他用户无法轻松地从中读取解决方案, 因为它们过于本地化。这是可悲的, 因为一旦你了解了根本原因, 修复错误是微不足道的。因此, 此列表尝试以一般的方式解释解决方案。

我应该在这里做什么?

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

如果你想贡献, 请添加你的 "最喜欢" 的错误消息, 警告或通知, 每个答案一个, 一个简短的描述, 它的意思 (即使它只是突出显示术语到他们的手动页面), 一个可能的解决方案或调试方法和现有 Q 的列表& A 有价值。此外, 随时改进任何现有的答案。

名单

第1个答案

警告: 无法修改标头信息-已发送标头

当脚本尝试将 HTTP 标头发送到客户端, 但以前已经有输出时, 会发生这种情况, 这将导致标头已被发送到客户端。

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

一个典型的示例是如下所示的模板文件:



    My Page

...

session_start() 函数将尝试使用会话 cookie 向客户端发送标头。但是 PHP 在将元素写入输出流时, 已经发送了标头 。你得把 session_start() 车开到最上面去。

您可以通过在触发警告的代码之前通过行解决此问题, 并检查它输出的位置。在该代码之前移动发送代码的任何标头。

一个经常被忽视的输出是 PHP 关闭后的新行 ?>?>当它是文件中的最后一件事时, 省略被认为是一种标准做法。同样, 此警告的另一个常见原因是, 当打开 <> 时前面有一个空白、行或不可见的字符, 从而导致 web 服务器发送标头和 whitespace/新线, 因此当 php 开始分析时将无法提交任何标头。

如果文件中包含多个 代码块, 则它们之间不应包含任何空格。(注意: 如果您有自动构造的代码, 则可能有多个块)

此外, 请确保您的代码中没有任何字节顺序标记, 例如, 当脚本的编码为带有 BOM 的 UTF-8 时。

相关问题:

第2个答案

致命错误: 调用成员函数..。在非对象上

发生类似于 xyz->method() 哪里不是 xyz 对象的代码, 因此 method 不能调用。

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

大多数情况下, 这是一个迹象, 表明代码没有检查错误条件。在调用对象的方法之前, 验证对象实际上是一个对象。

一个典型的例子是

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

在上面的示例中, 无法准备查询并 prepare() 将分配给 false $statement 查询。尝试调用该 execute() 方法将导致致命错误, 因为 false 它是一个 "非对象", 因为该值是一个布尔值。

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

如果即使 ->prepare 失败, 则数据库 $pdo 句柄对象也不会传递到当前作用域中。找到它被定义的位置。然后将其作为参数传递, 将其存储为属性, 或通过全局作用域共享。

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

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

通过尝试在条件块之外执行该方法, 可能无法定义您的对象。

相关问题:

第3个答案

什么也没看到。页面为空和白色。

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

如果启用了错误日志记录, 您将在错误日志中找到具体的错误消息。这通常位于名为 "php _ er 架. log" 的文件中, 可以位于中心位置 (例如 /var/log/apache2 在许多 Linux 环境中), 也可以位于脚本本身的目录中 (有时在共享宿主环境中使用)。

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

通过在脚本顶部添加以下 PHP 代码, 可以很容易地做到这一点:

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

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

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

您可以使用相同的方法来设置log _ 错误错误 _ log 指令, 以选择您自己的日志文件位置。

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

相关问题:

相关错误:

第4个答案

注意: 未定义的索引

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

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

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

两者 spinach1 不存在于数组中, 从而 E_NOTICE 导致触发。

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

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

如果您有类似于以下的代码:




    ...

然后 $_POST['message'] 将不会设置此页首次加载时, 您将得到上述错误。只有在提交表单并第二次运行此代码时, 数组索引才存在。通常, 您可以使用以下方法检查此问题:

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

相关问题:

第5个答案

警告: mysql _ 予数组 () 期望参数 1 是资源, 给出布尔值

首先也是最重要的:

请不要 mysql_* 在新代码中使用函数。它们不再被维护, 并被正式弃用。看到红色的盒子了吗?改为了解准备好的语句, 并使用Pdomysqli-本文将帮助您决定哪种内容. 如果你选择 PDO,这里是一个很好的教程


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

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

您需要检查由 mysql_query

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

相关问题:

相关错误:

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

第6个答案

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

$this 是 php 中无法分配的一个特殊变量。如果在不存在它的上下文中访问它, 则会给出此致命错误。

可能会发生此错误:

  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 特殊变量。
    如何修复:查看代码并替换 $this 为不同的替换变量。

相关问题:

  1. 将非静态方法称为静态方法: Php 致命错误: 在不在对象上下文中时使用 $this
  2. 复制代码:致命错误: 在不在对象上下文中使用 $this
  3. 所有 "不在对象上下文中使用 $this" 关于堆栈溢出的问题
第7个答案

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

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

对于 PHP 内置函数, 您也可以看到这一点。尝试在官方手册中搜索该函数, 并检查它属于什么 "扩展" (php 模块), 以及 php 支持什么版本。

如果缺少扩展, 请安装该扩展并在 php. ini 中启用它。有关您的功能出现在的扩展, 请参阅 PHP 手册中的安装说明。您还可以使用包管理器 (例如 apt , 在 Debian 或 Ubuntu、 yum 红帽或 centos 中) 或共享托管环境中的控制面板来启用或安装扩展。

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

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

如果出现拼写错误, 请修复拼写错误。

相关问题:

第8个答案

分析错误: 语法错误, 意外 T _ XXX

发生在意外的地方 T_XXX , 不平衡 (多余) 括号, 使用短标记, 而不激活它在 php. ini, 和更多。

相关问题:

有关进一步的帮助, 请参阅:

第9个答案

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

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

例子:

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

这是因为 empty 它是一个语言构造, 而不是一个函数, 它不能在 5.5 之前用表达式作为其在 php 版本中的参数来调用。 在 PHP 5.5 之前, 参数 empty() 必须是变量, 但在 php 5.5 + 中允许使用任意表达式 (如函数的返回值)。

empty, 尽管它的名称, 实际上并不检查变量是否为 "空"。相反, 它检查变量是否不存在, 或者 == false 。表达式 (如 is_null(null) 示例中的表达式) 将始终被视为存在, 因此 empty 这里只检查它是否等于 false。您可以 empty() 在此处替换为 ! if (!is_null(null)) , 例如, 或显式地与 false (例如) 进行比较. if (is_null(null) == false)

相关问题:

第10个答案

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 注入可能会导致记录、表或整个数据库的更改、丢失或修改。这是一个非常严重的安全问题!

文档:

第11个答案

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

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

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

如果在脚本不执行占用大量内存的工作时发生此错误, 则需要检查代码以查看是否存在内存泄漏。功能 memory_get_usage 是你的朋友。

相关问题:

第12个答案

分析错误: 语法错误, 意外 T _ CAPESSED _ AND _ WHITESPACE

当整个复杂变量构造不包含在中的情况下, 当尝试引用带有引号键的数组值在双引号字符串中进行插值时, 最常遇到此错误 {}

错误情况:

这将导致 Unexpected T_ENCAPSED_AND_WHITESPACE :

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

可能的修复:

在双引号字符串中, PHP 将允许使用不带引号的数组键字符串, 并且不会发出 E_NOTICE 。 因此, 可以将上述内容写成:

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

可以将整个复杂数组变量和键括在 {} 一起, 在这种情况下, 应引用它们以避免 E_NOTICEPHP 文档针对复杂变量推荐这种语法。

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.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

有关参考, 请参阅Php 字符串手册页中关于变量分析的部分

第13个答案

分析错误: 语法错误, 意外 T _ PAAMAYIM _ NEKUDOTYIM

范围解析运算符也被称为 "Paamayim Nekudotayim", 来自希伯来语 פעמייםנקודתיים。意思是 "双冒号" 或 "双点两次"。

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

相关问题:

文档:

第14个答案

警告: [函数]: 无法打开流: [原因]

当您通常通过调用文件时 include , require 或者 fopen php 找不到该文件或没有足够的权限加载该文件时, 就会发生这种情况。

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

  • 文件路径错误
  • 文件路径是相对的
  • 包含路径是错误的
  • 权限限制太多
  • SELinux 已生效
  • 还有更多..。

一个常见的错误是不使用绝对路径。这可以很容易地解决通过使用一个完整的路径或神奇的常量,__DIR__ dirname(__FILE__) 或:

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

或:

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

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

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

相关问题:

相关错误:

第15个答案

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

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

这意味着您要么使用相同的函数/类名两次, 需要重命名其中一个, 要么是因为您已使用或 require include 您应该使用的位置 require_onceinclude_once

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

请考虑以下代码:

类. php

index. php

doSomething();
}

do_stuff();
do_stuff();

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

第16个答案

注意: 使用未定义的常量 XXX-假定为 "XXX"

或, 在 PHP 7.2 或更高版本中:

警告: 使用未定义的常量 XXX-假定为 "XXX" (这将在 php 的未来版本中引发错误)

当代码中使用令牌并显示为常量, 但未定义该名称的常量时, 会发生此通知。

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

例如:

// Wrong
echo $array[key];

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

另一个常见原因是 $ 变量名前面缺少 (美元) 符号:

// Wrong
echo varName;

// Right
echo $varName;

或者您可能拼写错误了一些其他常量或关键字:

// Wrong
$foo = fasle;

// Right
$foo = false;

当您尝试访问由该库定义的常量时, 它也可能是所需的 PHP 扩展或库丢失的信号。

相关问题:

第17个答案

注意: 未定义的变量

当您尝试使用以前未定义的变量时, 就会发生这种情况。

一个典型的例子是

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

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

正确的方法是在使用变量之前设置它, 即使它只是一个空字符串, 如

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

相关问题:

第18个答案

注意: 未初始化的字符串偏移量:*

顾名思义, 当您很可能尝试循环访问或从具有不存在密钥的数组中查找值时, 就会发生此类类型的错误。

考虑你, 试图显示每一个字母从 $string

$string = 'ABCD';
<= $len;="" $i++){="" echo="" "$string[$i]="" \n";="" }="">

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

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

而且, 一旦脚本完成与之相呼应 D , 你就会得到错误, 因为在循环中 for() , 你已经告诉 php 向你展示从第一个到第五个字符串字符的存在 'ABCD' , 但因为循环开始计算 0 和回显的 D 时间它达到 4 , 它会抛出一个偏移错误。

类似的错误:

第19个答案

分析错误: 语法错误, 意外 T _ 可变

可能的方案

我似乎找不到我的代码出了问题的地方。以下是我的全部错误:

分析错误: 语法错误, 行 x 上出现意外 T _ VARIABLE

我所尝试的

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

回答

分析错误:程序语法的问题, 例如将分号保留在语句的末尾, 或者像上面的大小写一样, 缺少 . 运算符。解释器在遇到分析错误时停止运行程序。

简单地说, 这是一个语法错误, 这意味着您的代码中有某种东西阻止了它被正确地分析, 从而运行。

你应该做的是仔细检查周围的行, 哪里的错误是任何简单的错误。

该错误消息意味着, 在文件的第 x 行中, PHP 解释器希望看到一个打开的括号, 但它遇到了一些调用的东西 T_VARIABLE 。那个 T_VARIABLE 东西叫 token 。它是 PHP 解释器表达程序不同基本部分的方式。当解释器在程序中读取时, 它会将您写入的内容转换为令牌列表。无论您在程序中放置变量的位置, T_VARIABLE 解释器列表中都有一个令牌。

良好阅读: 解析器令牌列表

所以, 一定要 E_PARSE 至少在你的 php.ini 。生产脚本中不应存在分析错误。

我总是建议在编码时添加以下语句:

error_reporting(E_ALL);

Php 错误报告

此外, 使用 IDE 的好主意, 它可以让您在键入时了解分析错误。您可以使用:

  1. 内豆子(一个精美的美丽, 自由软件)(我认为最好的)
  2. Phpstorm(叔叔戈登喜欢这个: P, 付费计划, 包含专有和自由软件)
  3. 日食(美丽和野兽, 自由软件)

相关问题:

第20个答案

警告: 打开 _ basedir 限制生效

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

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

警告本身不会破坏任何内容, 但大多数情况下, 如果阻止文件访问, 脚本就无法正常工作。

修复通常是更改Php 配置, 调用 open_basedir 相关设置。

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

相关问题:

第21个答案

分析错误: 语法错误, 意外的 "["

此错误有两种类型:

备选案文 1

$arr = [1, 2, 3];

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

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

另请参阅手册中的此示例

变式 2

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

PHP 5.4 中还引入了数组取消引用函数的结果。如果无法升级, 则需要使用 (临时) 变量:

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

另请参阅手册中的此示例

第22个答案

注意: 尝试获取非对象错误的属性

当您尝试在没有对象的情况下访问对象的属性时, 会发生这种情况。

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

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

在这种情况下, $users 是一个数组 (所以不是一个对象), 它没有任何属性。

这类似于访问数组的非现有索引或键 (请参阅通知: 未定义的索引)。

这个例子被大大简化了。大多数情况下, 这样的通知发出未检查的返回值, 例如, 当 NULL 一个对象不存在时返回, 或者只是一个意外的非对象值 (例如, 在 Xpath 结果中, 具有意外格式的 JSON 结构, 具有意外格式的 xml 等), 但代码不会检查是否存在这样的情况。

由于这些非对象通常会在更远的位置上进行处理, 因此在非对象上调用对象方法时, 通常会发生致命错误 (请参见:致命错误: 调用成员函数..。在非对象上) 停止脚本。

通过检查错误条件和/或变量是否符合预期), 可以很容易地防止这种情况的发生。下面是带有 domxpath示例的此类通知:

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

问题是访问 nodeValue 第一项的属性 (字段), 而如果该属性在集合中存在或不存在, 则尚未对其进行检查 $result 。相反, 通过为代码所操作的对象分配变量来使代码更加明确是值得的:

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

相关错误:

第23个答案

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

(警告的一个更一般的变体: mysql _ 予数组 () 期望参数 1 是资源, 给出布尔值)

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

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

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

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

var_dumpEd 时, 这些值如下所示:

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

resource(1) of type (curl)

这就是大多数资源, (1) 特定类型 () 的数字标识符 () (curl)

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


"..。要求参数 1 是资源, 给定的布尔值 "错误通常是本应创建资源但返回的未选中操作的结果. false例如, 该 fopen 函数具有以下说明:

返回值

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

因此, 在此代码中, $fp 将是一个 resource(x) of type (stream)false :

$fp = fopen(...);

如果不检查 fopen 操作是否成功或失败, 因此是否 $fp 为有效资源或传递 false $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);

相关错误:

第24个答案

警告: 非法字符串偏移量 "XXX"

当您尝试访问具有方括号语法的数组元素时, 会发生这种情况, 但您是在字符串上执行此操作, 而不是在数组上执行此操作, 因此操作显然没有意义

例子:

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

如果您认为变量应该是一个数组, 请查看它的来源, 并解决那里的问题。

第25个答案

代码不会运行--我的 PHP 代码中看起来像什么部分是输出的

如果您没有看到任何 PHP 代码的结果, 或者您在网页中看到了您的文本 PHP 源代码输出的一部分, 您可以非常肯定的是, 您的 PHP 实际上并没有得到执行。如果您在浏览器中使用 "查看源代码", 则可能会看到整个 PHP 源代码文件的原样。由于 PHP 代码嵌入在 标记中, 浏览器会尝试将其解释为 html 标记, 结果可能会有些混乱。

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

  • 执行脚本的 web 服务器
  • 将文件扩展名设置为. php, 否则 web 服务器不会将其解释为这样 *
  • 通过 web 服务器访问您的. php 文件

* 除非重新配置, 否则可以配置所有内容。

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

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

这完全绕过您可能正在运行的任何 web 服务器, 并且该文件不会被解释。您需要访问 web 服务器上文件的 URL, 可能类似于:

http://localhost/my/file.php

您可能还需要检查是否使用了短打开标记 <> , 而不是 <> php 配置已关闭短打开标记。

还可以看到Php 代码没有被执行, 而是代码显示在页面上

第26个答案

警告: mysql _ connect (): 拒绝用户的 "名称" @ "主机" 访问

当您使用无效或丢失的凭据 (usernaminam\ 密码) 连接到 mysll mariadb 服务器时, 将显示此警告。因此, 这通常不是代码问题, 而是服务器配置问题。

  • mysql_connect("localhost", "user", "pw") 有关示例, 请参阅上的手册页面。

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

    • 你不用密码获得访问权限的情况并不常见--这就是警告: 说的时候发生的 (using password: NO) 事情。

    • 只有本地测试服务器通常允许使用用户名 root 、没有密码和 test 数据库名称进行连接。

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

    • 用户名和密码区分大小写,不会忽略空白。如果您的密码包含元字符, $ 如, 请转义它们, 或将密码放在单引号中。

    • 大多数共享托管提供商预先声明与 unix 用户帐户相关的 mysql 帐户 (有时只是前缀或额外的数字后缀)。有关模式或文档, 请参阅文档, 以及用于设置密码的 CPanel 或任何接口。

    • 请参阅有关使用命令行添加用户帐户的MySQL 手册。当作为管理员用户连接时, 您可以发出如下查询:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • 或者使用Ad 毗邻或工作台或任何其他图形工具来创建、检查或更正帐户详细信息。

    • 如果你不能修复你的凭据, 那么要求互联网 "请帮助" 将没有效果。只有您和您的托管提供商具有诊断和修复内容的权限和足够的访问权限。

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

    • 直接从 web 服务器上的 SSH 控制台检查此信息。从本地开发客户端到共享托管服务器的测试很少有意义。

    • 通常, 您只希望服务器名称是 "localhost" , 它通常使用本地命名套接字 (可用时)。其他时候, 你可以尝试 "127.0.0.1" 作为回退。

    • 如果您的 Mysql\ mariadb 服务器在不同的端口上侦听, 则使用 "servername:3306"

    • 如果失败, 则可能存在防火墙问题。(主题外, 不是编程问题。不可能有远程猜测帮助。

  • 当使用常量 DB_USER , 例如或 DB_PASSWORD , 检查它们是否已实际定义

    • 如果你得到一个 "Warning: Access defined for 'DB_USER'@'host'" 和一个 "Notice: use of undefined constant 'DB_PASS'" , 那就是你的问题。

    • 验证您的例如 xy/db-config.php 是否实际包含在内。

  • 检查是否正确设置 GRANT 了权限。

第27个答案

注意: 到字符串转换的数组

如果您尝试将数组视为字符串, 则会发生这种情况:

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

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

数组不能简单地 echo 与字符串连接, 因为结果没有很好地定义。PHP 将使用字符串 "Array" 代替数组, 并触发通知指出, 这可能不是预期的, 您应该在这里检查您的代码。您可能想要这样的东西, 而不是:

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
}

如果此通知出现在您不期望的某个位置, 则表示您认为是字符串的变量实际上是一个数组。这意味着您的代码中有一个错误, 它使此变量成为数组, 而不是您所期望的字符串。

第28个答案

警告: 按零划分

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

$value = @(2 / 0);

但是, 与任何警告一样, 最好的办法是追踪警告的原因并加以解决。 警告的原因将来自您尝试除以 0、等于 0 的变量或未分配的变量 (因为 NULL = = 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
}

相关问题:

第29个答案

严格标准: 非静态方法[: ] 不应静态调用

当您尝试调用类上的非静态方法时发生, 因为它是静态的, 并且您的 E_STRICT 设置中也有该标志 error_reporting()

例子:

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

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

实际上, 您可以避免此错误, 不添加 E_STRICTerror_reporting() , 例如

error_reporting(E_ALL & ~E_STRICT);

因为对于 PHP 5.4.0 及以上, E_STRICT 包括在 E_ALL [ref]。但这是不可建议的。解决方案是将预期的静态函数定义为实际 static 函数:

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

或常规调用该函数:

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

相关问题:

第30个答案

致命错误: [TraitA] 和 [TraitA] 在 [c 类] 的组成中定义相同的属性 ([$x])

当一个类尝试 use 多个特征时发生, 其中两个或多个这些特征已使用相同的名称定义了一个属性, 并且属性具有不同的初始值。

例子:

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


相关问题:

相关问题

mysql _ 拿给数组 ()/mysql_fetch_assoc ()/mysql_fetch_row ()/mysql_num_rows 等希望参数1是资源或结果 参考-此错误在 PHP 中意味着什么? 如何在 PHP 中分析和处理 HTML\ xml? 如何防止 PHP 中的 SQL 注入? 面向对象编程-如何避免过程中因变量而略有不同的重复 我怎样才能限制我的客户从类中选择的方法? PHP 分析/语法错误;以及如何解决这些问题? 打印 () 方法将传递的表达式与计算输出一起打印,以便快速调试 "注意: 未定义的变量"、"注意: 未定义的索引" 和 "注意: 未定义的偏移量" 使用 PHP 为什么我总是启用编译器警告?