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

时间:2015-12-03 12:12:10

标签: php codeigniter

我对CodeIgniter很陌生,并尝试完成我的第一个项目。我有两个ajax db-update函数(对于他们自己)完全正常工作。

(因为查询就像这样工作,我为了这个例子而简化:)

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

OR

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

MODEL:

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

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

  

[2015年12月3日14:13:15欧洲/柏林] -----------开始A -----------

     

[03-Dec-2015 14:13:15欧洲/柏林]更新tablePos SET pos1 = 5,pos2 = 6 WHERE 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 -----------

     

[03-Dec-2015 14:23:23 Europe / Berlin] UPDATE tablePos SET pos1 = 5,pos2 = 6 WHERE id = 1

     

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

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

[2015年12月3日14:25:14欧洲/柏林] -----------开始B -----------

     

[03-Dec-2015 14:25:14 Europe / Berlin] UPDATE tableNames SET name ='AAAA',type = 9 WHERE id = 1 [03-Dec-2015 14:25:14欧洲/柏林]

     

更新tableNames设置name ='BBBBB',type = 2 WHERE id = 2

     

[03-Dec-2015 14:25:14 Europe / Berlin] UPDATE tableNames SET name ='CC',type = 4 WHERE id = 3

     

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

它停止了。没有错误。当我激怒它们时,错误日志会显示其他php错误。所以这对我来说绝对神秘......

2 个答案:

答案 0 :(得分:1)

尝试更改方法以使用局部变量而不是类属性$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更新时的第二次调用,该类仍保留在首次更新期间使用的属性,因为这里不需要它们,它们会导致错误。

但是我不确定这些值是如何反映在您记录的查询中的。

答案 1 :(得分:0)

抱歉,我无法添加评论,因此我会在此处添加评论。

在Codeigniter文档中说

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

其中Model_name是您的类的名称。类名必须首字母大写,其余名称为小写

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