关于数组:使用PHP的“注意:未定义的变量”,“注意:未定义的索引”和“通知:未定义的偏移量”

“Notice: Undefined variable”, “Notice: Undefined index”, and “Notice: Undefined offset” using PHP

我正在运行一个PHP脚本,并继续收到以下错误:

Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php on line 10

Notice: Undefined index: my_index C:\wamp\www\mypath\index.php on line 11

第10行和第11行如下:

1
2
echo"My variable value is:" . $my_variable_name;
echo"My index value is:" . $my_array["my_index"];

这些错误消息的含义是什么?

为什么它们突然出现?我使用这个脚本已经很多年了,我从来没有遇到过任何问题。

我怎么修理它们?

This is a General Reference question for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.

Related Meta discussion:

  • What can be done about repetitive questions?
  • Do"reference questions" make sense?


注意:未定义的变量

从PHP手册的广博智慧来看:

Relying on the default value of an uninitialized variable is problematic in the case of including one file into another which uses the same variable name. It is also a major security risk with register_globals turned on. E_NOTICE level error is issued in case of working with uninitialized variables, however not in the case of appending elements to the uninitialized array. isset() language construct can be used to detect if a variable has been already initialized. Additionally and more ideal is the solution of empty() since it does not generate a warning or error message if the variable is not initialized.

从PHP文档:

No warning is generated if the variable does not exist. That means
empty() is essentially the concise equivalent to !isset($var) || $var
== false.

这意味着您只能使用empty()来确定是否设置了变量,此外,它还会根据以下内容检查变量:0,"",null

例子:

1
2
3
4
5
6
7
8
$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo"
"
;
});

在3v4l.org在线PHP编辑器中测试上述代码段

尽管php不需要变量声明,但它确实建议这样做,以避免某些安全漏洞或错误,因为人们会忘记为脚本中稍后将使用的变量提供值。php在未声明变量的情况下所做的是发出一个非常低级别的错误,E_NOTICE,这个错误在默认情况下甚至没有报告,但是手册建议在开发期间允许。

处理问题的方法:

  • 建议:声明变量,例如,当您试图向未定义的变量附加字符串时。或者使用isset()/!empty()在引用它们之前检查它们是否被声明,如:

    1
    2
    3
    4
    5
    6
    7
    8
    //Initializing variable
    $value =""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';

    与php 7.0相比,这变得更干净了,现在您可以使用空的coalesce操作符:

    1
    2
    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  • 为e_notice设置自定义错误处理程序,并将消息重定向到远离标准输出的位置(可能是指向日志文件):

    1
    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  • 禁止电子通知报告。一种快速排除E_NOTICE的方法是:

  • 使用@运算符取消错误。

  • 注意:强烈建议只执行第1点。

    注意:未定义的索引/未定义的偏移量

    当您(或PHP)尝试访问数组的未定义索引时,会出现此通知。

    处理问题的方法:

  • 在访问索引之前检查它是否存在。为此,您可以使用isset()array_key_exists()

    1
    2
    3
    4
    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  • 当语言构造list()试图访问不存在的数组索引时,它可能会生成:

    1
    2
    3
    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
  • 两个变量用于访问两个数组元素,但是只有一个数组元素index 0,因此将生成:

    Notice: Undefined offset: 1

    $_POST/$_GET/$_SESSION变量

    上述通知通常在与$_POST$_GET$_SESSION合作时出现。对于$_POST$_GET,在使用之前,您只需检查索引是否存在。对于$_SESSION,您必须确保会话从session_start()开始,并且索引也存在。

    还要注意,所有3个变量都是超全局变量,并且都是大写的。

    相关:

    • 注意:未定义的变量
    • 注意:未定义的索引


    试试这些

    Q1: this notice means $varname is not
    defined at current scope of the
    script.

    Q2: Use of isset(), empty() conditions before using any suspicious variable works well.

    1
    2
    3
    4
    5
    6
    7
    8
    // recommended solution for recent PHP versions
    $user_name = $_SESSION['user_name'] ?? '';

    // pre-7 PHP versions
    $user_name = '';
    if (!empty($_SESSION['user_name'])) {
         $user_name = $_SESSION['user_name'];
    }

    或者,作为一种快速而肮脏的解决方案:

    1
    2
    3
    // not the best solution, but works
    // in your php setting use, it helps hiding site wide notices
    error_reporting(E_ALL ^ E_NOTICE);

    关于会话的说明:

    • 使用会话时,需要将session_start();放在所有使用会话的文件中。

    • http://php.net/manual/en/features.sessions.php


    错误显示@运算符

    对于不需要的和多余的通知,可以使用专用的@操作员来?躲起来?未定义的变量/索引消息。

    1
    $var = @($_GET["optional_param"]);
    • 这通常是不鼓励的。新来的人往往过度使用它。
    • 对于应用程序逻辑中的深层代码(忽略不应声明的变量),例如函数参数或循环中的代码,这是非常不合适的。
    • 不过,与isset?:??超级抑制相比,还有一个优势。通知仍然可以被记录。可以用:set_error_handler("var_dump");恢复@隐藏的告示。
      • 另外,您不应该习惯性地在初始代码中使用/推荐if (isset($_POST["shubmit"]))
      • 新来者不会发现这样的打字错误。它只是剥夺了你对这些案件的PHP通知。只有在验证功能后才添加@isset
      • Fix the cause first. Not the notices.

    • @主要用于$_GET/$_POST输入参数,特别是在可选的情况下。

    既然这涵盖了大多数这样的问题,那么让我们进一步讨论最常见的原因:

    $_GET/$_POST/$_REQUEST未定义输入

    • 当遇到未定义的索引/偏移量时,首先要检查是否有错别字:$count = $_GET["whatnow?"];

      • 这是一个预期的键名,并出现在每个页面请求中吗?
      • 在PHP中,变量名和数组指示符区分大小写。
    • 其次,如果通知没有明显原因,则使用var_dumpprint_r验证所有输入数组的当前内容:

      1
      2
      3
      var_dump($_GET);
      var_dump($_POST);
      //print_r($_REQUEST);

      两者都将显示您的脚本是使用正确的参数还是使用任何参数调用的。

    • 交替或另外使用浏览器开发工具(F12)并检查"网络"选项卡中的请求和参数:

      browser developer tools / network tab

      post参数和get输入将分别显示。

    • 对于$_GET参数,您还可以在中查看QUERY_STRING

      1
      print_r($_SERVER);

      PHP有一些规则可以将非标准参数名合并为超全局参数。Apache也可以进行一些重写。您还可以通过这种方式查看提供的原始$_COOKIES和其他HTTP请求头。

    • 更明显的是,查看浏览器地址栏以获取参数:

      OCx1〔21〕

      ?问号后面的name=value对是您的查询(get)参数。因此,该URL只能生成$_GET["id"]$_GET["sort"]

    • 最后检查您的

      声明,如果您希望参数,但没有收到参数。

      • 确保每个必需的输入都有一个
      • id=title=属性不足够。
      • method=POST表格应填写$_POST
      • 而一个method=GET(或不加)将产生$_GET变量。
      • 表单还可以通过$GET提供action=script.php?get=param,旁边还有$POST中的其余method=POST字段。
      • 在现代PHP配置中(≥5.6),再次使用$_REQUEST['vars']已经变得可行(不流行),它混合了get和post参数。
    • 如果您使用的是mod-rewrite,那么您应该检查access.log,并使RewriteLog能够找出不存在的参数。

    $_FILES

    • 同样的健全性检查也适用于文件上传和$_FILES["formname"]
    • 另外检查enctype=multipart/form-data
    • 以及你的
      声明中的method=POST
    • 另请参见:php未定义索引错误$u文件?

    $_COOKIE

    • $_COOKIE数组永远不会在setcookie()之后填充,但只能在任何后续HTTP请求上填充。
    • 此外,它们的有效性超时,它们可能是子域或单个路径的约束,用户和浏览器可以拒绝或删除它们。


    一般是因为"编程不好",而且可能会出现现在或以后的错误。

  • 如果是错误的话,首先对变量进行适当的赋值:$varname=0;
  • 如果只是有时才定义它,那么在使用它之前先测试它:if (isset($varname))
  • 如果是因为你拼写错误,那就更正一下。
  • 甚至可以在PHP设置中打开警告

  • 这意味着您正在测试、评估或打印尚未分配任何内容的变量。这意味着您要么输入错误,要么需要先检查变量是否已初始化为某个值。检查您的逻辑路径,它可以在一个路径中设置,但不能在另一个路径中设置。


    我不想禁用通知,因为它很有用,但我想避免输入太多内容。

    我的解决方案是这个函数:

    1
    2
    3
    4
    function ifexists($varname)
    {
      return(isset($$varname)?$varname:null);
    }

    因此,如果我想引用$name和echo(如果存在),我只需写下:

    1
    <?=ifexists('name')?>

    对于数组元素:

    1
    2
    3
    4
    function ifexistsidx($var,$index)
    {
      return(isset($var[$index])?$var[$index]:null);
    }

    在第页中,如果我想引用"$U REQUEST[‘name’]":

    1
    <?=ifexistsidx($_REQUEST,'name')?>


    获取输入字符串的最佳方法是:

    1
    $value = filter_input(INPUT_POST, 'value');

    这一衬垫几乎等同于:

    1
    2
    3
    4
    5
    6
    7
    if (!isset($_POST['value'])) {
        $value = null;
    } elseif (is_array($_POST['value'])) {
        $value = false;
    } else {
        $value = $_POST['value'];
    }

    如果您绝对想要字符串值,就像:

    1
    $value = (string)filter_input(INPUT_POST, 'value');

    回答"为什么它们突然出现?我使用这个脚本已经很多年了,我从来没有遇到过任何问题。"

    对于大多数站点来说,在"显示所有错误,但不显示‘通知’和‘不推荐’的‘默认’错误报告"下操作是很常见的。这将在php.ini中设置,并应用于服务器上的所有站点。这意味着示例中使用的那些"通知"将被抑制(隐藏),而其他被认为更重要的错误将被显示/记录。

    另一个关键设置是可以隐藏错误(即display_errors设置为"off"或"syslog")。

    在这种情况下会发生的情况是,要么error_reporting被更改为同时显示通知(根据示例),要么设置在屏幕上被更改为display_errors(而不是禁止它们/记录它们)。

    他们为什么变了?

    显而易见/最简单的答案是,有人在php.ini中调整了这些设置,或者升级后的php版本现在使用的是与以前不同的php.ini。那是第一个看的地方。

    但是,也可以在

    • .htconf(Web服务器配置,包括vhosts和子配置)*
    • HTAccess
    • 在PHP代码中

    其中任何一个也可能被改变。

    还有一个额外的复杂性,即Web服务器配置可以启用/禁用.htaccess指令,因此如果在.htaccess中有突然启动/停止工作的指令,则需要检查它。

    (.htconf/.htaccess假定您以apache身份运行。如果运行命令行,则不适用;如果运行IIS或其他Web服务器,则需要相应地检查这些配置)

    总结

    • 检查php.ini中的error_reportingdisplay_errorsphp指令没有更改,或者您没有使用与以前不同的php.ini。
    • 检查.htconf(或vhosts等)中的error_reportingdisplay_errorsphp指令是否未更改。
    • 检查.htaccess中的error_reportingdisplay_errorsphp指令没有更改。
    • 如果在.htaccess中有指令,请检查.htconf文件中是否仍允许使用这些指令。
    • 最后检查您的代码;可能是一个不相关的库;看看是否在那里设置了error_reportingdisplay_errorsphp指令。

    因为变量"$user_location"未被定义。如果您使用的是任何if循环,其中声明了"$user_location"变量,那么您还必须有一个else循环并定义相同的变量。例如:

    1
    2
    3
    $a=10;
    if($a==5) { $user_location='Paris';} else { }
    echo $user_location;

    上述代码将创建错误,因为if循环不满足,并且在else循环中未定义"$user_location"。仍然要求PHP回送变量。因此,要修改代码,必须执行以下操作:

    1
    2
    3
    $a=10;
    if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
    echo $user_location;


    快速修复方法是在代码顶部将变量赋给空值。

    1
    $user_location = null;

    我曾经诅咒过这个错误,但是提醒你避开用户输入是很有帮助的。

    例如,如果您认为这是一个聪明的速记代码:

    1
    2
    // Echo whatever the hell this is
    <?=$_POST['something']?>

    …再想想!更好的解决方案是:

    1
    2
    // If this is set, echo a filtered version
    <?=isset($_POST['something']) ? html($_POST['something']) : ''?>

    (我使用自定义的html()功能来转义字符,您的里程可能会有所不同)


    我一直使用自己有用的函数exst(),它自动声明变量。

    你的代码是-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $greeting ="Hello,".exst($user_name, 'Visitor')." from".exst($user_location);


    /**
     * Function exst() - Checks if the variable has been set
     * (copy/paste it in any place of your code)
     *
     * If the variable is set and not empty returns the variable (no transformation)
     * If the variable is not set or empty, returns the $default value
     *
     * @param  mixed $var
     * @param  mixed $default
     *
     * @return mixed
     */


    function exst( & $var, $default ="")
    {
        $t ="";
        if ( !isset($var)  || !$var ) {
            if (isset($default) && $default !="") $t = $default;
        }
        else  {  
            $t = $var;
        }
        if (is_string($t)) $t = trim($t);
        return $t;
    }

    用一种非常简单的语言。
    错误是你使用的是一个变量$user_location,它之前没有被你定义,也没有任何值,所以我建议你在使用它之前声明这个变量,例如:


    $user_location = '';

    $user_location = 'Los Angles';


    这是一个很常见的错误,所以不用担心,只要声明变量并享受编码。


    在php 7.0中,现在可以使用空合并运算符:

    1
    echo"My index value is:" . ($my_array["my_index"] ?? '');

    等于:

    1
    echo"My index value is:" . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

    PHP手册PHP 7.0


    为什么会这样?

    随着时间的推移,PHP已经成为一种更加注重安全性的语言。以前默认情况下关闭的设置现在默认情况下打开。一个很好的例子是E_STRICT,从php 5.4.0开始,它默认打开。好的。

    此外,根据php文档,默认情况下,php.ini中禁用E_NOTICE。php-docs建议打开它进行调试。但是,当我从Ubuntu存储库(以及Bitnami的Windows堆栈)下载PHP时,我看到了其他一些东西。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ; Common Values:
    ;   E_ALL (Show all errors, warnings and notices including coding standards.)
    ;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
    ;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
    ;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
    ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    ; Development Value: E_ALL
    ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
    ; http://php.net/error-reporting
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

    注意,error_reporting实际上是默认设置为生产值,而不是默认设置为"默认"值。这有点令人困惑,在php.ini之外没有文档记录,所以我没有在其他发行版上验证过这一点。好的。

    但是,要回答您的问题,此错误在以前未出现时会立即出现,因为:好的。

  • 您安装的PHP和新的默认设置的文档记录比较差,但不排除E_NOTICE。好的。

  • E_NOTICE警告(如未定义的变量和未定义的索引)实际上有助于使代码更干净、更安全。我可以告诉你,多年前,使E_NOTICE保持启用状态迫使我声明变量。这使得学习C变得容易得多,如果不声明变量就麻烦多了。好的。

  • 我该怎么办?

  • 通过复制"默认值"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED并将其替换为当前在error_reporting =中等号后未注释的值,关闭E_NOTICE。如果使用cgi或fpm,请重新启动apache或php。确保您正在编辑"right"php.ini。如果使用apache、fpm或php fpm运行php,则正确的方法是apache;如果运行php-fpm,则为cgi;如果运行php-cgi,则为cgi。这不是推荐的方法,但如果您有非常难以编辑的遗留代码,则可能是最佳选择。好的。

  • 在文件或文件夹级别上关闭E_NOTICE。如果您有一些遗留代码,但希望以"正确"的方式进行操作,那么这可能是更好的选择。要做到这一点,您应该咨询Apache2、nginx或您选择的服务器。在Apache中,您将在的内部使用php_value。好的。

  • 重写代码以使其更干净。如果您在移动到生产环境时需要这样做,或者不希望有人看到您的错误,请确保您禁用了任何错误显示,并且只记录错误(请参阅php.ini中的display_errorslog_errors以及您的服务器设置)。好的。

  • 扩展选项3:这是理想的。如果你能走这条路,你应该走。如果您最初不走这条路,请考虑最终通过在开发环境中测试代码来移动这条路。当你这样做的时候,去掉~E_STRICT~E_DEPRECATED,看看将来会发生什么问题。您将看到许多不熟悉的错误,但当您将来需要升级PHP时,它将阻止您遇到任何不愉快的问题。好的。错误是什么意思?

    Undefined variable: my_variable_name—当变量在使用前未定义时发生。当执行PHP脚本时,它在内部只假设一个空值。但是,在哪种情况下,您需要在定义变量之前检查它?最后,这是一个关于"草率代码"的论点。作为一个开发人员,我可以告诉你,当我看到一个开源项目时,我喜欢它,在这个项目中变量被定义为它们可以定义的范围内的最高点。它可以更容易地判断将来会弹出哪些变量,并使代码的读取/学习变得更容易。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function foo()
    {
        $my_variable_name = '';

        //....

        if ($my_variable_name) {
            // perform some logic
        }
    }

    Undefined index: my_index—当您试图访问数组中的一个值而该值不存在时,就会发生这种情况。要防止此错误,请执行条件检查。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    // verbose way - generally better
    if (isset($my_array['my_index'])) {
        echo"My index value is:" . $my_array['my_index'];
    }

    // non-verbose ternary example - I use this sometimes for small rules.
    $my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
    echo"My index value is:" . $my_index_val;

    另一个选项是在函数顶部声明一个空数组。这并不总是可能的。好的。

    1
    2
    3
    4
    5
    6
    7
    $my_array = array(
        'my_index' => ''
    );

    //...

    $my_array['my_index'] = 'new string';

    (附加提示)

    • 当我遇到这些和其他问题时,我使用了NetBeansIDE(免费),它给了我很多警告和通知。其中一些提供了非常有用的提示。这不是一个需求,除了大型项目之外,我不再使用IDES。我现在更像是一个江户人。

    好啊。


    为什么不保持简单呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    error_reporting(E_ALL); // making sure all notices are on

    function idxVal(&$var, $default = null) {
             return empty($var) ? $var = $default : $var;
      }

    echo idxVal($arr['test']);         // returns null without any notice
    echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

    ?>

    例如,未定义的索引表示在您为不可用的数组索引请求的数组中

    1
    2
    3
    4
    5
    6
    <?php

    $newArray[] = {1,2,3,4,5};
    print_r($newArray[5]);

    ?>

    未定义的变量意味着您使用了完全不存在的变量,或者未使用该名称定义或初始化的变量,例如

    1
    <?php print_r($myvar); ?>

    未定义的偏移量意味着在数组中您请求了不存在的键。以及解决方法是使用前检查

    1
    php> echo array_key_exists(1, $myarray);

    关于这部分问题:

    Why do they appear all of a sudden? I used to use this script for years and I've never had any problem.

    没有明确的答案,但这里有一些可能的解释为什么设置可以"突然"改变:

  • 您已经将php升级到一个更新的版本,该版本可以具有其他错误报告、显示错误或其他相关设置的默认值。

  • 您删除或引入了一些代码(可能是依赖项),这些代码使用ini_set()error_reporting()在运行时设置相关设置(在代码中搜索这些设置)。

  • 您更改了Web服务器配置(假设这里是Apache):.htaccess文件和vhost配置也可以操作PHP设置。

  • 通常通知不会显示/报告(请参阅PHP手册)因此,在设置服务器时,可能由于某种原因(文件权限)无法加载php.ini文件。?)您使用的是默认设置。稍后,"bug"已被解决(意外),现在它可以加载正确的php.ini文件,并将错误报告设置为显示通知。


  • 如果使用类,则需要确保使用$this引用成员变量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Person
    {
        protected $firstName;
        protected $lastName;

        public function setFullName($first, $last)
        {
            // Correct
            $this->firstName = $first;

            // Incorrect
            $lastName = $last;

            // Incorrect
            $this->$lastName = $last;
        }
    }


    引发未定义索引通知的另一个原因是数据库查询中省略了列。

    即。:

    1
    $query ="SELECT col1 FROM table WHERE col_x = ?";

    然后尝试访问循环中的更多列/行。

    即。:

    1
    2
    print_r($row['col1']);
    print_r($row['col2']); // undefined index thrown

    或在while循环中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    while( $row = fetching_function($query) ) {

        echo $row['col1'];
        echo"";
        echo $row['col2']; // undefined index thrown
        echo"";
        echo $row['col3']; // undefined index thrown

    }

    需要注意的是,在*nix OS和mac OS X上,情况区分大小写。

    请参阅堆栈上的以下问答:

    • mysql中的表名是否区分大小写?

    • 查询中的MySQL区分大小写表名

    • mysql-不同服务器中表的区分大小写问题


    使用三元是简单、易读和干净的:

    PHP前7将变量赋给另一个变量的值(如果已设置),否则赋给null(或任何您需要的默认值):

    1
    $newVariable = isset($thePotentialData) ? $thePotentialData : null;

    PHP 7 +除使用空合并运算符外,其他方法相同。不再需要调用isset(),因为它是内置的,也不需要提供变量来返回,因为它假定返回被检查变量的值:

    1
    $newVariable = $thePotentialData ?? null;

    这两种方法都将阻止操作问题中的通知,并且两者完全等同于:

    1
    2
    3
    4
    5
    if (isset($thePotentialData)) {
        $newVariable = $thePotentialData;
    } else {
        $newVariable = null;
    }

    nbsp;如果不需要设置新变量,则可以直接使用三元的返回值,如与echo和函数参数等:

    艾可:

    1
    echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

    功能:

    1
    2
    3
    4
    5
    6
    7
    8
    $foreName = getForeName(isset($userId) ? $userId : null);

    function getForeName($userId)
    {
        if ($userId === null) {
            // Etc
        }
    }

    上面对数组(包括会话等)的作用是相同的,将被检查的变量替换为,例如:$_SESSION['checkMe']或您需要的深度,例如:$clients['personal']['address']['postcode']

    nbsp;

    抑制:

    使用@可以禁止php通知或降低错误报告级别,但它不能解决问题,它只是停止在错误日志中报告。这意味着您的代码仍然试图使用一个未设置的变量,这可能意味着某些东西不能按预期工作,这取决于缺少的值有多重要。

    您真的应该检查这个问题并适当地处理它,或者提供一个不同的消息,或者甚至只是返回一个空值来标识精确的状态。

    如果您只关心通知不在错误日志中,那么作为一个选项,您可以忽略错误日志。


    每当我们使用未设置的变量时,就会发生这些错误。

    处理这些问题的最佳方法是在开发过程中设置错误报告。

    要设置错误报告,请执行以下操作:

    1
    2
    3
    ini_set('error_reporting', 'on');
    ini_set('display_errors', 'on');
    error_reporting(E_ALL);

    在生产服务器上,错误报告是关闭的,因此,我们不会得到这些错误。

    但是,在开发服务器上,我们可以在上设置错误报告。

    为了消除此错误,我们看到以下示例:

    1
    2
    3
    4
    if ($my == 9) {
     $test = 'yes';  // Will produce error as $my is not 9.
    }
    echo $test;

    我们可以在分配或使用变量值之前将变量初始化为null

    因此,我们可以将代码修改为:

    1
    2
    3
    4
    5
    $test = NULL;
    if ($my == 9) {
     $test = 'yes';  // Will produce error as $my is not 9.
    }
    echo $test;

    即使$test没有值,也不会干扰任何程序逻辑,也不会发出通知。

    所以,基本上,为开发设置错误报告总是更好的。

    修复所有错误。

    在生产中,错误报告应设置为关闭。


    可能你以前使用的是旧的PHP版本,现在升级了PHP,这就是为什么从现在开始它一直在工作而没有任何错误的原因。在php4之前,如果您使用变量而不定义它,则不会出现错误,但是在php5之后,它会为问题中提到的代码抛出错误。


    处理文件时,需要一个适当的enctype和post方法,如果表单中没有包含这两个方法之一,则会触发一个未定义的索引通知。

    本手册规定了以下基本语法:

    HTML

    1
    2
    3
    4
    5
    6
    7
    8
    <!-- The data encoding type, enctype, MUST be specified as below -->
    <form enctype="multipart/form-data" action="__URL__" method="POST">
        <!-- MAX_FILE_SIZE must precede the file input field -->
        <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
        <!-- Name of input element determines name in $_FILES array -->
        Send this file: <input name="userfile" type="file" />
        <input type="submit" value="Send File" />
    </form>

    PHP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
    // of $_FILES.

    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    echo '[cc lang="php"]';
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo"File is valid, and was successfully uploaded.
    "
    ;
    } else {
        echo"Possible file upload attack!
    "
    ;
    }

    echo 'Here is some more debugging info:';
    print_r($_FILES);

    print"

    ;?>< /代码>

    参考文献:

    • http://php.net/manual/en/features.file-upload.post-method.php


    提交HTML表单后变量不存在的一个常见原因是表单元素不包含在

    标记中:

    示例:不包含在

    中的元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <form action="example.php" method="post">
        <p>

            <input type="text" name="name" />
            <input type="submit" value="Submit" />
       
    </p>
    </form>

    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>

    示例:元素现在包含在

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <form action="example.php" method="post">
        <select name="choice">
            <option value="choice1">choice 1</option>
            <option value="choice2">choice 2</option>
            <option value="choice3">choice 3</option>
            <option value="choice4">choice 4</option>
        </select>
        <p>

            <input type="text" name="name" />
            <input type="submit" value="Submit" />
       
    </p>
    </form>

    我问了一个关于这方面的问题,我被提到了这篇文章,上面写着:

    This question already has an answer here:

    "Notice: Undefined variable","Notice: Undefined index", and"Notice:
    Undefined offset" using PHP

    我在这里分享我的问题和解决方案:

    这是错误:

    enter image description here

    问题出在第154行。这是我在第154行的内容:

    1
    2
    153    foreach($cities as $key => $city){
    154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

    我认为问题在于,我正在为变量$city编写if条件,这不是关键,而是$key => $city中的值。首先,你能确认这是否是警告的原因吗?其次,如果这是问题所在,为什么我不能基于值编写条件?我需要用钥匙写条件吗?

    更新1:问题是,在执行$citiesCounterArray[$key]时,有时$key$citiesCounterArray数组中不存在的键对应,但根据循环的数据,情况并不总是这样。我需要设置一个条件,如果数组中存在$key,那么运行代码,否则跳过它。

    更新2:这是我使用array_key_exists()修复它的方法:

    1
    2
    3
    foreach($cities as $key => $city){
        if(array_key_exists($key, $citiesCounterArray)){
            if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

    这些注意事项是因为您没有使用的变量definedmy_index键没有出现在$my_array变量中。

    每次都会触发这些通知,因为您的code不正确,但可能您没有通知的报告。

    解决错误:

    1
    2
    3
    4
    5
    6
    $my_variable_name ="Variable name"; // defining variable
    echo"My variable value is:" . $my_variable_name;

    if(isset($my_array["my_index"])){
        echo"My index value is:" . $my_array["my_index"]; // check if my_index is set
    }

    另一种解决方法是:

    1
    ini_set("error_reporting", false)

    在PHP中,首先需要定义变量,然后才能使用它。
    我们可以检查变量是否定义的非常有效!.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //If you only want to check variable has value and value has true and false value.
    //But variable must be defined first.

    if($my_variable_name){

    }

    //If you want to check variable is define or undefine
    //Isset() does not check that variable has true or false value
    //But it check null value of variable
    if(isset($my_variable_name)){

    }

    简单的解释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //It will work with :- true,false,NULL
    $defineVarialbe = false;
    if($defineVarialbe){
        echo"true";
    }else{
        echo"false";
    }

    //It will check variable is define or not and variable has null value.
    if(isset($unDefineVarialbe)){
        echo"true";
    }else{
        echo"false";
    }