Как подойти к специалисту по викторине в Codeigniter

Я создаю простое приложение для викторины в Codeigniter, где пользователю предоставляется изображение, и они должны угадать, правильно это или нет. Похоже на «горячий или нет».

Есть 25 вопросов, все ответы «Да» или «Нет». Я мог бы легко выбрать 25 страниц и перенести предыдущие результаты в скрытые поля, но это кажется немного длинным и глупым.

У меня есть файл вида, где единственное, что меняется, – это изображение. Поэтому я думаю, что могу пройти путь изображения в виде переменной и изменить ее динамически, но я не могу работать на более абстрактном уровне, как записывать результат каждого ответа, а затем в конце показывать результаты и вставлять в базу данных ,

Проблема, с которой я сталкиваюсь, заключается в том, как загрузить следующее изображение в последовательности и записать этот результат.

Ps

Изображения всегда будут в одном порядке. На самом деле это не имеет значения, если они случайны, хотя это было бы неплохо!

Вы можете сделать это, вставив вопросы в свою базу данных со следующими полями:

ID – идентификатор вопроса. Изображение – название изображения для этого вопроса, например, «question1Image.jpg» Правильный ответ – правильный ответ на этот вопрос, если все ответы ДА / НЕТ, вы можете использовать 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(); } } 

на мой взгляд, у вас есть два варианта: с Ajax или без Ajax.

сначала простой, без ajax:

лучший способ передать данные из каждого вопроса другому – с помощью переменной сеанса для ее сортировки. например, вы сортируете ответ в массиве с именем $ ответы примерно так:

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

для получения изображений вы можете сортировать все вопросы (изображения) в массиве в вашем контроллере / модели и проверять, сколько элементов ваши ответы в вашем сеансе содержат, чтобы определить, какое изображение должно быть показано далее! просто как тот ! 🙂

теперь с ajax все будет почти таким же, только что изменится, так это то, что вам нужно быть немного удобнее с jquery / js, чтобы не обновлять страницу и просто менять изображение (вопрос).

надеюсь, что это помогло.

Создав свою викторину в базе данных для хранения ответов с помощью основных таблиц, например:

 | 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; 

Таким образом вы получите первый вопрос, на который пользователь еще не ответил. Кроме этого, вам решать, сколько информации вы хотите сохранить о своем пользователе.

EDIT (добавить с первого комментария)

Вам потребуется 2 действия в вашем контроллере, один для получения того, что отображать и отправлять идентификатор в представление, а другой – для захвата данных у пользователя и сохранения его в БД.

В вашей модели вам понадобятся 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()