1318

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

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

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

警告:第 11 行 C:\wamp\www\mypath\index.php 中未定义的数组键“my_index”

第 10 和 11 行如下所示:

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

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

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

我该如何修复它们?


这是一个一般参考问题,供人们链接到重复,而不是一遍又一遍地解释问题。我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都是非常具体的。

相关元讨论:

4

29 回答 29

1178

注意/警告:未定义的变量

来自PHP 手册的浩瀚智慧:

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

来自PHP 文档

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

这意味着您只能使用empty()来确定变量是否已设置,此外它还会根据以下内容检查变量,0, 0.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默认情况下甚至不报告,但手册建议在开发期间允许

处理问题的方法:

  1. 推荐:声明您的变量,例如当您尝试将字符串附加到未定义的变量时。或者使用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 运算符

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 为 E_NOTICE设置一个自定义错误处理程序并将消息从标准输出重定向(可能到日志文件):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. 从报告中禁用 E_NOTICE。一种快速排除的方法E_NOTICE是:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 使用@ 运算符抑制错误。

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

注意:未定义的索引/未定义的偏移量/警告:未定义的数组键

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

处理问题的方法:

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

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. 当语言结构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 个变量都是超全局变量并且是大写的。

有关的:

于 2010-11-23T21:36:14.763 回答
162

试试这些

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

关于会话的注意事项:

于 2010-11-23T21:31:08.227 回答
75

错误显示@运算符

对于不需要的和多余的通知,可以使用专用@运算符来“隐藏”未定义的变量/索引消息。

$var = @($_GET["optional_param"]);
  • 这通常是不鼓励的。新手往往过度使用它。
  • 它非常不适合应用程序逻辑深处的代码(忽略不应该声明的未声明变量),例如函数参数或循环中的代码。
  • isset?:然而,这种或??超级压制有一个好处。通知仍然可以被记录。并且可以通过以下方式复活@-hidden 通知:set_error_handler("var_dump");
    • 此外,您不应该在初始代码中习惯性地使用/推荐if (isset($_POST["shubmit"]))
    • 新人不会发现这样的错别字。它只是剥夺了您在这些情况下的 PHP 通知。仅验证功能后添加@或。isset
    • 先解决原因。不是通知。

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

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

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

  • 遇到未定义的索引/偏移量时,您要做的第一件事是检查拼写错误:
    $count = $_GET["whatnow?"];

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

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

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

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

    浏览器开发者工具/网络标签

    POST 参数和 GET 输入将分别显示。

  • 对于$_GET参数,您还可以查看QUERY_STRINGin

    print_r($_SERVER);
    

    PHP 有一些规则可以将非标准参数名称合并到超全局变量中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=ortitle=属性是不够的。
    • method=POST应该填充一个表单$_POST
    • 而 a method=GET(或忽略它)会产生$_GET变量。
    • 表单也可以通过 $_GET 和$_POST 中action=script.php?get=param的其余字段提供。method=POST
    • 使用现代 PHP 配置(≥ 5.6),再次使用它变得可行(不时尚)$_REQUEST['vars'],它混合了 GET 和 POST 参数。
  • 如果您正在使用 mod_rewrite,那么您应该同时检查access.log并启用RewriteLog以找出缺少的参数。

$_FILES

  • 相同的健全性检查适用于文件上传和$_FILES["formname"].
  • 此外检查enctype=multipart/form-data
  • 以及method=POST在您的<form>声明中。
  • 另请参阅:PHP 未定义索引错误 $_FILES?

$_COOKIE

  • $_COOKIE数组永远不会在 之后立即填充setcookie(),而只会在任何后续 HTTP 请求中填充。
  • 此外,它们的有效性超时,它们可能受限于子域或单个路径,用户和浏览器可以拒绝或删除它们。
于 2010-11-23T21:40:48.250 回答
53

通常是因为“糟糕的编程”,以及现在或以后出错的可能性。

  1. 如果是错误,请先对变量进行正确的赋值: $varname=0;
  2. 如果它真的只是有时被定义 if (isset($varname)),请在使用它之前对其进行测试:
  3. 如果是因为你拼写错误,那就更正一下
  4. 甚至可能在你的PHP 设置中打开警告
于 2010-11-23T21:31:48.923 回答
47

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

于 2010-11-23T21:35:20.473 回答
38

我不想禁用通知,因为它很有帮助,但我想避免输入过多。

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

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

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

<?= ifexists('name') ?>

对于数组元素:

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

如果我想在一个页面中引用 $_REQUEST['name']:

<?= ifexistsidx($_REQUEST, 'name') ?>
于 2011-12-30T14:14:59.830 回答
31

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

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

这个单线几乎等同于:

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

如果你绝对想要一个字符串值,就像:

$value = (string)filter_input(INPUT_POST, 'value');
于 2014-08-26T22:15:35.073 回答
30

这是因为变量 '$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;
于 2012-12-29T11:46:28.537 回答
29

回复“”为什么会突然出现?我多年来一直使用这个脚本,从来没有遇到过任何问题。”

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

另一个关键设置是可以隐藏错误(即display_errors设置为“关闭”或“系统日志”)。

在这种情况下会发生什么,要么error_reporting更改为还显示通知(根据示例)和/或设置更改为display_errors在屏幕上(而不是抑制它们/记录它们)。

他们为什么变了?

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

但是,也可以在

  • .htconf(网络服务器配置,包括虚拟主机和子配置)*
  • .htaccess
  • 在 php 代码本身中

并且其中任何一个也可能已更改。

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

(.htconf / .htaccess 假设您以 apache 运行。如果运行命令行,这将不适用;如果运行 IIS 或其他网络服务器,那么您需要相应地检查这些配置)

概括

  • 检查error_reportingdisplay_errorsphp.ini 中的 php 指令没有改变,或者你没有使用与以前不同的 php.ini。
  • .htconf(或虚拟主机等)中的检查error_reportingdisplay_errorsphp 指令没有改变
  • .htaccess 中的检查error_reportingdisplay_errorsphp 指令没有改变
  • 如果您在 .htaccess 中有指令,请检查 .htconf 文件中是否仍然允许它们
  • 最后检查你的代码;可能是一个不相关的图书馆;看看那里是否设置error_reportingdisplay_errorsphp 指令。
于 2016-11-23T01:44:03.197 回答
25

快速解决方法是将您的变量分配给代码顶部的 null :

$user_location = null;
于 2014-05-12T19:02:26.150 回答
22

为什么会这样?

随着时间的推移,PHP 已成为一种更加注重安全的语言。以前默认关闭的设置现在默认打开。一个完美的例子是,从PHP 5.4.0E_STRICT开始默认开启。

此外,根据 PHP 文档,默认情况下,在文件php.iniE_NOTICE中禁用。PHP 文档建议将其打开以进行调试。然而,当我从 Ubuntu 存储库和 BitNami 的 Windows 堆栈下载 PHP 时,我看到了别的东西。

; 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之外没有记录,所以我没有在其他发行版上验证这一点。

但是,要回答您的问题,此错误现在会在以前没有弹出时弹出,因为:

  1. 您安装了 PHP 并且新的默认设置文档有些差,但不排除E_NOTICE.

  2. E_NOTICE诸如未定义变量和未定义索引之类的警告实际上有助于使您的代码更清洁、更安全。我可以告诉你,几年前,保持E_NOTICE启用迫使我声明我的变量。它让学习 C 语言变得容易多了。在 C 语言中,不声明变量更麻烦。

我能做些什么呢?

  1. E_NOTICE通过复制“默认值”E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED并将其替换为等号登录后当前未注释的内容来关闭error_reporting =。如果使用 CGI 或 FPM,请重新启动 Apache 或 PHP。确保您正在编辑“正确”的php.ini文件。如果您使用 Apache 运行 PHP,则正确的方法是 Apache,如果运行 PHP-FPM,则为 fpm 或 php-fpm,如果运行 PHP-CGI,则为 cgi,等等。这不是推荐的方法,但如果您有遗留代码非常难以编辑,那么它可能是您最好的选择。

  2. 在文件或文件夹级别关闭E_NOTICE。如果您有一些遗留代码但想要以“正确”的方式做事,这可能会更可取。为此,您应该咨询 Apache 2、Nginx 或任何您选择的服务器。在 Apache 中,您将使用php_valueinside of <Directory>.

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

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

这些错误是什么意思?

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

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

(附加提示)

  • 当我遇到这些和其他问题时,我使用了NetBeanss IDE(免费),它给了我很多警告和通知。其中一些提供了非常有用的提示。这不是必需的,除了大型项目外,我不再使用 IDE。这些天我更像一个vim人:)。
于 2016-11-28T23:01:31.667 回答
20

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

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

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

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

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

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

于 2015-07-28T19:12:50.883 回答
19

在 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

于 2016-12-13T13:34:57.600 回答
18

我一直使用我自己的有用函数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;
}
于 2013-04-09T13:43:28.027 回答
16

用一种非常简单的语言

错误是您使用的$user_location 是您之前未定义的变量,并且它没有任何值。所以我建议你在使用它之前先声明这个变量。例如:


$user_location = '';
或者
$user_location = 'Los Angles';

这是您可能面临的一个非常常见的错误。所以不用担心;只需声明变量并享受编码

于 2015-12-18T11:06:24.963 回答
12

保持简单:

<?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 the array index. Nice
?>
于 2013-06-06T20:37:30.737 回答
10

未定义的索引意味着您请求的数组中的数组索引不可用。例如,

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

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

<?php print_r($myvar); ?>

未定义的偏移量意味着您要求的数组中的键不存在。解决方案是在使用前进行检查:

php> echo array_key_exists(1, $myarray);
于 2017-01-27T08:00:46.583 回答
8

关于这部分问题:

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

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

  1. 您已将 PHP 升级到较新的版本,该版本可以为 error_reporting、display_errors 或其他相关设置提供其他默认值。

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

  3. 您更改了网络服务器配置(假设这里是 apache):.htaccess文件和虚拟主机配置也可以操纵 php 设置。

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

于 2016-11-28T19:31:39.140 回答
7

使用三元运算符简单、易读且干净:

PHP 7之前

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

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

PHP 7+

除了使用空合并运算符之外,其他相同。不再需要调用isset(),因为它是内置的,并且不需要提供要返回的变量,因为它假定返回正在检查的变量的值:

$newVariable = $thePotentialData ?? null;

两者都将停止OP 问题的通知,并且两者都完全等同于:

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

如果您不需要设置新变量,则可以直接使用三元运算符的返回值,例如 with 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
    }
}

以上将与数组相同,包括会话等,将正在检查的变量替换为例如:

$_SESSION['checkMe']

或者无论您需要多少层次,例如:

$clients['personal']['address']['postcode']


抑制:

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

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

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

于 2018-07-06T18:56:38.890 回答
5

如果使用类,您需要确保使用以下方法引用成员变量$this

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
于 2017-05-18T17:15:24.230 回答
4

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

IE:

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

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

IE:

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 上,事情是区分大小写的。

请参阅 Stack 上的以下问答:

于 2017-07-24T16:11:08.433 回答
4

提交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>
于 2018-07-05T20:46:04.633 回答
3

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

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

设置错误报告:

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

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

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

为了摆脱这个错误,我们看下面的例子:

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

我们可以NULL在分配它们的值或使用它们之前初始化变量。

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

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

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

因此,基本上,为开发设置错误报告总是更好。

并修复所有错误。

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

于 2019-04-23T11:30:33.583 回答
2

可能您之前一直在使用旧的 PHP 版本,现在升级了 PHP,这就是它多年来一直工作没有任何错误的原因。

在 PHP 4 之前,如果您在未定义变量的情况下使用变量,则不会出现错误,但从 PHP 5 开始,它会为问题中提到的代码抛出错误。

于 2017-08-30T09:08:24.537 回答
2

我问了一个关于这个的问题,我被提到了这篇帖子,消息是:

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

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

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

这是错误:

在此处输入图像描述

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

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

我认为问题在于我正在为变量编写 if 条件$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)){
于 2018-09-01T18:31:57.277 回答
2

如果您将数据发送到 API,只需使用isset()

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
    # Do something else
}

如果错误是由于会话引起的,请确保您已正确启动会话。

于 2021-04-29T11:46:48.793 回答
-1

处理文件时,需要正确的 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>";

?>

参考:

于 2017-10-07T12:21:51.060 回答
-1

这些通知是因为您没有使用的变量defined,并且my_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)
于 2018-01-25T13:09:56.930 回答
-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 if the variable is defined or undefined
// Isset() does not check that variable has a true or false value
// But it checks the null value of a variable
if(isset($my_variable_name)){

}

简单说明

// It will work with: true, false, and NULL
$defineVariable = false;
if($defineVariable){
    echo "true";
}else{
    echo "false";
}

// It will check if the variable is defined or not and if the variable has a null value.
if(isset($unDefineVariable)){
    echo "true";
}else{
    echo "false";
}
于 2018-05-17T02:43:09.827 回答