保存记录时CakePHP 2.1进入无限循环

时间:2012-03-07 17:10:30

标签: cakephp save cakephp-2.1

这个问题可能听起来很奇怪,事实确实如此。问题在于:我有一个模型FollowingStationLine及其对应的表following_station_lines。在模型中,我试图用$this->save(array('field' => 'value));保存记录。当我点击相应的页面时,该方法似乎是在一个无限循环中调用(我在save语句之前和之后放了一些debug()),它只在达到内存限制时才结束。我甚至试过2GB的内存,但问题仍然存在。

FollowingStationLinesController以外的其他控制器调用方法时也会发生这种情况。除此之外,所有其他模型/表格都按预期工作。我真的无法想象这是什么问题。以下是控制器的代码,分别是模型:

控制器:

    App::uses('AppController', 'Controller');

    class FollowingStationLinesController extends AppController {

    public function admin_set() {
        $this->FollowingStationLine->set(array(1));
    }

}

型号:

App::uses('AppModel', 'Model');

class FollowingStationLine extends AppModel {
    public function set($lineIds = array()){
        if(!is_array($lineIds)){
            return false;   
        }
        $save = array();
        $save[] = array('station_id' => 45);
        debug($save[0]);
        $this->save($save[0]);
    }
  }

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:4)

CakePHP的AppModel类有一个名为'set'的函数,由模型的'save'函数调用。通过覆盖'set',您将在两种方法之间产生循环。

将您的功能重命名为其他内容,您应该没问题。

您可以查看AppModel来源以获取更多信息:https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php


更新:

@mark发表了非常好的评论,如果您的PHP配置包含错误报告模式E_STRICT,那么您将收到错误,因为覆盖了不匹配的签名。

有关设置配置的详细信息:http://php.net/manual/en/migrating5.errorrep.php