クマのブログ

つまづいたところ、学びを書いていきます

【PHP】目に見えないエラー対応

前提

背景

  • 会社の研修中、PHPの基礎講座を受講

  • 今の会社に就職前に独学でPHPを学習していたが、初めて知ったことがあったので、アウトプット

事象(やりたいこと)

  • $_SESSION['cartinfo']内にあるデータを繰り返し処理したい
 // 整数値3を返す
 $cartinfoCnt = count($_SESSION['cartinfo']);

 // 繰り返し処理
 for($i=0; $i > $cartinfoCnt; $i++){
  $sql_insert = "INSERT INTO orderinfo 
VALUES(NULL, '{$userName}', '{$_SESSION['cartinfo'][$i]['isbn']}', {$quantity}, '{$date}')";
  $result_insert = executeQuery($sql_insert);
}

困ったこと

繰り返し処理ができず、$_SESSION['cartinfo']内のデータが表示されない

試したこと

1処理がfor文に入っているか調べる

for($i=0; $i > $cartinfoCnt; $i++){
  echo "aaa";
  $sql_insert = "INSERT INTO orderinfo VALUES(NULL, '{$userName}', '{$_SESSION['cartinfo'][$i]['isbn']}', {$quantity}, '{$date}')";
  $result_insert = executeQuery($sql_insert);
}
  • 上記の通りechoを入れてみて、挙動を確認

結果

"aaa"が出力されず、for文を通っていないことを確認

2. for文を通らない原因を探る

  • for文を1文づつ確認し、通らない原因を探る

結果

  • 原因は不等号が逆であったこと

  • 以下のように修正したら無事for文を通った

↓修正前

for($i=0; $i > $cartinfoCnt; $i++){

↓修正後

for($i=0; $i < $cartinfoCnt; $i++){

所感

  • 以下にエラー対応がすぐにできなかった要因を推測

    • 1.「for文はif文と比べて絶対に通ってくれるだろう」という固定概念を持っており、「for文を通っているか否かのデバックを試す」という方法がすぐに思い浮かばなかった。

      1. 完全に言い訳ですが、同時並行でやっていた基本情報技術者試験で出題される疑似言語では「反復条件」ではなく「終了条件」を冒頭に書くものも存在しており、混乱していた
      1. 根拠もなく「SQL及びデータベース構造に非があるのではないか」と判断したため、労力を真因以外に注力してしまった。

SQL文のエラーを検出しdieする処理を別ファイルで用意しており、そちらでエラーは発生していなかった。

よって本来はSQL文及びデータベースの調査は不要でした。

結論:今回の時間の浪費の真因は3.で、想定外の挙動に対して冷静な真因調査ができなかったことです。 エラー文が出ない想定外の挙動についてもエラー文が表示されたとき同様、冷静にデバックを実施することで、今回の事態は避けられたのではないか、と感じた。