我的一个CMS解决方案中有一个多删除功能,我有以下代码:
public function actionDelete() {
if(Yii::app()->request->isPostRequest) {
if(isseT($_POST['submit'])) {
if(isset($_POST['delete']) && (sizeof($_POST['delete']))) {
foreach($_POST['delete'] as $i => $items) {
$model[$i] = Pages::model()->findByPk((int)$items);
if(!is_null($model[$i])) {
$image[$i] = $model[$i]->image;
if($model[$i]->delete()) {
if(!unlink($image[$i])) {
die('Unable to delete Page Image.');
}
}
}
}
}
}
}
$this->redirect('/admin/pages');
}
这是Yii控制器的操作,在每个页面上都有一个值填充在“image”字段/列中。
在我使用post数据调用此操作后,它会从数据库表中删除记录,但它不会从文件系统中删除图片和图像,脚本永远不会出现在这一点上:{{1} }
PHP是否有可能剥离并忽略die('Unable to delete Page Image.');
函数,主要是在生产/实时服务器上?
答案 0 :(得分:4)
PHP是否有可能剥离并忽略unlink功能,主要是在生产/实时服务器上?
不,绝对不是(除非他们disabled that function但是应该抛出错误)。它是逻辑错误,权限错误或路径错误。
答案 1 :(得分:1)
1:我的第一个建议是测试$ model [$ i] - >图像值,以确保它输出你想要输出的内容。然后,在尝试取消链接之前,请输出$ image [$ i] RIGHT。 确保您没有尝试删除不存在的文件(这将永远是成功的。)在尝试删除文件之前测试文件是否存在。我怀疑这是一个非常可能的情况。或许$ model [$ i] - >图像在Web访问方面保存图像路径,而不是文件系统?
2:我强烈建议您撤消删除顺序。
现在,首先删除数据库行,然后删除图像。如果删除过程中途失败,那么您丢失了指向需要删除的图像的链接。
如果你这样做:
if(!unlink($image[$i])) {
if($model[$i]->delete()) {
die('Unable to delete Page Image.');
}
}
这允许您仅在成功删除图像时删除数据库条目,这有助于防止未附加的图像浮动在文件系统周围。如果删除过程失败,您仍然拥有尝试再次删除它所需的所有信息。