【问题标题】:how to implode and insert values into db in codeigniter?如何在codeigniter中内爆并将值插入到db中?
【发布时间】:2017-08-29 04:39:53
【问题描述】:

如何在 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);
}

当我运行它时,什么也没发生,没有显示任何错误我在哪里出错了?
请帮助我我做错了什么

【问题讨论】:

  • 显示查看文件。您必须将帖子值作为数组

标签: php mysql json codeigniter


【解决方案1】:

首先 - 我认为您的数据库结构存在重大问题

规范化您的数据

您应该防止将您的信息存储在这样的表格中。 应该可以正确规范化您的数据。如果你不知道 如何做到这一点以下链接可能很有趣:

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:这只是说明如何以适当的方式做到这一点。请研究此代码。如果您仍然不明白发生了什么,请随时提问。

【讨论】:

  • 每次用户可以参加 10 questios quiz.If user in question_no 10 如何取消设置会话 lastids
  • 抱歉重播晚了,如果你不介意请为我解释每一行。在这个 naveensurya325@gmail.com
猜你喜欢
  • 2015-06-11
  • 2017-11-17
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多