我正在运行一个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"];
这些错误消息的含义是什么?
为什么他们会突然出现?我曾经使用这个脚本多年,从来没有任何问题。
我该如何修复它们?
这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。
相关元讨论:
如何应对重复的问题?
“参考问题”有意义吗?
未定义的索引意味着在您请求的数组中,数组索引不可用。例如,
<?php
$newArray[] = {1, 2, 3, 4, 5};
print_r($newArray[5]);
?>
一个未定义的变量意味着你完全没有使用一个现有的变量,或者这个变量没有定义或初始化。例如,
<?php print_r($myvar); ?>
未定义的偏移量意味着在数组中请求一个不存在的键。解决这个问题的方法是在使用前检查:
php> echo array_key_exists(1, $myarray);
当我们使用一个未设置的变量时,就会发生这些错误。
处理这些问题的最佳方法是在开发时设置错误报告。
设置错误报告:
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没有值,也不会产生Notice。
因此,基本上,在开发时将错误报告设置为ON总是更好的。
并修复所有的错误。
在生产中,错误报告应该设置为关闭。
在回答“为什么他们突然出现?”我使用这个脚本很多年了,从来没有遇到过任何问题。”
对于大多数网站来说,在“默认”错误报告下操作是很常见的,“显示所有错误,但不显示‘通知’和‘已弃用’”。这将在php.ini中设置,并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他被认为更严重的错误将被显示/记录。
另一个关键设置是可以隐藏错误(即display_errors设置为“off”或“syslog”)。
在这种情况下发生的情况是,error_reporting被更改为也显示通知(如示例所示)和/或设置被更改为屏幕上的display_errors(而不是抑制它们/记录它们)。
他们为什么改变了?
最明显/最简单的答案是有人在PHP .ini中调整了这些设置之一,或者PHP的升级版本现在使用与以前不同的PHP .ini。这是首先要看的地方。
但是,也可以覆盖这些设置
.htconf (webserver配置,包括vhosts和子配置
. htaccess
在PHP代码中
这些都可以被改变。
还有一个额外的复杂性,web服务器配置可以启用/禁用。htaccess指令,所以如果你的。htaccess指令突然启动/停止工作,那么你需要检查它。
(.Htconf / .htaccess假设你以apache运行。如果运行命令行,这将不适用;如果运行IIS或其他web服务器,则需要相应地检查这些配置)
总结
检查php.ini中的error_reporting和display_errors php指令是否更改,或者您使用的php.ini与以前不同。
检查error_reporting和display_errors php指令在.htconf(或vhosts等)没有改变
检查error_reporting和display_errors php指令在.htaccess中没有改变
如果你在.htaccess中有指令,检查它们在.htconf文件中是否仍然被允许
最后检查你的代码;可能是一个不相关的库;查看error_reporting和display_errors PHP指令是否已经设置在那里。
我问了一个关于这个问题的问题,我被推荐到这篇文章,上面写着:
这个问题已经有了答案:
“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)){
在处理文件时,需要适当的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>";
?>
参考:
POST方法上传