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");

何らかの理由で、アプリを実行するたびにこのエラーが発生し続けます。

注意: 未定義のインデックス: C:\xampp\htdocs\scholarshipManager\model\insertAllocation.php の 31 行目の 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 は配列を返すため、var_dump の代わりに print_r を使用すると、このような質問に対するトラブルシューティングの回答がはるかに迅速になります。print_r の出力フォーマットは、配列を分解する (理解する) のに適しています。

実際には、たとえば、渡された $studentNum が無効であるか、データベースで見つからない場合、または複数のレコードが見つかった場合に備えて、これを何らかの形式の健全性チェックにラップする必要もあります。このようなもの:

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

クエリ結果の少なくとも基本的な健全性チェックを行わないと、見苦しいエラー、またはさらに悪いことに、予期しないレコードがインターフェイスに出力されることを求めています。

于 2012-12-19T20:06:36.150 に答える
1

$studentFunds1 つの要素の配列です。31行目でこれを試してください:

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