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

本文详细探讨了在PHP编程中遇到的'注意:未定义的变量'、'注意:未定义的索引'和'注意:未定义的偏移量'错误。错误通常源于未声明或初始化的变量、数组索引和偏移量。开发者分享了解决这些问题的不同策略,包括使用isset()和empty()函数、初始化变量、检查变量是否存在以及调整PHP错误报告设置。文章还提醒开发者,这些错误可能是代码质量提升的机会,鼓励遵循最佳实践来编写更安全的代码。
摘要由CSDN通过智能技术生成

我正在运行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"];

这些错误消息是什么意思?

为什么它们突然出现? 我曾经使用此脚本多年,但从未遇到任何问题。

我该如何解决?


这是一个供人们链接为重复的通用参考问题 ,而不必一遍又一遍地解释该问题。我认为这是必要的,因为有关此问题的大多数实际答案都是非常具体的。

相关元讨论:


#1楼

这是因为未定义变量'$ user_location'。 如果要在其中声明“ $ user_location”变量的情况下使用if循环,则还必须具有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楼

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

#3楼

为什么不保持简单?

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

?>

#4楼

快速的解决方法是在代码顶部将变量分配为null

$user_location = null;

#5楼

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

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

#6楼

我曾经诅咒这个错误,但是提醒您避免用户输入可能会有所帮助。

例如,如果您认为这很聪明,则简写代码:

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

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

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

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


#7楼

用非常简单的语言
错误是您使用的变量$user_location之前没有定义,并且没有任何值,因此我建议您 使用 声明此变量,例如:


$user_location = '';
要么
$user_location = 'Los Angles';
这是您可能会遇到的非常常见的错误。因此,不必担心,只需声明变量并 享受编码即可


#8楼

回答“”,为什么它们突然出现? 我曾经使用此脚本多年,而且从未遇到任何问题。”

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

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

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

为什么要改变?

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

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

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

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

Web服务器配置可以启用/禁用.htaccess指令还增加了复杂性,因此,如果您在.htaccess中有突然启动/停止工作的指令,则需要进行检查。

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

摘要

  • 检查php.ini中的error_reportingdisplay_errors php指令没有更改,或者您没有使用与以前不同的php.ini。
  • 检查.htconf(或虚拟主机等)中的error_reportingdisplay_errors php指令是否已更改
  • 检查.htaccess中的error_reportingdisplay_errors php指令未更改
  • 如果您在.htaccess中有指令,请检查.htconf文件中是否仍然允许使用它们
  • 最后检查您的代码; 可能是无关的库; 查看是否在此处设置了error_reportingdisplay_errors php指令。

#9楼

关于这部分问题:

为什么它们突然出现? 我曾经使用此脚本多年,但从未遇到任何问题。

没有确切的答案,但是以下是一些设置可能会“突然”更改的可能解释:

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

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

  3. 您更改了Web服务器配置(此处为apache) .htaccess文件和虚拟主机配置也可以操纵php设置。

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


#10楼

为什么会这样?

随着时间的流逝,PHP已成为一种更加注重安全性的语言。 以前默认情况下已关闭的设置现在默认情况下已打开。 一个完美的例子就是E_STRICT ,它从

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值