CakePHP用户会话没有更新,但数据库是

时间:2011-05-31 18:54:39

标签: database session cakephp

我正在使用cakePhP进行开发,我遇到以下问题:

当用户使用他的姓名和密码登录我创建的帐户系统时,他可以将项目(图像)保存为收藏夹。这将保存在文本字段中的数据库中。保存的是图像ID。

保存过程完美无缺,用户点击图像并将它们添加到该字段(它实际上将所有ID保存为我稍后处理的文本数组)。

删除图像时出现问题。当用户这样做时(我将发布下面的代码),图像将从数据库中正确删除(我转到PHP MyAdmin,我看到它)。这意味着保存喜爱图像ID的数组会立即更新。但是,当我从网站重新加载该数组时,它尚未更新。它就像是存放在caché中的东西。然后,如果用户注销并再次登录,那么他可以看到正确的。问题是我的网站中有其他东西以类似的方式工作,它们都会立即更新,所以我不明白为什么不这样做。

这是我用来从数据库中删除ID的代码:

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");行(现在引用的那个),那么问题就不存在了!这就是我以前的方式。 HOWEVER ,我不得不改变它,因为它是一个很大的安全漏洞,因为用户ID($ id)是一个可见参数,任何人都可以更改,然后访问其他用户帐户。我所做的是改变我获得喜欢图像的用户数组的方式,使用以下行:$user = $this->Auth->user();。这就是我现在的方式(好吧,也没有函数头中的$ id参数),因此用户信息(包括收藏夹数组)来自Auth组件,而不是直接来自数据库。 / p>

所以,问题很清楚:当用户删除收藏夹时,它会在数据库中的数组上执行此操作。当我显示该操作的结果时,我正在检索的数组不是数据库中的数组,而是会话中的数组。这就是它没有显示变化的原因。

如果不使用像以前那样的非安全方法,我怎么能避免这种情况?

2 个答案:

答案 0 :(得分:0)

这可能有两个问题。

  1. 您的deleteFavoritePicture方法是什么样的?那里可能会出现问题。
  2. 您将false作为第二个参数传递给User::save方法,这意味着您不想验证。除非存在SQL错误,否则即使它没有正确验证,也会返回true,我相信。尝试将此false更改为true,看看您的结果是否有所不同。

答案 1 :(得分:0)

保存时,传递给模型的save方法的数组应如下所示:

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

在您的示例中,您显然没有添加[User]密钥。

此外,您的modified字段实际上是默认的Cake modified字段吗?也就是说,DATETIME字段更改为更新行时的当前时间?

最后,也许你在config.php中将调试设置为2。尝试将此更改为0(如在生产中)并查看缓存是否仍然存在。

希望我上面提到的一些观点可以解决你的问题。请让我知道!