1

CMSソリューションの1つに複数削除機能があり、次のコードがあります。

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 に答える