php - 如何在 codeigniter 中将值内爆并插入到数据库中?

标签 php mysql json 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

在我的 Controller 中:

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

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

最佳答案

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

Normalize your Data

You should prevent to store your information in the table like that. It should be possible to normalize your data properly. If you dont know how to do that the following link could be interesting:

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

关于php - 如何在 codeigniter 中将值内爆并插入到数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43199448/

相关文章:

php - 使用数据透视模型找不到 Laravel 基表

php - 如何根据两个单元格值进行搜索

angularjs - 在 AngularJS 中使用重复键迭代 json 响应

python - Django Restful API 返回空 Json

php - 选择最近 30 天的所有订单,并计算每天有多少

php - Laravel 将每个逗号分隔值存储到另一个表中

php - mysql 查询不起作用

javascript - 加载 JSON 文档并根据键 :value pairs with JavaScript 中的一个或多个值对其进行排序

PHP 数组转换为 Javascript 数组

java - 使用 Java 将数据插入 mySQL DB 时出错