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

注意:未定义变量my_variable_name在C:\wamp\www\mypath\index.php第10行 注意:第11行未定义索引:my_index C:\wamp\www\mypath\index.php 警告:在C:\wamp\www\mypath\index.php第11行未定义数组键“my_index”

第10和11行是这样的:

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

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

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

我该如何修复它们?


这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。 相关元讨论: 如何应对重复的问题? “参考问题”有意义吗?


当前回答

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

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

上面的方法同样适用于数组,包括会话等,将检查的变量替换为:

$ _SESSION(“checkMe”)

或者取决于你需要多少层深度,例如:

美元的客户(“个人”)(“地址”)(“邮政编码”)


抑制:

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

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

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

其他回答

注意/警告:未定义变量

尽管PHP不需要变量声明,但它还是推荐这样做,以避免一些安全漏洞或错误,例如忘记为稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个E_WARNING级别的错误。

这个警告可以帮助程序员发现拼写错误的变量名。此外,未初始化的变量还有其他可能的问题。正如PHP手册中所述,

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。

表示在主文件中未初始化,此变量可能被包含文件中的变量重写,这可能导致不可预知的结果。为了避免这种情况,最好对php文件中的所有变量进行初始化

处理这个问题的方法:

建议:声明你的变量,例如当你试图将一个字符串附加到一个未定义的变量。或者使用isset()在引用它们之前检查它们是否被声明,如下所示: //初始化变量 $value = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $价值;//没有错误 用空合并运算符抑制错误。 //空合并运算符 Echo $value ??”; 对于古老的PHP版本(< 7.0),可以使用带三元的isset() 返回isset($value) ?$value: "; 但是要注意,它本质上仍然是一个错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止PHP通过标记一个统一变量来帮助您。 使用@操作符抑制错误。因为历史原因留在这里,但说真的,这不应该发生。

注意:强烈建议只实现第1点。

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

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

处理这个问题的方法都差不多:

建议:声明你的数组元素: //初始化变量 $array['value'] = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $数组(“价值”);//没有错误 用空合并运算符"抑制错误: echo $_POST['value'] ?”; 对于数组,这个操作符更合理,因为它可以用于您无法控制的外部变量。因此,可以考虑将它仅用于外部变量,例如$_POST / $_GET / $_SESSION或JSON输入。而所有内部数组最好先进行预定义/初始化。 更好的是,验证所有输入,将其分配给局部变量,并在代码中自始至终使用它们。所以你要访问的每个变量都是故意存在的。

相关:

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

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

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

关于这部分问题:

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

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

您已经将PHP升级到一个新的版本,该版本可以为error_reporting、display_errors或其他相关设置设置其他默认值。 您已经删除或引入了一些在运行时使用ini_set()或error_reporting()设置相关设置的代码(可能是在依赖项中)(在代码中搜索这些代码) 你改变了web服务器配置(假设这里是apache): .htaccess文件和vhost配置也可以操作php设置。 通常通知不会被显示/报告(参见PHP手册) 因此,在设置服务器时,php.ini文件可能因为某些原因(文件权限??)而无法加载,而您使用的是默认设置。稍后,“错误”已经解决(意外),现在它可以加载正确的php.ini文件与error_reporting设置显示通知。

快速修复方法是在代码顶部将变量赋值为null:

$user_location = null;

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