代码之家  ›  专栏  ›  技术社区  ›  user1386320

PHP取消链接不起作用

  •  1
  • user1386320  · 技术社区  · 13 年前

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

    在我用post数据调用此操作后,它会自动从数据库表中删除记录,但不会从文件系统中删除图片和图像,脚本也不会出现这种情况: die('Unable to delete Page Image.');

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

    2 回复  |  直到 11 年前
        1
  •  4
  •   Mike B    13 年前

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

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

        2
  •  1
  •   Wolfman Joe    13 年前

    1:我的第一个建议是测试$模型[$i]->图像值,以确保它输出的是您希望它输出的内容。然后,在尝试取消链接之前,输出$image[$i]RIGHT。 确保你没有试图删除一个不存在的文件(这总是成功的) 在尝试删除该文件之前,请先测试该文件的存在性。我怀疑这很可能是一种情况。也许$model[$i]->image是从网络访问的角度保存图像路径,而不是作为文件系统?

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

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

    如果您改为这样做:

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

    这使您只能在成功删除图像的情况下删除数据库条目,这将有助于防止未连接的图像在文件系统中浮动。如果删除过程失败,您仍然拥有再次尝试删除所需的所有信息。