2017-04-04 16 views
1

CodeIgniterでデータベースに値を埋め込み、挿入する方法は?
私はCodeIgniterフレームワークを使用して複数の選択肢のクイズスクリプトを作成しています。私はそれが何を行う任意のエラーが表示されない、起こらなかっ実行するとcodeigniterの値をimplodeしてdbに挿入する方法は?

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

:私のコントローラで

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

とモデル私はこのようなユーザー結果を保存します私は間違いますか?
のplsは私がすべての間違った

+0

私にビューファイルを表示します。あなたは配列として投稿値を取らなければならない –

答えて

0

ファーストをやっているものを私を助けて - 私はあなたがあなたのデータを正規化あなたのDB構造

に大きな問題をしたと思う

あなたが保存するために防止しなければならない

そのような表のあなたの情報。 データを正常に正規化することは可能です。

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:これは正しい方法でこれを行う方法です。 Plsはこのコードを研究しています。まだ何が起こっているのか分からない場合は、お気軽にお問い合わせください。

+0

毎回10クエストクイズを取ることができるたびに。質問のユーザーがいない場合10セッションのlastidsを解除する方法 –

+0

かなり簡単 - 私はポストを更新しました – sintakonte

+0

ごめんなさい私のための各ライン。これで[email protected] –

関連する問題