Поле даты Cakephp для каждого запроса

Я использую cakephp 2.9 и пытаюсь записать в базу данных каждое последнее взаимодействие пользователя с моим веб-приложением, которое является полем даты и времени «последняя активность» в таблице пользователей.

Для этого я решил написать код внутри AppController’s beforeRender. Итак, мой код таков:

Function beforeRender()
{
$this->loadModel('User');
$this->User->id=(int)$this->Session- 
>read('Users.UserData.User.id');
$this->User->savefield('lastactivity', date('Y-m-d H:i:s'));
}

Функция запускается для каждого запроса, как и ожидалось, но вместо обновления значения последней активности зарегистрированного пользователя поле сохранения создает новые строки в пользовательской таблице.

Мне кажется, все в порядке, я сбросил значение идентификатора пользователя, и все в порядке, я перечитал этот код сотни раз. Мое единственное предположение, что я упускаю что-то из базовой функциональности, если перед Render ... Я не знаю.

Кто-нибудь может мне помочь?


person Chrishow    schedule 27.08.2019    source источник
comment
Вы подтвердили правильность установки $this->User->id?   -  person Greg Schmidt    schedule 27.08.2019
comment
Вот этот [code](int)$this-›Session- ›read('Users.UserData.User.id'); [/code] имеет значение, и я присваиваю его, я и, насколько я знаю, торт работает, устанавливая существующий идентификатор, который он сообщает savefield для изменения вместо создания. Как еще я мог отладить его?   -  person Chrishow    schedule 27.08.2019
comment
Просто вывести $this->User->id после того, как вы его установили, чтобы быть абсолютно уверенным, что это то, что вы ожидаете. Такого рода ошибки очень часто вызваны такими вещами, как, например, опечатки в пути сеанса, который вы читаете.   -  person Greg Schmidt    schedule 27.08.2019


Ответы (1)


Спасибо, Грег, но каким-то образом я решил это; конечно, не самый красивый способ, но работает как шарм. Просто изменил приведенный выше код на:

function afterFilter()
{
    $id=(int)$this->Session->read('Users.UserData.User.id');
    $this->loadModel('User');
    $this->User->query('UPDATE users SET lastlogin="'.date("Y-m-d H:i:s").'" WHERE id='.$id);
}

Я также хочу указать, что beforeRender изменился на afterFilter, так как таким образом код запускается после загрузки запроса, таким образом я избегаю ненужной задержки для пользователя.

person Chrishow    schedule 27.08.2019