为什么即使var_dump()显示索引已定义,我仍然会收到未定义的索引错误?

时间:2012-12-19 19:43:45

标签: php undefined-index

我正在创建一个应用程序来帮助跟踪我们青年事工中的孩子们为夏令营赚取的奖学金。应用程序的这一部分选择他们当前从数据库中获得的金额,将其保存到名为$ oldAmount的变量中,将其添加到$ fundsAmount,并使用新的资金金额更新数据库。

    //Select student's current allocated funds amount and save to $studentFunds array
    $selectQuery = "SELECT studentFunds FROM students WHERE studentNum = $studentNum";
    $selectStatement = $db -> prepare($selectQuery);
    $selectStatement -> execute();
    $studentFunds = $selectStatement -> fetchAll();

    //DEBUG: Display value of studentFunds array
    echo "Value of array studentFunds before operation: ";
    var_dump($studentFunds);

    //Save the value of $studentFunds['studentFunds'] to $oldAmount
    $oldAmount = $studentFunds['studentFunds'];

    //Perform operation: add old amount and new funds amount together
    $studentNewAmount = $oldAmount + $fundsAmount; 

    //DEBUG: display $studentNewAmount
    echo "Value of studentNewAmount after operation: ";
    echo $studentNewAmount;

    //DEBUG: $studentNewAmount = 255;
    $db -> query("UPDATE students SET studentFunds = '$studentNewAmount' WHERE studentNum = $studentNum");

出于某种原因,每当我运行应用程序时,我都会收到此错误:

  

注意:未定义的索引:第31行的C:\ xampp \ htdocs \ scholarshipManager \ model \ insertAllocation.php中的studentFunds

第31行在这里:

        $oldAmount = $studentFunds['studentFunds'];

var_dump()显示$ studentFunds数组的以下内容:

操作前数组studentFunds的值:

array(1) { 
    [0]=> array(2) { 
            ["studentFunds"]=> string(3) "200"
            [0]=> string(3) "200" 
    }
} 

此外,由于错误,我的数据库没有使用新金额进行更新。

如您所见,studentFunds索引确实包含一个值,为什么会发生这种情况。我误解了错误或我的代码中是否有错误?

2 个答案:

答案 0 :(得分:2)

奥马尔的回答是正确的。有关更多详细信息,请查看fetchAll的文档: PHP docs for fetchAll

瘦是fetchAll返回查询中所有行的索引数组,如果这些索引数组包含键和值的关联数组。因此,您想要的数据存储在$studentFunds[0]['studentFunds']

由于fetchAll返回一个数组,如果你使用print_r而不是var_dump,那么对这类问题的故障排除应该会更快。 print_r的输出格式更适合分离(理解)数组。

作为一种惯例,您还应该将其包装成某种形式的健全性检查,以防万一,例如,传入的$ studentNum无效或在数据库中找不到或者如果找到多个记录。像这样:

$oldAmount = 0;
if( is_array( $studentFunds ) && count( $studentFunds ) == 1 )
{
   $oldAmount = $studentFunds[0]['studentFunds'];
}

如果您未能对查询结果进行至少基本的完整性检查,那么您要求查看难看的错误,或者更糟糕的是,将意外记录的结果打印到界面。

答案 1 :(得分:1)

$studentFunds是一个元素的数组。在第31行试试这个:

 $oldAmount = $studentFunds[0]['studentFunds'];