Сеанс пользователя CakePHP не обновляется, но база данных есть - PullRequest
0 голосов
/ 31 мая 2011

Я занимаюсь разработкой с 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, а не напрямую из базы данных.

Итак, проблема ясна: когда пользователь удаляет избранное, он делает это в массиве в базе данных.Когда я показываю результат этой операции, массив, который я извлекаю, не тот, что в БД, а тот, который находится в сеансе .Вот почему он не показывает изменения.

Как можно избежать этого, не используя небезопасный метод, подобный тому, который был у меня раньше?

Ответы [ 2 ]

0 голосов
/ 31 мая 2011

При сохранении массив, переданный методу save модели, должен выглядеть следующим образом:

[User] => array(
    [field] => value,
    [field2] => value2,
    ...
)

В вашем примере вы явно не добавили клавишу [User].

Кроме того, действительно ли ваше поле modified является полем Cake modified по умолчанию? То есть поле DATETIME, которое изменяется на текущее время при обновлении строки?

Наконец, может быть, вы установили отладку в 2 в config.php. попробуйте изменить это значение на 0 (как в рабочей среде) и посмотрите, сохраняется ли кэширование.

Надеюсь, что некоторые из пунктов, которые я упомянул выше, решат вашу проблему. Пожалуйста, дайте мне знать!

0 голосов
/ 31 мая 2011

Может быть две вещи не так с этим.

  1. Как выглядит ваш deleteFavoritePicture метод?Там может быть что-то не так.
  2. Вы передаете false в качестве второго параметра методу User::save, что означает, что вы не хотите проверять.Если нет ошибки SQL, то это вернет true, даже если он не будет проверен должным образом, я считаю.Попробуйте изменить это false на true и посмотрите, отличаются ли ваши результаты.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...