Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP中,AppController中的beforeRender保存到数据库两次_Php_Cakephp - Fatal编程技术网

在CakePHP中,AppController中的beforeRender保存到数据库两次

在CakePHP中,AppController中的beforeRender保存到数据库两次,php,cakephp,Php,Cakephp,我是CakePHP新手,所以我仍然在学习很多行为和一切。我正在努力寻找解决方案的一个事实是,我在AppController中有一个使用beforeRender的代码。代码将用户的ID、IP地址和页面加载的当前时间保存到数据库中,以便记录活动 我得到了一个相当奇怪的结果,尽管我已经四处寻找答案,但还是没能找到。加载由另一个控制器(在本例中为UserController)控制的页面时,它会将数据保存到数据库中,并保存一个精确的副本 现在我只有几页。主索引页、登录页、注册页、用户配置文件页和用户设置页

我是CakePHP新手,所以我仍然在学习很多行为和一切。我正在努力寻找解决方案的一个事实是,我在AppController中有一个使用beforeRender的代码。代码将用户的ID、IP地址和页面加载的当前时间保存到数据库中,以便记录活动

我得到了一个相当奇怪的结果,尽管我已经四处寻找答案,但还是没能找到。加载由另一个控制器(在本例中为UserController)控制的页面时,它会将数据保存到数据库中,并保存一个精确的副本

现在我只有几页。主索引页、登录页、注册页、用户配置文件页和用户设置页。除了索引页以外的所有内容都在UserController中控制,但是我有一个来自login和register页的重定向,因此它们的URL是/login而不是/users/login。有趣的是,这些副本并不是在登录或注册页面上创建的,而是在概要文件和设置页面上创建的

我最初将代码放在beforeFilter中,得到了相同数据的3个副本,而不是2个。我也在后滤器中试过,但我仍然得到了2份

我应该提到,我正在更新的三个字段不在数据库的Users表中,它们有自己的表“Activities”

这是我在AppController中的beforeRender代码:

public function beforeRender() {
    if ($user = $this->Session->read('Auth.User')) {
        $this->loadModel('User');
        $this->loadModel('Activity');
        $data['User']['id'] = $this->Auth->user('id');
        $data['Activity']['user_ip'] = $this->request->clientIp();
        $data['Activity']['user_id'] = $data['User']['id'];
        $data['Activity']['last_activity'] = date("Y-m-d H:i:s");
        $this->Activity->save($data);
    }
}
根据请求,这是配置文件页面的控制器操作,是导致重复的操作之一:

public function profile($id = null) {
        $this->loadModel('User');
        $this->User->id = $id;
        $this->request->data['User']['id'] = $this->Auth->user('id');
        if (!$this->User->exists()) {
            throw new NotFoundException(__('User not found'));
        }
        $user = $this->User->findById($id);
        if (!$user) {
        throw new NotFoundException(__('User not found'));
        }
        $this->set('user', $this->User->read(null, $id));
        $this->set('title_for_layout', $user['User']['screenname'] . "'s" . ' ' . 'Profile');
    }
以及配置文件页面的视图(主要是基本的HTML):


用户信息
成员类型
--
成员自
最后激活
地位
总数
--
论坛帖子
--
成就
--
任务完成了
--

也许是因为你有

$this->redirect(array('action' => 'index'));

在你的控制器里。加载索引页时,将再次调用beforeRender函数。

这与重复问题无关,但不要对活动使用
$This->request->data
,因为它可能包含POST数据。因此,如果您的某个页面发布表单,则
$this->request->data
中会有大量数据,在保存到
activities
表时可能会出现问题。只需使用
$data['User']['id']=$this->Auth->User('id')等等。并通过
$this->Activity->save($data)进行保存回复:重复:请发布控制器和查看其中一个违规操作的代码。你在哪里调用
requestAction()
anywhere?@Costa,正如你所说,我将活动更改为$data,并且我还使用控制器和配置文件页面的视图更新了帖子,这是导致重复的两个原因之一。对我来说似乎很好。您确定在其他回调中没有类似的代码吗?检查AppController和你的控制器。我相当肯定…'在我的UserController中根本没有使用activity,而我的AppController只有几个其他函数,它们甚至都不接近activity。是否有一个比AppController更好的地方可以在每个页面上放置我想要的函数?
$this->redirect(array('action' => 'index'));