我正在使用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>
所以,问题很清楚:当用户删除收藏夹时,它会在数据库中的数组上执行此操作。当我显示该操作的结果时,我正在检索的数组不是数据库中的数组,而是会话中的数组。这就是它没有显示变化的原因。
如果不使用像以前那样的非安全方法,我怎么能避免这种情况?
答案 0 :(得分:0)
这可能有两个问题。
deleteFavoritePicture
方法是什么样的?那里可能会出现问题。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(如在生产中)并查看缓存是否仍然存在。
希望我上面提到的一些观点可以解决你的问题。请让我知道!