CodeIgniter:连续两个模型方法导致内部服务器错误


CodeIgniter: Two Model-Methods in a row cause Internal Server Error

我对CodeIgniter很陌生,正在努力完成我的第一个项目。我有两个ajax数据库更新函数,它们(本身)工作得非常好。

(因为查询是这样工作的,所以为了这个例子,我简化了:)

    public function updateA($data) {
            $this->pos1    = $data['pos1'];
            $this->pos2    = $data['pos2']; 
            $this->db->where('id', 1);
            $result = $this->db->update('tablePos', $this);
    }

    public function updateB($data) {
            foreach ($data as $value) {
                    $this->name    = $value['name'];
                    $this->type    = $value['type']; 
                    $this->db->where('id', $value['ID']);
                    $result = $this->db->update('tableNames', $this);
            }
    }

如前所述,如果我在我的控制器中称他们为"单独",他们两个的工作方式都很有魅力。就像

$this->MainModel->updateA($data);

$this->MainModel->updateB($data);

但不是

$this->MainModel->updateA($data);
$this->MainModel->updateB($data);

然后执行第一个查询,但不执行第二个查询。我先打哪个电话没有区别。如果我连续调用这两个函数,则只执行第一个,并且我的ajax函数返回

加载资源失败:服务器响应状态为500(内部服务器错误)

我整晚都在寻找——毫无线索…:(

编辑:

我现在将所有内容隔离到一个测试用例中:

控制器:

        public function parse()
    {
            $this->load->model('MainModel');
            $position =  '{"ID":1,"pos1":5,"pos2":6}';
            $position = json_decode($position, true);
            $names =  '[{"ID":1,"name":"AAAA","type":9},{"ID":2,"name":"BBBBB","type":2},{"ID":3,"name":"CC","type":4}]';
            $names = json_decode($names, true);
            $this->MainModel->updateA($position);
            $this->MainModel->updateB($names);
    }

型号:

        public function updateA($data_a) {
            error_log("----------- start A -----------");
            $this->pos1    = $data_a['pos1'];
            $this->pos2    = $data_a['pos2']; 
            $this->db->where('id', 1);
            $result = $this->db->update('tablePos', $this);
            error_log($this->db->last_query());
            error_log("----------- stop A -----------");
    }

    public function updateB($data_b) {
            error_log("----------- start B -----------");
            foreach ($data_b as $value) {
                    $this->name    = $value['name'];
                    $this->type    = $value['type']; 
                    $this->db->where('id', $value['ID']);
                    $result = $this->db->update('tableNames', $this);
                    error_log($this->db->last_query());
            }
            error_log("----------- stop B -----------");
    }

两个更新调用的错误日志结果:

【2015年12月3日14:13:15欧洲/柏林】---------------启动A---------------

【2015年12月3日14:13:15欧洲/柏林】更新tablePos设置pos1=5,pos2=6其中id=1

【2015年12月3日14:13:15欧洲/柏林】---------------停止A---------------

【2015年12月3日14:13:15欧洲/柏林】---------------启动B----------------

结果

    $this->MainModel->updateA($position);
    // $this->MainModel->updateB($names);

【2015年12月3日14:23:23欧洲/柏林】---------------启动A---------------

【2015年12月3日14:23:23欧洲/柏林】更新tablePos设置pos1=5,pos2=6其中id=1

【2015年12月3日14:23:23欧洲/柏林】---------------停止A---------------

结果

    // $this->MainModel->updateA($position);
    $this->MainModel->updateB($names);

【2015年12月3日14:25:14欧洲/柏林】---------------启动B----------------

【2015年12月3日14:25:14欧洲/柏林】更新tableNames设置name=‘AAAA’,type=9其中id=1

更新tableNames设置name="BBBBB",type=2其中id=2

【2015年12月3日14:25:14欧洲/柏林】更新tableNames设置name='CC',type=4其中id=3

【2015年12月3日14:25:14欧洲/柏林】---------------停止B----------------

它只是停了下来。没有错误。当我触发它们时,错误日志确实显示了其他php错误。所以这对我来说绝对是神秘的。。。

尝试更改方法以使用局部变量,而不是类属性$this,如下所示:

public function updateA($data_a) {
            error_log("----------- start A -----------");
            $this->db->where('id', 1);
            $updateData = array(
                               'pos1' => $data_a['pos1'],
                               'pos2' =>  $data_a['pos2'],
                           ); 
            $result = $this->db->update('tablePos', $updateData);
            error_log($this->db->last_query());
            error_log("----------- stop A -----------");
    } 

  public function updateB($data_b) {
            error_log("----------- start B -----------");
            foreach ($data_b as $value) {
                  $updateData = array(
                               'name' => $value['name'],
                               'type' =>  $value['type'],
                           ); 
                    $this->db->where('id', $value['ID']);
                    $result = $this->db->update('tableNames',$updateData);
                    error_log($this->db->last_query());
            }
            error_log("----------- stop B -----------");
    }

一个可能的原因可能是加载模型时初始化了类属性。

对于使用$this更新时的第二个调用,该类仍然保留在第一次更新期间使用的属性,由于此处不需要这些属性,因此它们会导致错误。

然而,我不确定这些值如何没有反映在您记录的查询中。

对不起,我无法添加评论,所以我将在此处添加我的评论。

Codeigniter文档中说

https://ellislab.com/codeigniter/user-guide/general/models.html#anatomy

其中Model_name是类的名称。类名的第一个字母必须大写,其余字母小写

并且您的模型的名称不符合此规则。