php - PHP参考手册- 这里错误是什么意思?

  显示原文与译文双语对照的内容

这是什么?

这是在编写PHP时可能遇到的警告,错误和通知的许多答案,并且不知道如何修复。 这也是一个社区 Wiki,所以大家都被邀请加入并维护这个列表。

为什么是这样?

诸如 "标题已经发送"或者 "调用non-object的成员"的问题经常出现在堆栈溢出上。 这些问题的根源总是相同的。 所以这些问题的答案通常重复它们,然后显示在他/她的特定情况下改变哪个行。 这些答案不会向站点添加任何值,因为它们只适用于特定的操作代码。 具有相同错误的其他用户无法轻松读取解决方案,因为它们太本地化。 这很难过,因为一旦你理解了根本原因,修复这个错误是微不足道的。 因此,这个列表试图以一种通用的方式来解释这个解决方案。

我该怎么做?

如果你的问题被标记为重复的,请在下面找到你的错误消息并将修复应用到你的代码。 答案通常包含进一步的链接,以防在一般答案中不明确。

如果你想贡献,请添加你的"收藏"错误消息,警告或者通知,每行读取一个回答,简短的描述说明它意味着( 即使它只是将术语突出显示到手册页),一种可能的解决方案或者调试的方法和一个现有q&一个内容的列表,都是价值的。 同时,可以随时改进现有的答案。

列表

另请参阅

时间:

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

当脚本试图向客户端发送一个HTTP标头时发生,但以前已经输出过,这导致标题已经发送到客户端。

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

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


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

session_start() 函数将尝试向客户端发送带有会话cookie的标头。 但是PHP在将 <html> 元素写入输出流时已经发送了消息头。 你必须将 session_start() 移动到顶部。

你可以解决为,转浏览文字 之前触发这个警告并检查那里它输出的代码。 在该代码之前移动任何发送代码。

一个经常被忽略的输出是关闭 php ?> 之后的新行。 忽略 ?> 是文件中最后一件事时的标准做法。 同样,这里警告的另一个常见原因是,当打开的<?php 具有空的空格,行或者不可见字符之前,会导致web服务器发送标头和空白/换行符,从而无法提交任何标题。

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

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

相关问题:

严重错误:调用成员函数。。 在non-object上

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

这是一个致命错误,将停止脚本。

大多数情况下,这表示代码缺少对错误条件的检查。 在调用对象之前,确认对象实际上是一个对象。

一个典型的web 示例是


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

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

如果 ->prepare 失败,那么 $pdo 数据库句柄对象没有被传递到当前作用域 。 找到定义的位置。 然后将它作为参数传递,存储为属性,或者通过全局作用域共享它。

相关问题:

注意:未定义的索引

当你试图通过数组中不存在的键访问数组时发生。

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


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

数组中不存在 spinach1,导致触发 E_NOTICE

解决方案是在访问索引之前使用 array_key_exists 或者 isset 来确定索引或者偏移量是否存在。


$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

相关问题:

看不到任何内容。页面为空和白色。

也称为死亡白色页面的或者白屏死机的 。 当错误报告关闭并且发生致命错误( 经常语法错误) 时发生。

如果启用了日志记录,则会在错误日志中找到具体错误消息。 这通常位于一个名为" php_errors.log"的文件中,位于中央位置( 例如。 /var/log/apache2 在许多Linux环境中或者脚本本身的目录中。

有时临时启用错误显示可能更简单。 白皮书将显示错误消息。 注意,因为这些错误对访问网站的所有人都是可见的。

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


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

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

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

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

在日志中查找或者使用显示,你会得到一个更好的错误消息,以及你的脚本停止的代码行。

相关问题:

相关错误:

警告:mysql_fetch_array() 需要参数 1作为资源,布尔值为

首先和最重要的:

在新代码中, 请,请不要使用 mysql_* 等功能。 它们不再维护 ,并且已经被正式否决。 查看 的红色框? 请查阅 预处理语句 相反,并使用 PDO 或者 1 i - 本文将帮助你确定哪种。 如果你选择了 PDO,这里是一个很好的教程。


当你试图从 mysql_query的结果获取数据但查询失败时发生这种情况。

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

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


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

相关问题:

相关错误:

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

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

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

发生这里错误:

  1. 如果non-static方法被静态调用。 例如:

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

    如何修复: 请再次检查代码,$this 只能用在对象上下文中,而不应该是在静态方法中使用。 此外,静态方法不应访问non-static属性。 使用 self::$static_property 访问静态属性。

  2. 如果复制代码从一个类方法已经在全局范围超过转换为普通函数或者只是和 $this 特殊变量的跟踪。
    如何修复: 用不同的代换 variable, 检查代码和替换

相关问题:

  1. 调用non-static方法作为静态: 致命错误:在对象上下文中不使用 $this 时使用
  2. 复制代码:严重错误: 在对象上下文编辑器中不使用 $this 时
  3. 所有"在对象上下文中不使用 $this 时"问题的问题

分析错误:语法错误,意外的T_XXX

当你在意外位置有 T_XXX 标记,不平衡的( 多余的) 括号,在 php.ini, 中使用短标记而不激活它时发生。

相关问题:

有关更多帮助,请参阅:

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

出现于这个扩展你的函数相关 in, php.ini. 中一旦发生丢失的扩展插件,安装该扩展插件并启用它,请参考安装说明PHP中的妥善

如果该函数被引入在从你所使用的是较新版本的PHP中,你可能会发现了本手册的其他实现或者它的留言里的链接。 如果已经从PHP中删除,查找关于原因的信息,因为它可能不再是必需的。

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

如果出现错误,请修正错误。

相关问题:

致命错误:允许的内存大小已经用尽( 尝试分配XXX字节)

内存不足,无法运行你的脚本。 PHP已经达到内存限制并停止执行它。 这里错误致命,脚本停止。 在脚本中使用 ini_set('memory_limit','128 M');内存限制值的值既可以配置php.ini 文件中的或者 by. 内存限制的目的是防止单一的PHP脚本占用所有可用内存并使整个站点服务器崩溃。

首先要做的是最小化脚本需要的内存量。 例如如果你正在将一个大文件读入一个变量,或者从一个数据库获取许多记录,并将它们全部存储在一个数组中,那么这可能会使用大量内存。 更改你的代码,改为逐行读取文件行,或者一次获取一个数据库记录,而不用将它们全部存储在内存中。 这需要对场景背后的内容和数据存储在内存中的位置有一点概念意识。

如果脚本未执行memory-intensive工作时发生这里错误,则需要检查代码以查看是否有内存泄漏。 memory_get_usage 函数是你的朋友。

相关问题:

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

在直接使用 empty 函数时通常会发生这种情况。

例如:


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

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

相关问题:

...