2013-02-25 4 views
0

나는 Codeigniter에서 사용자가 이미지를 제시하고 옳은지 또는 틀린지를 추측해야하는 간단한 퀴즈 앱을 제작 중입니다. 'hot or not'와 유사합니다.Codeigniter에서 퀴즈 정비공에 접근하는 방법

25 개의 질문이 모두 예 또는 대답이 없습니다. 나는 25 페이지를 생성하고 숨겨진 필드에서 이전 결과를 수행하는 쉬운 옵션을 취할 수 있지만 이것은 조금 길고 바보 같다.

나는 이미지가 변경되는 유일한보기 파일이 있습니다. 그래서 나는 이미지 경로를 변수로 전달하여 동적으로 변경할 수 있다고 생각하지만,보다 추상적 인 레벨에서 각 대답의 결과를 기록한 다음 최종 결과를 보여주고 데이터베이스에 삽입하는 방법을 생각해 낼 수 없다고 생각합니다. .

내가 겪고있는 문제는 시퀀스의 다음 이미지를로드하고 그 결과를 기록하는 방법입니다.

p.s

이미지의 순서는 항상 같습니다. 비록 그들이 무작위 적이라면 그것은 중요하지 않습니다.

답변

0

당신은 다음 필드로, 데이터베이스에있는 질문을 삽입하여, 그 작업을 수행 할 수 :

ID - ID는 문제의 이미지 -이 질문에 사용 된 이미지의 이름 (예 : "question1Image.jpg") 정답 -이 질문에 대한 정답입니다. 대답이 모두 예/아니오 인 경우 INT를 사용할 수 있습니다. YES는 1, NO는 0입니다.

<!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 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); 
     } 
    } 
} 

보기에 : 지금 당신이 뭔가를 만들 수 있습니다 컨트롤러 전자에, 데이터베이스에 대한 질문을 가지고

:

<?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(); 
    } 
} 
+1

INT가 아닌 TINYINT 또는 BIT (DB에 따라 다름)를 사용하여 공간을 절약 할 수 있습니다. –

+0

Ok, 고맙습니다. 내 모델이 어떻게 보이나요? –

+0

codeigniter로 작업 해본 적이 있습니까? 모델을 추가했습니다. 이 코드를 사용하기 전에 몇 가지 사소한 설정을해야하기 때문입니다. 오, 그리고 이것은 단지이 코드가 상자 밖으로 작동한다고 생각하지 않는 가이드입니다 –

0

제 의견으로는 Ajax가 있거나 Ajax가없는 두 가지 옵션이 있습니다. 아약스없이 처음

쉬운 :

가장 좋은 방법은 다른 일에 각 질문에서 데이터를 전달하기 위해 그것을 정렬 세션 변수를 사용하는 것입니다. 당신이 배열에서 답을 분류 예를 들어 는 다음과 같이 답변 뭔가 $라고 :

당신이 컨트롤러/모델에서 배열의 모든 질문 (이미지)을 정렬하고 얼마나 많은 항목을 확인할 수 있습니다 이미지를 얻기 위하여
$answers = $this->session->userdata('answers'); 
$answers[] = ** NEW ANSWER HERE ** 
$this->session->set_userdata('answers', $answers); 

귀하의 세션에서 귀하의 $ 답변은 ​​어떤 이미지가 다음에 표시 될지를 결정합니다! 그만큼 간단 해! :-)

아약스와 함께라면, 모든 것이 거의 동일 할 것입니다. 변경 사항은 페이지를 새로 고치지 않고 단지 이미지 (질문)를 변경하지 않기 위해 jquery/js를 사용할 때 약간 편리해야한다는 것입니다. .

도움이 되었기를 바랍니다. 당신은 쉽게에 대한 일관된 주문 또는 RAND()에 질문을 제시 키 no를 사용할 수있는이 같은 스키마로

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

: 같은 기본적인 테이블과 답변을 저장하는 데이터베이스에 퀴즈를 만들어

+0

좋습니다. 내 컨트롤러는 어떻게 보이나요? 예를 들어, 항상 내 방식으로 동일한 방법으로 제출하는 양식이 있습니까? 이것은 운동하기가 혼란스러운 부분입니다. 감사합니다 –

+0

정확 하 게! 당신이 그것을 올바르게 가지고 있다고 걱정하지 마십시오! 양식을 동일한 페이지에 게시하고 세션을 검토하고 사용자가 답변 할 때마다 추가하여 질문을 추적하고 다음 질문을 결정할 수 있습니다. 그 분야에서 새로운 것을 발견하고 발견하는 열쇠를 잊지 마십시오. 테스트, 테스트, 테스트 및 테스트입니다! :-) 미친 아이디어가 당신의 두뇌를 치는 어떤 테스트를 계속하십시오! 질문이 있으시면 언제든지 물어보십시오. –

0

무작위 순서. 선택은 optionnal이지만, 퀴즈를 연장하고 싶다면 선택을 확장하는 데 사용할 수 있습니다.

는 특정 사용자에 대한 다음 질문은

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; 

당신은 사용자가 아직 대답하지 않았 음을 첫 번째 질문을 얻을 것이다이 방법은 같은 수 찾을 수 있습니다. 그 외에도 사용자에 대해 얼마나 많은 정보를 보유하고 싶은지는 사용자에게 달려 있습니다.

편집

당신은 표시 할 항목을 가져 오기 위해, 컨트롤러에 하나이 작업을해야합니다 (첫번째 코멘트에서 추가) 및 뷰에 ID를 전송하고 다른 사용자의 데이터를 잡아와 그것을 DB에 저장하십시오.

귀하의 모델에는 다음 질문을 얻기위한 방법과 답변을 저장하는 방법 중 하나가 될 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() 
+0

이것은 좋은 방법 인 것 같습니다. 그래서 하나의 뷰 파일을 가지고 있는데, 거기에는 yes 또는 no 옵션이있는 폼이 있습니다. 이것은 내 컨트롤러의 메서드를 가리 킵니다. 그러나, 나는 그 방법이 무엇을 할 것이냐? –