3

我正在创建一个应用程序来帮助跟踪我们青年部的孩子们在夏令营中获得的奖学金。应用程序的这一部分从数据库中选择他们当前拥有的金额,将其保存到名为 $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 索引确实包含一个值,那么为什么会发生这种情况。我误解了错误还是我的代码中有错误?

4

2 回答 2

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'];
}

如果您未能对查询结果进行至少基本的健全性检查,您会要求出现丑陋的错误,或者更糟糕的是,将意外记录的结果打印到界面上。

于 2012-12-19T20:06:36.150 回答
1

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

 $oldAmount = $studentFunds[0]['studentFunds'];
于 2012-12-19T19:49:34.517 回答