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

我正在运行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)

2 years ago

试试这些

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

关于会话的说明:

2 years ago

在一个非常 Simple Language .
错误是你使用的变量 $user_location 不是你之前定义的,它没有任何值所以我建议你请 declare 这个变量 before using 它,例如:


$user_location = '';
Or
$user_location = 'Los Angles';

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

2 years ago

在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 manual PHP 7.0

2 years ago

为什么会发生这种情况?

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

此外,根据PHP文档,通过defualt,在php.ini中禁用 E_NOTICE . PHP文档推荐turning it on for debugging purposes . 但是,当我从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 实际上默认设置为 生产环境 值,而不是默认设置为"default"值 . 这有点令人困惑,并没有在php.ini之外记录,所以我在其他发行版上有 not 验证了这一点 .

但是,要回答您的问题,此错误会在之前未弹出时突然显示,因为:

  • 您安装了PHP并且新的默认设置文档记录较差,但不排除 E_NOTICE .

  • E_NOTICE 警告,如未定义的变量和未定义的索引实际上有助于使您的代码更清洁,更安全 . 我可以告诉你,多年前,保持 E_NOTICE 启用迫使我声明我的变量 . 它使得学习C更容易,其中没有声明变量更令人讨厌 .

我可以做些什么?

  • 通过复制"Default value" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 关闭 E_NOTICE 并将其替换为 error_reporting = 中等号后当前取消注释的内容 . 如果使用CGI或FPM,请重新启动Apache或PHP . 确保您正在编辑"right" php.ini . 如果您运行PHP,使用Apache,fpm或php-fpm运行PHP-FPM,cgi运行PHP-CGI等,那么正确的将是Apache . 这不是推荐的方法,但如果您有遗留代码,那么非常难以编辑,那么它可能是你最好的选择 .

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

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

扩展选项3:这是理想的选择 . 如果你能走这条路,你应该 . 如果您最初没有使用此路由,请考虑通过在开发环境中测试代码来最终移动此路由 . 当你在它的时候,摆脱 ~E_STRICT~E_DEPRECATED 看看将来会出现什么问题 . 当你需要在将来升级PHP时,你're going to see a LOT of unfamiliar errors, but it'会阻止你有任何不愉快的问题 .

错误意味着什么?

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

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(免费),它给了我许多警告和通知 . 其中一些提供非常有用的提示 . 这不是必需的,而且这些天我不仅仅是 vim 人了:) .

2 years ago

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

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

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

2 years ago

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

2 years ago

错误显示@运算符

对于不需要的和冗余的通知,可以使用专用的@ operator到» hide «未定义的变量/索引消息 .

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

  • It 's very inappropriate for code deep within the application logic (ignoring undeclared variables where you shouldn' t),例如用于函数参数或循环 .

  • 然而, isset?:?? 超级抑制有一个上升空间 . 通知仍然可以记录 . 并且可以通过以下方式恢复 @ 隐藏的通知: set_error_handler("var_dump");

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

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

  • 首先修复原因 . 不是通知 .

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

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

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

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

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

  • 变量名 and 数组指示在PHP中区分大小写 .

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

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

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

browser developer tools / network tab

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

print_r($_SERVER);

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

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

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

  • 最后检查 <form> and <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['vars']已成为feasible(非时尚),它会使GET和POST参数混淆 .

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

$ _FILES

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

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

  • 以及 <form> 声明中的 method=POST .

  • 参见:PHP Undefined index error $_FILES?

$ _COOKIE

  • _40__之后永远不会填充 $_COOKIE 数组,但仅限于任何后续HTTP请求 .

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

2 years ago

Different type of errors

1)Notice: Undefined variable

如果您尚未定义变量并且尝试访问或使用该变量,则会出现此错误 .

例:

<?php
         echo $a;
     ?>

Notice: Undefined variable: a

2)Notice: Undefined index & Undefined offset

这意味着您指的是不存在的数组键 . “Offset”是指数值数组的整数键,“index”是指关联数组的字符串键 .

<?php 
$testArr=array("Test1", "Test2");

print $testArr[2]; //undefined offset

$myArr=array("val1"=>"1", "val2"=>"2");

print $myArr['val3']; //undefined index
?>

2 years ago

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

  • 如果这是一个错误,请制作一个首先正确赋值给变量:$ varname = 0;

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

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

  • 甚至可能会发出警告 PHP-settings

2 years ago

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

Example: Element not contained within the <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>

Example: Element now contained within the <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>

2 years ago

关于这部分问题:

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

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

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

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

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

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

2 years ago

使用ternary简单,易读且干净:

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

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

PHP 7+
除了使用Null Coalescing Operator之外 . 不再需要调用 isset() ,因为它是内置的,并且不需要提供变量来返回,因为它假定返回被检查变量的值:

$newVariable = $thePotentialData ?? null;

Both 将停止OP问题的通知, both 与以下内容完全相同:

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

如果你没有't require setting a new variable then you can directly use the ternary'的返回值,例如 echo ,函数参数等:

Echo:

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

Function:

$foreName = getForeName(isset($userId) ? $userId : null);

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

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


Suppression:

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

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

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

2 years ago

我一直使用自己有用的函数 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;
}

2 years ago

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

2 years ago

这是因为变量'$ 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;

2 years ago

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

这个问题在这里已经有了答案:“注意:未定义的变量”,“注意:未定义的索引”,以及使用PHP的“注意:未定义的偏移量”

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

这是错误:

第154行是问题所在 . 这就是我在154行中所拥有的:

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

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

更新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)){

2 years ago

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

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

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

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

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

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

2 years ago

为什么不把事情简单化?

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

?>

2 years ago

In reply to ""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中设置并应用于服务器上的所有站点 . 这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他错误(被认为更为关键)将被显示/记录 .

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

在这种情况下会发生的事情是 error_reporting 被更改为也显示通知(根据示例)和/或设置在屏幕上更改为 display_errors (而不是抑制它们/记录它们) .

Why have they changed?

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

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

  • .htconf(网络服务器配置,包括虚拟主机和子配置)*

  • .htaccess
    在PHP代码本身

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

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

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

Summary

  • 检查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指令 .

2 years ago

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

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

这个单线几乎相当于:

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

2 years ago

注意:未定义的变量

来自PHP Manual的广阔智慧:

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

PHP documentation开始:

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

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

例:

$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 online PHP editor中的上述片段

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

处理问题的方法:

  • Recommended: 声明您的变量,例如当您尝试将字符串附加到未定义的变量时 . 或者使用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'] ?? '';
  • 为E_NOTICE设置custom error handler并将消息重定向远离标准输出(可能是日志文件):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  • 禁用报告中的E_NOTICE . 排除 E_NOTICE 的快速方法是:
error_reporting( error_reporting() & ~E_NOTICE )

Note: 强烈建议仅实施第1点 .

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

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

处理问题的方法:

//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  • 语言construct 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个变量都是superglobals并且是大写的 .

有关:

2 years ago

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

$user_location = null;

2 years ago

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

即:

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

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

即:

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上,事情都区分大小写 .

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

2 years ago

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

?>

参考:

2 years ago

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

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

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 ['name']:

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

2 years ago

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

<?php 

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

?>

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

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);

2 years ago

这些通知是因为您没有使用 defined$my_array 变量中没有使用的变量 definedmy_index 键 .

这些通知每次都被触发,因为你的 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)

2 years ago

在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)){

}

Simple Explanation

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