【问题标题】:PHP unlink doesn't workPHP取消链接不起作用
【发布时间】:2015-07-04 04:30:05
【问题描述】:

我的一个 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 函数,主要是在生产/实时服务器上?

【问题讨论】:

  • unlink 之前调用is_file 以确保它确实存在,可能是路径问题
  • 蜘蛛侠写了这段代码?这么多嵌套的 if 循环......哎呀
  • 不,这不是问题!我通常将文件的完整路径存储在“图像”列中!
  • @robert - 我可以在一个 IF 条件中设置所有这些条件,但这不利于可读性!
  • 如果有一天你换了服务器,你的路径变了怎么办:) 无论如何,你确定is_file返回true,你可以快速检查吗? :)

标签: php yii unlink


【解决方案1】:

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

不,绝对不是(除非他们有disabled that function,但这应该会引发错误)。它可能是逻辑错误、权限错误或路径错误。

【讨论】:

  • 权限!让我 chmod 777 他们然后重试!
  • 在取消链接手册页中看到了这个 releted 链接。 php.net/manual/en/function.unlink.php#104370
  • 就是这样!权限不好,服务器安装上可以取消链接,路径正常,逻辑正常 :) 谢谢!
【解决方案2】:

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

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

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

如果您改为这样做:

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

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

【讨论】:

  • 找我试试看 :)
  • 哦,谢谢! :) 那是 15 个代表! (返回以支持之前问题的答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多