如何在codeigniter中内爆并将值插入db?

时间:2017-04-04 06:06:08

标签: 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

在我的控制器中:

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

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

1 个答案:

答案 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());

    }

}

作为补充,你需要一个Collection Object(把它放在你的模型下面)

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