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

这是什么?

这是有关警告,错误和注意事项的许多答案,这些警告,错误和注意事项在您对PHP进行编程时可能会遇到,并且不知道如何解决它们。这也是一个社区Wiki,因此邀请所有人参与添加并维护此列表。

这是为什么?

诸如"标题已发送" "调用非对象的成员" 经常在Stack Overflow上弹出。这些问题的根本原因总是相同的。因此,通常会重复这些问题的答案,然后向OP显示在特定情况下要更改的行。这些答案不会为网站增加任何价值,因为它们仅适用于OP的特定代码。具有相同错误的其他用户无法轻松地从中读取解决方案,因为他们过于本地化。令人遗憾的是,一旦您了解了根本原因,就可以轻松地修复错误。因此,该列表试图以一种通用的方式来解释该解决方案。

我该怎么办?

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

如果您想做出贡献,请添加"最喜欢的"错误消息,警告或通知,每个答案一个,简短说明其含义(即使仅在其手册页上突出显示术语),可能的解决方案或调试方法以及有价值的现有问答列表。另外,请随时改善现有的答案。

列表

另外,请参阅:

标签:php,oop,debugging,warnings

回答1:

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

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

这是 E_WARNING 和它不会停止脚本。

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

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

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

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

一个经常被忽略的输出是PHP关闭?>之后的换行符。当?>是文件中的最后一件事时,这被认为是标准做法。同样,此警告的另一个常见原因是,开头的 前面带有空格,行或不可见字符,从而导致Web服务器发送标头和空白/换行符,从而导致PHP开始解析将无法提交任何标头。

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

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

相关问题:

回答2:

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

发生类似于xyz->method()的代码,其中xyz不是对象,因此无法调用method

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

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

A 典型示例为

// ... 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_errors.log"的文件中,位于中央位置(例如,在许多Linux环境中为/var/log/apache2)或在脚本本身的目录中(有时使用在共享托管环境中。

有时,暂时启用错误显示可能更直接。然后,白页将显示错误消息。请小心,因为这些错误对于访问该网站的每个人都是可见的。

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

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

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

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

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

通过查看日志或使用显示,您会得到更好的错误消息以及脚本停止的代码行。

相关问题:

相关错误:

回答4:

注意:未定义索引

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

未定义索引通知的典型示例是(演示)

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

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

解决方案是在访问索引之前确保索引或偏移量存在。这可能意味着您需要修复程序中的错误,以确保这些索引在您期望的时候确实存在。或可能意味着您需要使用 array_key_exists 设置

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the 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

相关问题:

回答5:

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

首要:

请不要使用mysql_* 在新代码中起作用 。它们已不再维护并已正式弃用。看到 红色框 ?改为了解 准备好的声明 ,并使用 PDO MySQLi -本文将帮助您确定哪一个。如果选择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对象上下文"关于Stackoverflow的问题

回答7:

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

在您尝试调用尚未定义的函数时发生。常见原因包括缺少扩展名,包括条件函数声明,函数声明中的函数或简单的错字。

示例1-条件函数声明

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,将不会声明fn(),因为$someCondition不是true。

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

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,仅在调用createFn()时声明fn。请注意,随后对createFn()的调用将触发有关重新声明现有函数的错误。

对于PHP内置功能,您也可能会看到它。尝试在官方手册中搜索该功能,然后检查"扩展"是什么(PHP模块),它属于什么版本的PHP。

万一缺少扩展名,请安装该扩展名并在php.ini中启用它。请参阅PHP手册中的安装说明,以获取功能所在的扩展名。您还可以使用软件包管理器(例如Debian或Ubuntu中的aptyum (在Red Hat或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()的参数必须是 variable ,但是PHP 5.5+允许使用任意表达式(例如函数的返回值)

empty,尽管其名称正确,但实际上并不检查变量是否为" 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:

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

当整个复杂变量构造未包含在{}中时,尝试用引用键引用数组值以在双引号字符串内进行插值时,最常遇到此错误.

错误情况:

这将导致意外的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_NOTICE。 PHP文档建议这样做复杂变量的语法。

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']}";

当然,上述 any 的替代方法是连接数组变量而不是对其进行插值:

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

作为参考,请参见 变量解析部分.syntax.double" rel="noreferrer"> PHP字符串手册页

回答12:

致命错误:已用完XXX个字节的内存大小(尝试分配XXX个字节)

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

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

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

相关问题:

回答13:

警告: [功能] :无法打开流: [原因]

通常在您通过includerequirefopen调用文件而PHP找不到文件或文件不足时发生加载文件的权限。

这可能有多种原因:

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

一个常见的错误是不使用绝对路径。可以使用完整路径或魔术常数(如__DIR __ dirname(__FILE__)

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

或:

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

确保使用正确的路径是解决这些问题的第一步,这还可能与不存在的文件,文件系统的权限阻止PHP本身进行访问或基于openir的限制有关。

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

相关问题:

相关错误:

回答14:

注意:未定义常量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扩展或库。

相关问题:

回答15:

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

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

这意味着您或者两次使用相同的函数/类名,并且需要重命名其中之一,或者是因为您使用了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定义的文件将仅加载一次,并且错误将避免。

回答16:

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

示波器解析度运算符也被称为" Paamayim Nekudotayim",来自希伯来语פעמייםנקודתיים。意思是"双冒号"。

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

相关问题:

文档:

回答17:

注意:未定义的变量

当您尝试使用以前未定义的变量时发生。

一个典型的例子是

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

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

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

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

注意:未定义的属性

此错误的含义大致相同,但涉及对象的属性。重用上面的示例,此代码将触发错误,因为尚未设置counter属性。

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

相关问题:

回答18:

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

可能的情况

我似乎找不到我的代码出错的地方。这是我的完整错误:

解析错误:语法错误,x行上出现意外的T_VARIABLE

我正在尝试

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

答案

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

简单来说,这是一个语法错误,这意味着您的代码中存在某些内容,无法正确解析它并因此无法运行。

您应该做什么,请仔细检查错误所在的行是否有任何简单的错误。

该错误消息表示PHP解释器在文件的第x行中期望看到一个开放的括号,但遇到了称为T_VARIABLE的内容。该T_VARIABLE事物称为token。这是PHP解释器表示程序的不同基本部分的方式。当解释器读入程序时,它将把您编写的内容转换为令牌列表。无论您在程序中的何处放置变量,解释器的列表中都会有一个T_VARIABLE标记。

好读:解析器令牌列表

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

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

error_reporting(E_ALL);

PHP错误报告

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

  1. NetBeans (精美的免费软件)(我认为是最好的)
  2. PhpStorm (高登伯父喜欢这个:P,付费计划,包含专有和免费软件)< / li>
  3. Eclipse (美女与野兽,免费软件)

相关问题:

回答19:

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

顾名思义,当您最有可能尝试使用不存在的键迭代或从数组中查找值时,会发生此类错误。

考虑一下,您正在尝试显示$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'的第一个到第五个字符串字符存在,但由于循环从0开始计数,并在时间之前回显D到达4时,将引发偏移错误。

类似错误:

回答20:

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

在没有对象的情况下尝试访问对象的属性时发生。

非目标通知的典型示例是

$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;

相关错误:

回答21:

警告:open_basedir限制有效

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

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

警告本身不会破坏任何内容,但是如果阻止了文件访问,则脚本通常无法正常工作。

解决方法通常是更改 PHP配置(相关设置)被称为 open_basedir

有时使用错误的文件或目录名称,然后使用正确的解决方法。

相关问题:

回答22:

解析错误:语法错误,意外的'['

此错误来自两个变量:

变化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];

另请参见手册中的此示例

>

回答23:

警告: [功能] 期望参数1为资源,给定布尔值

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

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

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

cURL扩展定义了另一个两种资源类型

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

var_dump设置后,值如下所示:

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

resource(1) of type (curl)

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

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


" ...期望参数1为资源,给定布尔值"错误通常是由于未经检查的操作导致的,该操作应该创建资源,但返回的结果为false。例如, fopen函数具有以下描述:

返回值

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

因此在此代码中,$fp将是(流)类型的resource(x)false

$fp = fopen(...);

如果不检查fopen操作是成功还是失败,以及因此$fp是有效资源还是false,并通过< code> $ 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服务器不会将其解释为**
  • 通过网络服务器访问您的.php文件

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

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

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

这完全绕开了您可能正在运行的任何Web服务器,并且文件未得到解释。您需要访问Web服务器上文件的URL,可能类似于:

http://localhost/my/file.php

您可能还想检查是否使用短打开标记 而不是 ,并且您的PHP配置已关闭短打开标记。 / p>

另请参见未执行PHP代码,而是在页面上显示了代码

回答26:

警告:mysql_connect():用户'name'@'host'的访问被拒绝

当您使用无效或缺少凭据(用户名/密码)连接到MySQL / MariaDB服务器时,将显示此警告。因此,这通常不是代码问题,而是服务器配置问题。

  • 请参见 mysql_connect("localhost","user","pw") 例如。

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

    • 您不使用密码就无法访问-这是警告:说(使用密码:NO)时发生的情况。
    • 仅本地测试服务器通常允许使用用户名root,无密码和test数据库名称进行连接。

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

    • 用户名和密码区分大小写,并且空格被忽略。如果您的密码包含$之类的元字符,请转义它们,或将密码放在单引号

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

    • 请参阅添加用户帐户< / a>使用命令行。以 admin用户的身份连接时,您可以发出以下查询:
      创建用户'username'@'localhost'IDENTIFIEDBY'newpassword';

    • 或使用管理员 WorkBench 或任何其他图形工具来创建,检查或更正帐户详细信息。

    • 如果您无法修改凭据,那么要求互联网"请帮助"将无效。只有您和您的主机提供商才具有权限和足够的权限来诊断和修复问题。

  • 使用提供商提供的主机名来验证您可以访问数据库服务器:
    pingdbserver.hoster.example.net < / p>

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

    • 通常,您只希望服务器名称为"localhost",通常在可用时使用本地命名的套接字。有时,您可以尝试"127.0.0.1"作为后备广告。

    • 您的MySQL / MariaDB服务器应该在其他端口上侦听,然后使用"servername:3306"

    • 如果失败,则可能是防火墙问题。 (离题,不是编程问题。无法提供远程猜测帮助。)

  • 使用常量时,例如DB_USERDB_PASSWORD,请检查它们是否确实定义

    • 如果收到"警告:为'DB_USER'@'主机'定义的访问""注意:使用未定义的常量'DB_PASS'",那就是你的问题。

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

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

  • 如果首先通过警告出现警告:mysql_query():对用户``@'localhost'的访问被拒绝,则您可能会有 php.ini预先配置的帐户/密码对

    • 检查mysql.default_user=mysql.default_password=具有有意义的值。

    • 通常这是提供程序配置。因此,请与他们的支持部门联系以解决不匹配问题。

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

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

  • 您的libmysql客户端版本可能与数据库服务器不兼容。通常,可以使用在驱动程序中编译的PHP来访问MySQL和MariaDB服务器。如果您有一个自定义安装程序,一个过时的PHP版本,一个较新的数据库服务器或一台明显过时的数据库服务器,则版本不匹配可能会阻止连接。 (不,您必须进行调查。没人能猜出您的设置。)

更多参考文献:

顺便说一句,您可能不想使用 mysql _ * 功能不再可用。新手经常迁移到 mysqli ,但这同样乏味。相反,请阅读 PDO和准备好的语句
$db=newPDO("mysql:host = localhost; dbname = testdb","用户名","密码");

回答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,如果为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:

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

在尝试在类上调用非静态方法(因为它是静态的)时发生,并且在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_ALL中包含了E_STRICT [参考]。但这是不可取的。解决方案是将所需的静态函数定义为实际的static

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

或按常规调用该函数:

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

相关问题:

  • 如何我可以解决"非静态方法xxx:xxx()不应在PHP 5.4中静态调用吗?

回答30:

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

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

通常可以在以下位置找到Web服务器error.log

    Linux服务器上的
  • /var/log/apache2,通常用于本地和虚拟主机。
  • /var/www/_user12345_/logs或类似的共享主机计划。
    通常,每个htdocs/旁边都有一个logs/目录。 code>文件夹。
  • C:\xampp\apache\logs\error.log用于 WAMP / XAMPP Apache + PHP的发行版。
  • 或者只是使用文件搜索功能来定位称为" error.log"的任何内容。
    或查看您的Apache httpd.conf及其ErrorLog指令。
  • /var/log/nginx/nginx_error.log用于 NGINX
  • C:\inetpub\logs\LogFiles用于 IIS

这是一个文本文件。搜索与错误时间最接近的条目,并使用错误消息的重要部分(从" PHP错误:…"到"在线…")进行进一步的谷歌搜索。

[星期一22:10][:错误][pid12345][客户端127.0.0.1]FastCGI:服务器"/fcgi/p73"stderr:PHP消息: PHP错误:845行上filyfile.php中未过滤的输入 变量$_JSON['pokestop_lng']

对于FPM设置,您通常只会在这里看到致命的PHP错误。较旧的mod_php(共享主机)配置通常会混入警告和通知(通常也值得检查)。

如果未配置为使用系统或Apache日志记录机制,则可能还需要查看 PHP的error.log 。通常,保留默认值更简单,只需启用error_display + error_reporting即可显示具体错误。毕竟,HTTP 500的全部捕获页面只是 PHP死亡白屏的变体

另请参阅:

回到顶部