我正在运行一个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"];
这些错误消息的含义是什么?
为什么他们会突然出现?我曾经使用这个脚本多年,从来没有任何问题。
我该如何修复它们?
这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。
相关元讨论:
如何应对重复的问题?
“参考问题”有意义吗?
我问了一个关于这个问题的问题,我被推荐到这篇文章,上面写着:
这个问题已经有了答案:
“Notice: Undefined variable”、“Notice: Undefined index”、“Notice: Undefined index”
未定义的偏移量”使用PHP
我在这里分享我的问题和解决方案:
这是错误:
第154行就是问题所在。第154行是这样的
153 foreach($cities as $key => $city){
154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
我认为问题是我正在为变量$city写if条件,它不是键,而是$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)){
使用三元运算符简单、易读、干净:
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输入。而所有内部数组最好先进行预定义/初始化。
更好的是,验证所有输入,将其分配给局部变量,并在代码中自始至终使用它们。所以你要访问的每个变量都是故意存在的。
相关:
注意:未定义变量
注意:未定义索引
HTML表单提交后变量不存在的一个常见原因是表单元素没有包含在<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 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>