如何使用PHP动态显示网页中的链接

时间:2017-02-19 04:23:40

标签: php mysql

美好的一天@ 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;
        }

    }

}

但即使我参加了多次考试,它也只会显示一个“查看结果”条目。它显示了最近的条目。请问我错过了什么?

1 个答案:

答案 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>';

    }

}