1

我的一个 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 控制器的操作,在每一页的“图像”字段/列中都有一个值。

在我使用发布数据调用此操作后,它实际上从数据库表中删除了记录,但它没有从文件系统中删除图片和图像,并且脚本从未出现过这一点:die('Unable to delete Page Image.');

PHP是否有可能剥离并忽略该unlink功能,主要是在生产/实时服务器上?

4

2 回答 2

4

PHP是否有可能剥离并忽略取消链接功能,主要是在生产/实时服务器上?

不,绝对不是(除非他们禁用了该功能但应该引发错误)。它可能是逻辑错误、权限错误或路径错误。

于 2013-03-06T17:00:12.937 回答
1

1:我的第一个建议是测试 $model[$i]->image 值,以确保它输出的是您想要输出的内容。然后,在尝试取消链接之前执行 $image[$i] RIGHT 的输出。 确保您没有尝试删除不存在的文件(这将始终成功)。 在尝试删除文件之前测试文件的存在。我怀疑这是一个很可能的情况。也许 $model[$i]->image 正在以 Web 访问的方式保存图像路径,而不是作为文件系统?

2:我强烈建议颠倒您的删除顺序。

现在,首先删除数据库行,然后删除图像。如果删除过程中途失败,那么您丢失了指向需要删除的图像的链接。

如果您改为这样做:

if(!unlink($image[$i])) {
    if($model[$i]->delete()) {
        die('Unable to delete Page Image.');
    }
}

这允许您仅在成功删除映像时删除数据库条目,这将有助于防止未附加的映像在文件系统中浮动。如果删除过程失败,您仍然拥有再次尝试删除它所需的所有信息。

于 2013-03-06T17:00:44.180 回答