2017-08-14 23 views
0

私は、学生の出席を挿入するPHPスクリプトを用意しています。まず、同じ学生IDと日付の出席者がすでに存在するかどうかを確認する必要があります。そうでなければ、出席を挿入する。私は学生がphp関数のcompareTimeの戻り値に基づいて存在するか遅いかに関わらず、出席状況に挿入したいと思います。しかし問題は、関数が何も返さないことです。そのため、出席データでステータス列が空白になっています。クエリ内のPHP関数が戻り値を返さない

function checkAttendance($conn, $stud_id) { 
    $check = mysqli_query($conn, "SELECT * FROM tbl_attendance WHERE student_id = '$stud_id' AND date = CURDATE()") or die (mysqli_error()); 
    if(mysqli_num_rows($check) > 0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

function compareTime($time,$grade) { 
    $ctime = strtotime($time); 
    if($grade == "H1" || $grade == "H2" || $grade == "H3" || $grade == "H4" || $grade == "S1" || $grade == "S2") { 
     if ($ctime > strtotime('05:00:00') && $ctime < strtotime('07:30:00')) return "P"; 
     else if ($ctime > strtotime('07:30:00') && $ctime < strtotime('8:30:00')) return "L"; 
    } 
    else { 
     if($ctime > strtotime('05:00:00') && $ctime < strtotime('07:15:00')) 
      return "P"; 
     else if ($ctime > strtotime('07:15:00') && $ctime < strtotime('8:30:00')) 
      return "L"; 
    } 
} 

function recordAttendance($conn, $sid, $glid, $scid) { 
    $sql = mysqli_query($conn, "INSERT INTO tbl_attendance(student_id, gradeLevel_id, section_id, date, arrival_time, status) VALUES ('".$sid."', '".$glid."', '".$scid."', CURDATE(), CURTIME(), '".compareTime(date('H:i:s'),$glid)."')") or die(mysqli_error()); 
} 

$res = mysqli_query($connect, "SELECT * FROM tbl_student WHERE card_id = '$cardID'")or die(mysqli_error()); 
while($row = mysqli_fetch_array($res,MYSQLI_ASSOC)) { 
    if (checkAttendance($connect, $row['student_id'])) 
     echo "Already Exist!"; 
    else 
     recordAttendance($connect, $row['student_id'], $row['gradeLevel_id'], $row['section_id']); 
} 
+0

'else'(ここで、'場合は()...もし他の()入れてみてください。あなたの状態がどこにあるのか見てください!両方の条件が間違っていればコードを書かなかったからです! –

+0

何か問題がありますか?また 'mysqli_error()'は接続変数を必要とします – JustBaron

+1

$ connと$ connectの違いは何ですか? –

答えて

0

実際にはいくつかの理由がありますが、どちらの場合にデバッグする必要があります。

  • compareTimeの値を出力して最初にデバッグを開始し、実際に動作するかどうかを確認します。そうでない場合は、最初に修正してください。
  • これが機能する場合は、クエリに 'ハードコードされた'値を追加して(テストの)データ/テーブルに挿入されているかどうかを確認できます。それで良い結果が得られない場合は、データベースに間違ったタイプのケースがあるかもしれません。多分それは整数か何かを期待しているでしょうか?
  • また、関数呼び出しをクエリから抽出して変数に入れることもできます。デバッグが容易であるだけでなく、よりクリーンで読みやすいコードを提供します。

P.S. ちょうど午前7時30分または午前7時15分の場合は、人が亀裂の間に入り込むかどうかを確認するだけなので、時間がちょうど7:30:00または7:15:00になることはありませんか?いくつかは、>でなければなりません=または< =

はこのような何かにそれを書き直した方がよいかもしれません:

function compareTime($grade,$time = ''){ 
    $time = (empty($time))?strtotime(date('H:i:s')):strtotime($time); 

    $time_5 = strtotime('05:00:00'); 
    $time_715 = strtotime('07:15:00'); 
    $time_730 = strtotime('07:30:00'); 
    $time_830 = strtotime('08:30:00'); 

    if ($grade == "H1" || $grade == "H2" || $grade == "H3" || $grade == "H4" || $grade == "S1" || $grade == "S2") { 
     if (
      $time > $time_730 
      && $time < $time_830 
     ){ 
      return "L"; 
     } elseif (
      $time > $time_5 
      && $time <= $time_730 
     ){ 
      return "P"; 
     } 
    } else { 
     if (
      $time > $time_715 
      && $time < $time_830 
     ){ 
      return "L"; 
     } elseif (
      $time > $time_5 
      && $time <= $time_715 
     ){ 
      return "P"; 
     } 
    } 
} 
+0

else文の後ろにelse文を置かない限り、値を返しません。 else文を追加した場合、間違った値が返されます。私はすでに自分のマシンで時間を変更しています。 2つの時間変数の時間差が15分を超えていれば "L"を返すべきかどうかチェックするのが賢明でしょうか?それは時間自体を比較するよりも良い方法ですか? – Khrisdaniels

+0

唯一の問題は時間の比較自体です。間違った値を返します。 – Khrisdaniels

+0

それはいくつかの理由がありますが、私はそれで良い結果を得ています。しかし、あなたはそれが何を確認しているのか、そしてその応答が何であるかを覚えておく必要があります。あなたは現在、スクリプトの実行時までの日付(H:i:s)をチェックしていますが、5から8.30の間に何かが起きた場合にif文でチェックします。その時間外にあるもの(例えば今のようなもの)は決して一致しませんし、順番に値を返しません。終了時間を省略することができますか?一定時間後にすべてをLに戻すか、それを捕まえて別の文字を挿入する3番目のものを開始する –

関連する問題