首页 文章

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

提问于
浏览
1095

我正在运行 PHP 脚本并继续收到如下错误:

注意:未定义的变量:第 10 行的 C:\ wamp\www\mypath\index.php 中的 my_variable_name

注意:第 11 行的未定义索引:my_index C:\ wamp\www\mypath\index.php

第 10 行和第 11 行看起来像这样:

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

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

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

我该如何解决?


这是一般参考问题

相关元讨论:

28 回答

  • 1003

    注意:未定义的变量

    来自PHP 手册的广阔智慧:

    在将一个文件包含到使用相同变量名称的另一个文件的情况下,依赖于未初始化变量的默认值是有问题的。它也是register_globals的主要安全风险开启。如果使用未初始化的变量,则会发出E_NOTICE级错误,但是在未初始化的数组中附加元素时则不会。 isset()语言构造可用于检测变量是否已经初始化。另外,更理想的是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。

    来自PHP 文档

    如果变量不存在,则不会生成警告。这意味着empty()基本上简洁等同于!isset($var)|| $var == false

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

    例:

    $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 "\n";
    });
    

    3v4l.org 在线 PHP 编辑器中测试上面的片段

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

    处理问题的方法:

    • **推荐:**声明您的变量,例如当您尝试将字符串附加到未定义的变量时。或者在引用它们之前使用isset()/!empty()来检查它们是否被声明,如:
    //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 开始,这变得更加清晰,现在你可以使用null coalesce operator

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
    • 禁用报告中的 E_NOTICE。只排除E_NOTICE的快速方法是:
    error_reporting( error_reporting() & ~E_NOTICE )
    

    **注意:**强烈建议仅执行第 1 点。

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

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

    处理问题的方法:

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
    • 语言构造list()可能在尝试访问不存在的数组索引时生成:
    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

    两个变量用于访问两个数组元素,但是只有一个数组元素 index 0,所以这将生成:

    注意:未定义的偏移量:1

    $_POST/$_GET/$_SESSION 变量

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

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

    有关:

  • 130

    试试这些

    Q1:此通知表示$varname 未在脚本的当前范围内定义。

    Q2:在使用任何可疑变量之前使用 isset(),empty()条件效果很好。

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

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

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

    关于会话的说明:

  • 60

    错误显示@运算符

    对于不需要的和冗余的通知,可以使用专用的@运营商到»hide«undefined variable/index 消息。

    $var = @($_GET["optional_param"]);
    
    • 通常不鼓励这样做。新移民倾向于过度使用它。

    • 对于应用程序逻辑深处的代码(忽略你不应该的未声明的变量),这是非常不合适的,e.g. 用于函数参数或循环。

    • 然而,isset?:?? super-supression 有一个好处。通知仍然可以记录。并且可以通过以下方式恢复@ -hidden 通知:set_error_handler("var_dump");

    • 另外,您不应该习惯性地在初始代码中使用 use/recommend if (isset($_POST["shubmit"]))

    • 新人不会发现这样的错别字。它只是剥夺了 PHP 的注意事项。仅在验证功能后添加@isset

    首先解决原因。不是通知。

    • @主要适用于$_GET/$_POST输入参数,特别是如果它们是可选的。

    由于这涵盖了大多数此类问题,让我们扩展最常见的原因:

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

    • 遇到未定义的 index/offset 时,你要做的第一件事是检查拼写错误:
      $count = $_GET["whatnow?"];

    • 这是一个预期的密钥名称并出现在每个页面请求中吗?

    • 变量名数组标记在 PHP 中为 case-sensitive。

    • 其次,如果通知没有明显原因,请使用var_dumpprint_r来验证所有输入数组的内容:

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

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

    浏览器开发者工具/网络选项卡

    POST 参数和 GET 输入将单独显示。

    print_r($_SERVER);
    

    PHP 有一些规则将合并 non-standard 参数名称放入 superglobals 中。 Apache 也可能会进行一些重写。您还可以通过这种方式查看提供的原始$_COOKIES和其他 HTTP 请求标头。

    • 更明显地看一下GET 参数的浏览器地址栏:

    http://example.org/script.php?id=5&sort=desc

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

    • 最后检查你的**<form>和<input>**声明,如果你期望一个参数但是没有收到。

    • 确保每个必需的输入都有<input name=FOO>

    • id=title=属性不够。

    • 一个method=POST形式应该填充$_POST

    • method=GET(或将其遗漏)会产生$_GET变量。

    • 表单也可以通过$_GET 提供action=script.php?get=param,并在$_POST 中提供剩余的method=POST字段。

    • 使用现代 PHP 配置(≥5.6),再次使用$_REQUEST [ '瓦尔']变为可行(非时尚),这会使 GET 和 POST 参数混淆。

    • 如果您正在使用 mod_rewrite,那么您应该检查access.log以及启用RewriteLog以找出缺少的参数。

    $_FILES

    • 相同的健全性检查适用于文件上载和$_FILES["formname"]

    • 另外检查enctype=multipart/form-data

    • <form>声明中的method=POST一样。

    • 另见:PHP 未定义索引错误$_FILES?

    • $_COOKIE数组永远不会在setcookie()之后填充,而是仅在任何后续 HTTP 请求上填充。

    • 此外,它们的有效性超时,它们可能是对子域或单个路径的约束,用户和浏览器可以拒绝或删除它们。

  • 44

    一般是因为“糟糕的编程”,现在或以后都有可能出错。

    • 如果这是一个错误,请首先对变量进行适当的分配:$varname=0;

    • 如果它确实只是有时定义,请在使用之前测试它:if (isset($varname))

    • 如果是因为拼错了,那就纠正错误

    • 也许你甚至会转过警告PHP-settings

  • 40

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

  • 34

    我不想禁用通知,因为它有用,但是想避免太多打字。

    我的解决方案是这个功能:

    function ifexists($varname)
    {
      return(isset($$varname)?$varname:null);
    }
    

    所以,如果我想引用$name 和 echo if exists,我只需写:

    <?=ifexists('name')?>
    

    对于数组元素:

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

    在页面中,如果我想参考$_REQUEST [155]:

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

    获取输入string的最佳方法是:

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

    这个 one-liner 几乎相当于:

    if (!isset($_POST['value'])) {
        $value = null;
    } elseif (is_array($_POST['value'])) {
        $value = false;
    } else {
        $value = $_POST['value'];
    }
    

    如果你绝对想要string值,就像:

    $value = (string)filter_input(INPUT_POST, 'value');
    
  • 25

    这是因为变量'$user_location'没有被定义。如果您正在使用任何 if 循环来声明'$user_location'变量,那么您还必须有一个 else 循环并定义相同的循环。例如:

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

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

    $a=10;
    if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
    echo $user_location;
    
  • 25

    回答“”为什么它们突然出现?我以前使用这个脚本多年了,我从来没有遇到任何问题.“

    大多数网站在“显示所有错误,但不是'通知'和'已弃用'”的“默认”错误报告下运行是很常见的。这将在 php.ini 中设置并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他被认为更为关键的错误将是 shown/recorded。

    另一个关键设置是可以隐藏错误(i.e.display_errors设置为“off”或“syslog”)。

    在这种情况下会发生的是,error_reporting被更改为还显示通知(根据示例)and/or,设置在屏幕上更改为display_errors(而不是抑制 them/logging)。

    他们为什么要改变?

    obvious/simplest 答案是有人在 php.ini 中调整了这些设置中的任何一个,或者 PHP 的升级版现在使用了之前的不同 php.ini。这是第一个看的地方。

    但是,也可以覆盖这些设置

    • .htconf(网络服务器配置,包括 vhosts 和 sub-configurations)*

    • .htaccess

    • 在 PHP 代码本身

    其中任何一个也可以改变。

    还有一个额外的复杂性,即 Web 服务器配置可以 enable/disable .htaccess 指令,所以如果.htaccess 中的指令突然 start/stop 工作,那么你需要检查它。

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

    摘要

    • 检查 php.ini 中的error_reportingdisplay_errors php 指令是否未更改,或者您之前没有使用其他 php.ini。

    • 检查.htconf(或 vhosts 等)中的error_reportingdisplay_errors php 指令是否未更改

    • 检查.htaccess 中的error_reportingdisplay_errors php 指令没有改变

    • 如果在.htaccess 中有指令,请检查.htconf 文件中是否仍允许它们

    • 最后检查你的代码;可能是一个无关的图书馆;看看是否已经设置了error_reportingdisplay_errors php 指令。

  • 20

    快速解决方法是在代码顶部将变量赋值为 null

    $user_location = null;
    
  • 16

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

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

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

    再次...Think!更好的解决方案是:

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

    (我使用自定义html()函数来逃避角色,你的里程可能会有所不同)

  • 14

    我用自己有用的函数**exst()**自动声明变量。

    你的代码将是 -

    $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;
    }
    
  • 14

    用非常简单的语言**。
    错误是你使用的是一个变量$user_location,它不是你之前定义的,它没有任何值所以我建议你**********************例:


    $user_location = '';
    要么
    $user_location = 'Los Angles';

    这是一个非常常见的错误,你可以 face.So 不要担心只是声明变量和Enjoy Coding

  • 14

    在 PHP 7.0 中,现在可以使用 Null 合并运算符:

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

    等于:

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

    PHP 手册 PHP 7.0

  • 8

    为什么不把事情简单化?

    <?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
    
    ?>
    
  • 8

    为什么会发生这种情况?

    随着时间的推移,PHP 已成为一种更为 security-focused 的语言。默认情况下,以前关闭的设置现在处于打开状态。一个完美的例子是E_STRICT,默认情况下从PHP 5.4.0开启。

    此外,根据 PHP 文档,默认情况下,php.ini 在 php.ini 中被禁用。 PHP 文档推荐打开它进行调试。但是,当我从 Ubuntu 存储库下载 PHP 并从 BitNami 的 Windows 堆栈中下载时,我看到了别的东西。

    ; 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关闭E_NOTICE并将其替换为error_reporting =中等号后当前未注释的内容。如果使用 CGI 或 FPM,请重新启动 Apache 或 PHP。确保您正在编辑“正确”php.ini。如果您使用 Apache 运行 PHP,那么正确的将是 Apache,如果运行 PHP-FPM 则运行,如果运行 PHP-CGI 则运行 cgi,等等。这不是推荐的方法,但如果您的遗留代码非常难以编辑,那么这可能是你最好的选择。

    • 关闭文件或文件夹级别的E_NOTICE。如果您有一些遗留代码但希望以“正确”方式执行操作,这可能更为可取。要做到这一点,您应该咨询 Apache2,Nginx 或您选择的服务器。在 Apache 中,您将在<Directory>中使用php_value

    • 重写您的代码更清洁。如果您在迁移到生产环境时需要执行此操作,或者不希望有人看到您的错误,请确保您禁用任何错误显示,并且只记录**您的错误(请参阅 php.ini 中的display_errorslog_errors和你的服务器设置)。

    扩展选项 3:这是理想的选择。如果你能走这条路,你应该。如果您最初没有使用此路由,请考虑最终通过在开发环境中测试代码来移动此路由。当你在它的时候,摆脱~E_STRICT~E_DEPRECATED来看看未来会出现什么问题。您将看到很多不熟悉的错误,但是当您将来需要升级 PHP 时,它会阻止您遇到任何不愉快的问题。

    错误意味着什么?

    Undefined variable: my_variable_name - 在使用前未定义变量时会发生这种情况。执行 PHP 脚本时,它在内部只假定一个空值。但是,在哪种情况下,您需要在定义变量之前检查变量?最终,这是“草率代码”的论据。作为一名开发人员,我可以告诉你,当我看到一个开源项目时,我喜欢它,在这个项目中,变量被定义为可以定义的范围内的高位。它可以更容易地告诉将来会弹出哪些变量,并且更容易 read/learn 代码。

    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    

    Undefined index: my_index - 当您尝试访问数组中的值并且它不存在时,会发生这种情况。要防止此错误,请执行条件检查。

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

    另一种选择是在函数顶部声明一个空数组。这并不总是可行的。

    $my_array = array(
        'my_index' => ''
    );
    
    //...
    
    $my_array['my_index'] = 'new string';
    

    (附加提示)

    • 当我遇到这些问题和其他问题时,我使用NetBeans IDE(免费),它给了我许多警告和通知。其中一些提供非常有用的提示。这不是必需的,除了大型项目,我不再使用 IDE。这些天我更像是一个vim人。
  • 6

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

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

    未定义的变量意味着您完全不使用现有变量,或者未使用该名称定义或初始化该变量

    <?php print_r($myvar); ?>
    

    undefined offset 表示您已请求不存在的键。解决方法是在使用前进行检查

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

    关于这部分问题:

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

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

    • 您已将 PHP 升级到较新版本,该版本可能具有 error_reporting,display_errors 或其他相关设置的其他默认值。

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

    • 您更改了 Web 服务器配置(假设此处为 apache):.htaccess文件和 vhost 配置也可以操作 php 设置。

    • 通常不会显示/报告通知(请参阅PHP 手册),因此在设置服务器时,由于某种原因(文件权限??)无法加载 php.ini 文件,并且您处于默认设置。后来,“bug”已经解决(偶然),现在它可以加载正确的 php.ini 文件,并设置 error_reporting 来显示通知。

  • 3

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

    class Person
    {
        protected $firstName;
        protected $lastName;
    
        public function setFullName($first, $last)
        {
            // Correct
            $this->firstName = $first;
    
            // Incorrect
            $lastName = $last;
    
            // Incorrect
            $this->$lastName = $last;
        }
    }
    
  • 3

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

    I.e:

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

    然后尝试在循环内访问更多 columns/rows。

    I.e:

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

    或者在while循环中:

    while( $row = fetching_function($query) ) {
    
        echo $row['col1'];
        echo "<br>";
        echo $row['col2']; // undefined index thrown
        echo "<br>";
        echo $row['col3']; // undefined index thrown
    
    }
    

    需要注意的是,在* NIX OS 和 Mac OS X 上,事情是 case-sensitive。

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

  • 2

    使用三元是简单,可读和干净的:

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

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

    PHP 7
    除了使用空融合运算符之外。不再需要调用isset(),因为它是内置的,并且不需要提供变量来返回,因为它假定返回被检查变量的值:

    $newVariable = $thePotentialData ?? null;
    

    两个都将停止 OP 问题的通知,****两者的确切等效于:

    if (isset($thePotentialData)) {
        $newVariable = $thePotentialData;
    } else {
        $newVariable = null;
    }
    

    如果您不需要设置新变量,那么您可以直接使用三元的返回值,例如使用echo,函数参数等:

    回声:

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

    功能:

    $foreName = getForeName(isset($userId) ? $userId : null);
    
    function getForeName($userId)
    {
        if ($userId === null) {
            // Etc
        }
    }
    

    以上将与数组相同,包括会话等,用 e.g 替换正在检查的变量:
    $_SESSION['checkMe']
    或者你需要多深层次,e.g:
    $clients['personal']['address']['postcode']


    抑制:

    可以使用@来抑制 PHP 通知或降低错误报告级别,但不能解决问题,它只是阻止它在错误日志中报告。这意味着您的代码仍然尝试使用未设置的变量,这可能会或可能不会意味着某些内容无法正常工作 - 具体取决于缺失值的重要性。

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

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

  • 0

    可能你使用旧的 PHP 版本,直到现在升级 PHP,这是它工作的原因,直到现在多年来没有任何错误。直到 PHP4,如果您在没有定义变量的情况下使用变量,则没有错误,但从 PHP5 开始,它会抛出相关问题的错误。

  • 0

    处理文件时,需要正确的 enctype 和 POST 方法,如果表单中没有包含任何索引,则会触发未定义的索引通知。

    手册说明了以下基本语法:

    **** HTML

    <!-- 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

    <?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 '<pre>';
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "File is valid, and was successfully uploaded.\n";
    } else {
        echo "Possible file upload attack!\n";
    }
    
    echo 'Here is some more debugging info:';
    print_r($_FILES);
    
    print "</pre>";
    
    ?>
    

    参考:

  • 0

    提交 HTML 表单后变量不存在的一个常见原因是表单元素未包含在<form>标记中:

    **示例:<form>**中未包含的元素

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

    **示例:元素现在包含在<form>**中

    <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>
    
  • 0

    我问了一个关于这个的问题,我在这篇文章中提到了这样的信息:

    这个问题在这里已有答案:

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

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

    这是错误:

    在此输入图像描述

    第 154 行是问题所在。这就是我在 154 行中的内容:

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

    我认为问题是我正在编写变量$city的条件,这不是关键而是$key => $city中的值。首先,您能否确认这是否是警告的原因?第二,如果那是问题,为什么我不能根据价值写出条件呢?是否必须使用我需要写入条件的密钥?

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

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

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

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

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

    设置错误报告:

    ini_set('error_reporting', 'on');
    ini_set('display_errors', 'on');
    error_reporting(E_ALL);
    

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

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

    为了摆脱这个错误,我们看到以下示例:

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

    我们可以在赋值或使用它们之前将变量初始化为NULL

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

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

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

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

    并修复所有错误。

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

  • -1

    这些通知是因为您没有使用的变量definedmy_index键不存在于$my_array变量中。

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

    解决错误:

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

    解决这个问题的另一种方法:

    ini_set("error_reporting", false)
    
  • -1

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

    //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)){
    
    }
    

    简单说明

    //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";
    }
    

相关问题