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

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

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

我该如何修复它们?


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


当前回答

通常是因为“糟糕的编程”,以及现在或以后出现错误的可能性。

如果这是一个错误,首先对变量进行适当的赋值:$varname=0; 如果它确实只是偶尔定义,在使用它之前测试它:If (isset($varname)) 如果是因为你拼写错了,那就改正 甚至可以在你的php设置中打开警告

其他回答

抛出未定义索引通知的另一个原因是数据库查询中遗漏了一列。

例如:

$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操作系统和Mac OS X上,事情是区分大小写的。

参考Stack上的以下问答:

MySQL中的表名是否区分大小写? Mysql查询中区分大小写的表名 MySql -表在不同服务器中的大小写敏感问题

我问了一个关于这个问题的问题,我被推荐到这篇文章,上面写着:

这个问题已经有了答案: “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)){

如果你要向API发送数据,只需使用isset():

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
    # Do something else
}

如果是由于会话导致的错误,请确保已正确启动会话。

当我们使用一个未设置的变量时,就会发生这些错误。

处理这些问题的最佳方法是在开发时设置错误报告。

设置错误报告:

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总是更好的。

并修复所有的错误。

在生产中,错误报告应该设置为关闭。

在处理文件时,需要适当的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方法上传