Я занимаюсь разработкой с cakePhP, и у меня возникает следующая проблема:
Когда пользователь входит со своим именем и паролем в созданную мной систему учетных записей, он может сохранять элементы (изображения) какизбранные.Это сохраняется в текстовом поле в базе данных.Сохраняется идентификатор изображения.
Процесс сохранения работает отлично, пользователь нажимает на изображения, и они добавляются в это поле (на самом деле все идентификаторы сохраняются в виде текстового массива, который я обрабатываю позже).
Проблема возникает при удалении изображений.Когда пользователь делает это (я опубликую код ниже), изображения правильно удаляются из базы данных (я захожу в PHP MyAdmin и вижу его).Это означает, что массив, содержащий идентификаторы избранных изображений, обновляется мгновенно.Однако, когда я перезагружаю этот массив с веб-сайта, он не был обновлен.Как будто он хранится в кэше или что-то в этом роде.Затем, если пользователь выходит из системы и снова входит в систему, он может видеть правильный.Дело в том, что у меня есть другие вещи на моем веб-сайте, которые работают аналогичным образом, и все они обновляются мгновенно, поэтому я не могу понять, почему это не так.
Это код, который я использую дляудалить идентификатор из базы данных:
function remove_favorite($pictureID) {
$this->User->id = $this->Auth->User('id'); //We get the ID of the current user
$favoritesArray = $this->User->deleteFavoritePicture($this->User->id, $pictureID); //This function retrieves the array (string) of pictures from the user's table, and deletes all the images with the ID passed as parameter, returning the updated array (string)
$fields = array('images_favorites' => $favoritesArray, 'modified' => true); //We indicate the field that we're going to update in the users table
//We save the new string that doesn't contain the deleted image anymore
if($this->User->save($fields, false, array('images_favorites'))) {
$this->Session->setFlash(__('The image has been removed from your favorites', true));
} else {
$this->Session->setFlash(__('Error removing image from favorites, please try again', true));
}
$this->redirect(array('action' => 'manage_favorites',$this->User->id));
}
Вот так выглядит функция deleteFavoritePicture :
function deleteFavoritePicture($userID, $pictureID) {
$userInfo = $this->find("id = $userID");
$favoritePicturesString = $userInfo['User']['images_favorites'];
$favoritePicturesArray = explode(",", $favoritePicturesString); //Array
$i = 0;
while ($i < count($favoritePicturesArray)) {
//We remove from the array the images which ID is the one we receive to delete
if ($favoritePicturesArray[$i] == $pictureID) unset($favoritePicturesArray[$i]);
$i++;
}
$favoritePicturesString = implode(",", $favoritePicturesArray); //String
return ($favoritePicturesString);
}
Вот и все.У кого-нибудь сейчас что может происходить?Большое спасибо заранее за любую подсказку!
РЕДАКТИРОВАТЬ
Хорошо, я думаю, что нашел что-то, что может дать подсказку о том, что здесь происходит:
Это код для действия manage_favorites
:
function manage_favorites($id) {
//$user = $this->User->find("id = $id");
$user = $this->Auth->user();
$this->set('user', $user);
}
Это действие, которое вызывается для страницы, когда пользователь хочет изменить свои избранные.То же действие вызывается, когда пользователь удаляет избранное.Вот в чем дело:
Если я использую параметр $id
в функции manage_favorites
и строку $user = $this->User->find("id = $id");
(указанную сейчас), то проблема не существует!Вот как у меня это было. ОДНАКО , мне пришлось изменить его, потому что это был большой недостаток безопасности, поскольку идентификатор пользователя ($ id) был видимым параметром, который любой мог изменить, а затем получить доступ к учетным записям других пользователей.Я изменил способ получения пользовательского массива избранных изображений, используя следующую строку: $user = $this->Auth->user();
.Вот как у меня это сейчас (ну, а также без параметра $ id в заголовке функции), поэтому информация о пользователе (включая массив избранного) поступает из компонента Auth
, а не напрямую из базы данных.
Итак, проблема ясна: когда пользователь удаляет избранное, он делает это в массиве в базе данных.Когда я показываю результат этой операции, массив, который я извлекаю, не тот, что в БД, а тот, который находится в сеансе .Вот почему он не показывает изменения.
Как можно избежать этого, не используя небезопасный метод, подобный тому, который был у меня раньше?