2017-02-19 13 views
0

おはようございます。 私はこのコードスニペットを目的としています。これは、このユーザーが登録されているコースに基づいて受験できる資格試験を表示することです。以前に書いたことがある場合は、試験の名前、使用可能な日付、合格グレード、試験を受けるリンク、または結果が表示されます。PHPを使用してWebページにリンクを動的に表示する方法

/*Connection String */ 
global $con; 

$user_id = $_SESSION['user_id']; //user id 

$courses = parse_course($user_id); //parse course gets the list of registered courses (Course Codes) in an array 

foreach ($courses as $list) 
{ 
    $written = false; 
    $list = parse_course_id($list); //parse_course_id gets the id for each course 
    $ers = mysqli_query($con, "Select * from exams where course_id = '$list'"); 
    while ($erows = mysqli_fetch_assoc($ers)) { 
     $trs = mysqli_query($con, "Select * from result_data where user_id = '$user_id'"); 
     while ($trows = mysqli_fetch_assoc($trs)) { 
      if ($trows['user_id'] == $user_id && $trows['exam_id'] == $erows['exam_id']) 
       $written = true; 
      else 
       $written = false; 
     } 

     if($written) 
     { 
      echo "<tr><td>".$erows['exam_name']."</td><td>".$erows['exam_from']." To ".$erows['exam_to']."</td><td>".$erows['passing_grade']."%</td><td><a href=proc_result.php?id=".$erows['exam_id'].">".'View Result '."</a></td></tr>"; 
      $written = false; 
     } 
     else 
     { 
      echo "<tr><td>".$erows['exam_name']."</td><td>".$erows['exam_from']." To ".$erows['exam_to']."</td><td>".$erows['passing_grade']."%</td><td><a href=Exam3.php?id=".$erows['exam_id'].">".'Take Exam '."</a></td></tr>"; 
      $written = false; 
     } 

    } 

} 

ただし、複数の試験を受験した場合でも、1つの結果を表示します。最近のエントリーを示しています。どうしたらいいですか?

+2

理由** WARNING **:使用 'mysqli'あなたがすべき[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param'](http://php.net/manual/en/mysqli- stmt.bind-param.php)を使用してユーザーデータをクエリに追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 ** '$ _POST'や' $ _GET'データを直接クエリに入れないでください。誰かがあなたのミスを悪用しようとすると、非常に危険です。 – tadman

+1

ポイント取る。私はすぐにそれを変更します。ありがとう@タッドマン。 – Andromadus

+0

'WHERE'節でその値の行だけを特に要求しているので、なぜ行の' user_id'列を '$ user_id'変数と比較しているのか分かりません。 – tadman

答えて

0

未テストですが、ここではどのように行うのですか。

私は$ user_idが整数であると仮定しました。私はそれがサニタイズせずにSQLで使用されていることについて少し心配しています。あなたの他のコードが見えないので、あなたがやっている何かが安全であることを保証することはできません。お読みください:http://php.net/manual/en/security.database.sql-injection.php

(ああ、私は、誰かがすでにその上でコメントを参照 - 軽くそれを取ることはありません!)

とにかく、私のアプローチは、最初の配列の中に、ユーザの筆記試験IDを収集することです。次に、利用可能な試験をループし、各試験IDをチェックして、以前に作成した配列に含まれているかどうかを確認します。

これはパフォーマンスが悪いとわからない限り、私は参加アドバイスを調べることはありません。多くのシステムでは、$ users_written_exam_ids $ all_available_examsのようなものを生成するものを生成する関数と、その2つを比較するこのコードの3つの関数を持つのが一般的です。しかし、人々が一緒にここに両方の​​クエリを見ているが、それを最適化するための強力な誘惑が、あるクールであるが、あなたはおそらくちょうどそれが仕事をしたい:)

<?php 
global $con; 

// Get the user id. Pass through intval() so no SQL injection is possible. 
$user_id = intval($_SESSION['user_id']); 

// Parse course gets the list of registered courses (Course Codes) in an array 
$courses = parse_course($user_id); 

foreach ($courses as $list) 
{ 
    // Gets the id for each course 
    $list = parse_course_id($list); 

    $users_written_exam_ids = array(); 
    $trs = mysqli_query($con, "SELECT exam_id FROM result_data WHERE user_id = '$user_id'"); 
    while ($trows = mysqli_fetch_assoc($trs)) 
    { 
     $users_written_exam_ids[] = $trows['exam_id']; 
    } 

    $ers = mysqli_query($con, "SELECT * FROM exams WHERE course_id = '$list'"); 
    while ($erows = mysqli_fetch_assoc($ers)) { 
     echo '<tr><td>' . $erows['exam_name'] . '</td><td>' . $erows['exam_from'] 
      . ' To ' . $erows['exam_to'] . '</td><td>' . $erows['passing_grade'] 
      . '%</td><td>'; 
     if (in_array($erows['exam_id'], $users_written_exam_ids)) 
     { 
      echo '<a href="proc_result.php?id=' . $erows['exam_id'] . '">View Result</a>'; 
     } 
     else 
     { 
      echo '<a href="Exam3.php?id=' . $erows['exam_id'] . '">Take Exam</a>'; 
     } 
     echo '</td></tr>'; 

    } 

} 
+0

実際にすべてのプロになりたい場合は、3つの関数に入れ、データベースからデータを取り込む関数をインクルードファイルに入れて、データベース出力を行うコードとHTML出力を行うコードを混在させないでください。考えていること。あなたはあなたのウェブサイトの他の領域でデータベース機能を再利用することができます:)あなたはユーザーID、試験IDなどでそれらを制限するために関数にパラメータを渡すことができます。 – braks

+0

ありがとう@ Braks。 <$ users_written_exam_ids = [];>を<$ users_written_exam_ids = array();に変更する必要がありましたが、動作します。それは完全に後に動作します。私は間違った方法でそれについて行ってきました。私はまだこれをマスターするためには長い道のりがあります。これをコメントしたり閲覧したりした皆様に感謝します。 – Andromadus

関連する問題