我正在Codeigniter中构建一个简单的测验应用程序,在该应用程序中向用户呈现图像,他们猜测它是对还是错。类似于“热或不热”。
有25个问题,都是是或否答案。我可以轻松选择创建25页并在隐藏字段中保留以前的结果,但这看起来有点啰嗦和愚蠢。
我有一个视图文件,其中唯一改变的是图像。所以我认为我可以将图像路径作为变量传递并动态更改它但我无法在更抽象的层次上解决如何记录每个答案的结果然后在最后显示结果并插入数据库
我遇到的问题是如何加载序列中的下一个图像并记录该结果。
P.S
图像的顺序始终相同。如果它们是随机的并不重要,尽管那会很好!
答案 0 :(得分:0)
在我看来,你有两个选择,使用Ajax或没有Ajax。
首先容易,没有ajax:
将数据从每个问题传递到另一个问题的最佳方法是使用会话变量对其进行排序。 例如,你在一个名为$ answers的数组中对答案进行排序:
$answers = $this->session->userdata('answers');
$answers[] = ** NEW ANSWER HERE **
$this->session->set_userdata('answers', $answers);
为了获取图像,您可以对控制器/模型中的数组中的所有问题(图像)进行排序,并检查会话中$答案包含的项目数,以确定下一个要显示的图像!就那么简单 ! : - )
现在使用ajax,一切都将变得几乎相同只是你需要有点方便jquery / js以便不刷新页面而只是改变图像(问题)。
希望它有所帮助。答案 1 :(得分: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()
答案 2 :(得分:0)
您可以通过在数据库中插入问题来完成此操作,并使用以下字段:
ID - 问题的ID。 图像 - 此问题的图像名称,例如“question1Image.jpg” 正确答案 - 这个问题的正确答案,如果答案都是YES / NO,你可以使用INT。 1表示YES,0表示NO。
现在您对数据库有疑问,在控制器上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();
}
}