美好的一天@ all。 我有这个代码片段,其目的是根据注册的课程显示该用户有资格参加的考试。它会显示考试名称,可用日期,通过成绩,如果他/她没有写,则显示考试链接;如果他/她之前已经写过,则显示查看结果。
/*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;
}
}
}
但即使我参加了多次考试,它也只会显示一个“查看结果”条目。它显示了最近的条目。请问我错过了什么?
答案 0 :(得分:0)
未经测试,但这是我将如何做到的。
我假设$ user_id是一个整数。我有点担心它在没有任何消毒的情况下在SQL中使用。我不能保证你做的任何其他事情都是安全的,因为我看不到你的其他代码。请阅读:http://php.net/manual/en/security.database.sql-injection.php
(哦,我看到有人已经评论过了 - 不要掉以轻心!)
无论如何,我的方法是首先将用户的书面考试ID收集到一个数组中。然后循环检查可用的考试并检查每个考试ID,看看它是否在我们之前制作的数组中。
除非你发现这表现不佳,否则我不会费心去查看联接建议。在许多系统中,在这种情况下通常会有3个函数,一个生成$ users_written_exam_ids,它们会提取类似$ all_available_exams的内容,然后生成比较两者的代码。但是因为人们在这里同时看到这两个问题,所以很有可能会对它进行优化,这很酷,但你可能只是想让它起作用:)
<?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>';
}
}