2017-04-04 101 views
1

如何在CodeIgniter中插入和插入值到数据库中?
我使用CodeIgniter框架创建多选测验脚本。我想存储用户的结果是这样的:如何在codeigniter中插入值并插入数据库?

id userid q_id  answer_id time_taken 
1 1  1,2,3,4,5 2,3,4,5,3 4,5,7,6,7 
在我的控制器

public function insert_result() 
     { 
    $this->load->model('quiz_models'); 
    $user_id=$this->input->post('user_id'); 
    $qq_id=$this->input->post('questionid'); 
    $answer_id=$this->input->post('AnswerID'); 
    $time_taken=$this->input->post('timetaken'); 
    $question_no=$this->input->post('question_no'); 
    $bd = "$question_no"; 
    switch ($bd) { 
    case"1": 
    $data=array('user_id'=>$user_id, 
       'q_id'=>$qq_id, 
       'answer_id'=>$answer_id, 
       'time_taken'=>$time_taken); 
    $this->quiz_models->insert_result($data);  

    break; 
    case"2": 
    quiz_test(); 
    break; 
    case"3": 
    quiz_test(); 
    break; 
    case"4": 
    quiz_test(); 
    break; 
    case"5": 
    quiz_test(); 
$this->session->unset_userdata('lastids'); 
break; 
default: 
     echo "something is wrong"; 
} 
} 
public function quiz_test() 
    { 
$this->load->model('quiz_models'); 
$quiz=$this->quiz_models->quiz_test(); 
foreach($quiz as $row){ 
$qid=$row->q_id; 
$ans=$row->answer_id; 
$time=$row->time_taken; 
$a = array("$qq_id","$qid"); 
$b = array("$answer_id","$ans"); 
$c = array("$time_taken","$time"); 
$comma = implode(",",$a); 
$comma1 = implode(",",$b); 
$comma2 = implode(",",$c); 
$data=array('q_id'=>$comma, 
      'answer_id'=>$comma1, 
      'time_taken'=>$comma2); 
$this->quiz_model->update_result($data);  
} 
} 
} 

和型号:

function insert_result($data) 
    { 
    $this->dbb->insert('results',$data); 
$sectio=$this->db->insert_id(); 
$this->session->set_userdata('lastids',$sectio); 
    } 
function quiz_test() 
    { 
$ses_id = $this->session->userdata('lastids'); 
      $sql = "SELECT q_id, answer_id, time_taken FROM results WHERE id='$ses_id'"; 
      $query = $this->dbb->query($sql); 
      $result = $query->result(); 
      return $result; 
    } 
function update_result($data){ 
$ses_id = $this->session->userdata('lastids'); 
$this->db->where('id',$ses_id); 
$this->db->update('results',$data); 
} 

当我运行它什么都没有发生,不表示在做任何错误我错了?
请帮助我什么我做错了

+0

让我查看文件。你必须把数值作为数组 –

回答

0

首先的 - 我想你在你的数据库结构

已经一个重大问题归你的数据

你应该避免存储你的信息就像那样。 应该可以正确地标准化您的数据。如果你不知道 怎么做,下面的链接可能是有趣:

Normalization in MYSQL

但是一个可能的解决方案来构建你的数据:

为了做到这一点 - 创建保存方法在模型更新和插入之间的分裂 - 这种模式可能看起来像

class Quiz_Models 
{ 

    private $arrPostData; 

    public function save($arrPostData = false) 
    { 
     $this->arrPostData = (!$arrPostData) ? $this->input->post() : $arrPostData; 

     $id = $this->session->userdata("lastids"); 

     if ($id) 
     { 
      $query = $this->db 
       ->select("*") 
       ->from("results") 
       ->where("id",$id) 
       ->get(); 

      if ($query->num_rows() == 1) 
      { 
       $this->update($query->row(0)); 
      } 
      else return false; 
     } 
     else 
     { 
      $this->insert(); 
     } 

     if ($this->arrPostData['question_no'] == 10) $this->session->unset_userdata("lastids"); 
    } 

    private function update($objData) 
    { 
     $objCollection = new Quiz_Collection(); 
     $objCollection->userId = $objData->userid; 
     $objCollection->id = $objData->id; 


     $arrData = explode($objData->q_id); 
     foreach($arrData AS $key => $quizId) 
     { 

      $objQuiz = new stdClass(); 
      $objQuiz->q_id = $quizId; 
      $objQuiz->answer_id = explode($objData->answer_id)[$key]; 
      $objQuiz->time_taken = explode($objData->answer_id)[$key]; 

      $objCollection->append($objQuiz); 
     } 


     $objQuizFromPost = new stdClass(); 
     $objQuizFromPost->q_id = $this->arrPostData["questionid"]; 
     $objQuizFromPost->answer_id = $this->arrPostData['AnswerID']; 
     $objQuizFromPost->time_taken = $this->arrPostData['timetaken']; 

     $objCollection->addQuizFromPost($objQuizFromPost); 

     $this->db 
      ->where("id",$objCollection->id) 
      ->update("results",$objCollection->getDbData()); 
    } 

    private function insert() 
    { 
     $objCollection = new Quiz_Collection(); 
     $objCollection->userId = $this->arrPostData['user_id']; 

     $objQuizFromPost = new stdClass(); 
     $objQuizFromPost->q_id = $this->arrPostData["questionid"]; 
     $objQuizFromPost->answer_id = $this->arrPostData['AnswerID']; 
     $objQuizFromPost->time_taken = $this->arrPostData['timetaken']; 

     $objCollection->addQuizFromPost($objQuizFromPost); 

     $this->db->insert("results",$objCollection->getDbData()); 

     $this->session->set_userdata("lastids", $this->db->insert_id()); 

    } 

} 

,因为你需要一个集合对象的加法(把这个模型下)

class Quiz_Collection extends Array_Object 
{ 
    public $userId = 0; 
    public $id = 0; 

    public function addQuizFromPost($objQuiz) 
    { 
     if (intval($objQuiz->q_id) > 0) 
     { 
      foreach($this AS $key => $obj) 
      { 
       if ($obj->q_id == $objQuiz->q_id) 
       { 
        $this->offsetSet($key, $objQuiz); 
        return true; 
       } 
      } 

      $this->append($objQuiz); 
      return true; 
     } 
     return false; 
    } 

    public function sortQuizData($objA, $objB) 
    { 
     if ($objA->q_id == $objB->q_id) return 0; 
     return ($objA->q_id < $objB->q_id) ? -1 : 1; 
    } 

    public function getDbData() 
    { 
     $this->uasort(array($this,"sortQuizData")); 
     $arrData = $this->getArrayCopy(); 

     $arrDbData = [ 
      "userid" => $this->userId, 
      "q_id" => implode(array_map(function($obj){ return $obj->q_id;},$arrData),","), 
      "answer_id" => implode(array_map(function($obj){ return $obj->answer_id;},$arrData),","), 
      "time_taken" => implode(array_map(function($obj){ return $obj->time_taken;},$arrData),","), 
     ]; 

     return $arrDbData; 
    } 
} 

PS:这只是你如何能做到在一个适当的方式的指令。请学习这段代码。如果您仍然不明白发生了什么,请随时询问。

+0

每次用户可以采取10 questios quiz.If用户在question_no 10如何取消设置会话lastids –

+0

很简单 - 我更新了帖子 – sintakonte

+0

对不起,迟到重播,如果你不介意请解释每一行都是me.on [email protected] –