0

我正在 Codeigniter 中构建一个简单的测验应用程序,在该应用程序中向用户呈现图像,他们将猜测它是对还是错。类似于“热与否”。

有 25 个问题,所有答案都是“是”或“否”。我可以选择创建 25 个页面并在隐藏字段中保留以前的结果,但这似乎有点冗长和愚蠢。

我有一个视图文件,其中唯一改变的是图像。所以我想我可以将图像路径作为变量传递并动态更改它,但我无法在更抽象的层面上解决如何记录每个答案的结果,然后在最后显示结果并插入数据库.

我遇到的问题是如何加载序列中的下一个图像并记录该结果。

附言

图像将始终以相同的顺序排列。它们是否是随机的并不重要,尽管那会很好!

4

3 回答 3

0

在我看来,您有两种选择,使用 Ajax 或不使用 Ajax。

简单的第一个,没有 ajax :

将数据从每个问题传递给另一个问题的最佳方法是使用会话变量对其进行排序。例如,您在一个名为 $answers 的数组中对答案进行排序,如下所示:

$answers = $this->session->userdata('answers');
$answers[] = ** NEW ANSWER HERE **
$this->session->set_userdata('answers', $answers);

为了获得图像,您可以对控制器/模型中的数组中的所有问题(图像)进行排序,并检查会话中的 $answers 包含多少项以确定接下来要显示的图像!就那么简单 !:-)

现在使用 ajax,一切都将几乎相同,唯一改变的是您需要使用 jquery/js 有点方便,以免刷新页面而只是更改图像(问题)。

希望它有所帮助。

于 2013-02-25T15:21:15.643 回答
0

通过在数据库中创建您的测验来存储带有基本表格的答案,例如:

| question   |
|============|
| id (PK)    |
| no         |
| image_path |

| choice      |
|=============|
| id (PK)     |
| question_id |
| value       |

| answer              |
|=====================|
| user_id (PK, FK)    |
| question_id (PK, FK)|
| choice_id (PK, FK)  |

| user                |
|=====================|
| id (PK)             |
| session_id or email |

使用这样的模式,您可以轻松地使用键no以连贯的顺序或RAND()随机顺序呈现问题。该选项是可选的,但如果您想扩展您的测验,您可以使用它来扩展选项。

为给定用户查找下一个问题可能类似于

SELECT * 
FROM question as q 
JOIN answer as a
  ON q.id = a.question_id 
WHERE q.id NOT IN (SELECT question_id FROM answer WHERE user_id = :user_id) 
  AND a.user_id = :user_id 
ORDER BY q.no -- or ORDER BY RAND()
LIMIT 1;

这样,您将得到用户尚未回答的第一个问题。除此之外,您要保留多少有关用户的信息取决于您。

编辑(从第一条评论添加)

您将需要在控制器中执行 2 个操作,一个用于获取要显示的内容并将 id 发送到视图,另一个用于从用户那里获取数据并将其存储到数据库中。

在您的模型中,您将需要 2 种方法(至少),一种用于获取下一个问题,另一种用于保存答案。我不知道代码点火器的细节,但这里是主要行:

Controller:
displayAction()
    get user id from user model (through session variable or session id)
        If you don't have a reference for the user, you need to create one and return it
    get next question from question model (user id as param)
    send the question data to the view

saveAction()
    get user id (through session variable or session id)
    get question id (from get or post param)
    if you use a database to store choices, validate that the choice is possible, based on the current question
    send user id, question id and the choice made to the answer model for storage
    redirect to displayAction()
于 2013-02-25T15:23:55.017 回答
0

您可以通过在数据库中插入问题来实现这一点,其中包含以下字段:

ID - 问题的 ID。图片 - 此问题的图片名称,例如“question1Image.jpg” 正确答案 - 此问题的正确答案,如果答案都是“是”/“否”,您可以使用 INT。1 表示是,0 表示否。

现在您对数据库有疑问,在您的控制器 e 上可能会创建如下内容:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Quizz extends CI_Controller {
    public function questions($idquestion){
        $this->load->model('questions_model');
        //fetch the questions from the database
        $questions = $this->questions_model->get_questions();
        //if it's a post we'll check if the answer is correct and pass the next question to the view
        if($this->input->post()){
            $answered_question = $this->questions_model->get_question($idquestion-1);
            $question = $this->questions_model->get_question($idquestion);

            if($answered_question['correct_answer']==$this->input->post('answer')){
                //if the user answered correctly do something here
            }
            $data['question'] = $question;
            //the id of the next question you'll use it for the next post
            $data['next_question'] = $idquestion+1;
            $this->load->view('your_view', $data);
        }
        //it's the first time the user uses this so we'll load the first answer
        else{
            $question = $this->questions_model->get_question(1);

            $data['question'] = $question;
            //the id of the next question you'll use it for the next post
            $data['next_question'] = 2;
            $this->load->view('your_view', $data);
        }
    }
}

在你看来,你可以有这样的东西:

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Question page</title>
</head>
<body>
    <?php //we'll use the codeigniter form helper to generate manually the form
    echo form_open('quizz/questions/'.$next_question); ?>
    <!-- This will load the image dynamically-->
    <img src="<?=base_url('public/images/'.$question['image'])?>">

    <label><input type="radio" name="answer" value="1">YES</label>
    <label><input type="radio" name="answer" value="0">NO</label>
    <button type="submit" >Submit</button>
    <?=form_close();?>
</body>
</html>

该模型:

<?php
class questions_model extends CI_Model {

    public function __construct()
    {
        $this->load->database();
    }
    public function get_questions()
    {   
        return $this->db->get('questions_table')->result_array();
    }
    public function get_question($idquestion)
    {   
        $this->db->select('questions_table.*');
        $this->db->from('questions_table');
        $this->db->where('questions_table.id', $idquestion);
        return $this->db->get()->result_array();
    }
}
于 2013-02-25T15:45:53.030 回答