0

配列内のすべてのアイテムで関数を実行することについてはよくわかりませんが、PHPはまだかなり新しいです。以下$pic_locは、実行された検索条件に一致する画像へのパスとファイル名を含むMySQLからのデータ配列です。

unlink見つかったすべての人で関数を実行しようとしました。エラーは返されません。私は正しい道だとは思いませんforeachが、誰かが私を正しい方向に向けることができますか?

 $pic_loc = $cell_pictures['pic_loc']; //gathers an array from the database of files locations

    $pics_to_delete .= "../../".$pic_loc; //corrects the directory

    foreach($pics_to_delete as $pics_being_deleted) //deletes all pictures found
    {

    unlink($pics_being_deleted);

    }

編集:私は両方の答えをたくさんいじくり回しました、私は問題なく個々のファイルに対してそれを行うことができるので、私は2層上のファイルを削除できることを知っています。これは私が現在行っていることですwhile()。foreachが機能するための問題を引き起こしている可能性があると考えて、ループを取り除きました。

$data_array2 = mysql_query("SELECT * FROM pictures WHERE user_id = '".$id."'");
$cell_pictures = mysql_fetch_array($data_array2);


foreach($cell_pictures['pic_loc'] as $pics_being_deleted) //deletes all pictures found
{

unlink("../../".$pics_being_deleted);

}

これが今返すエラーです:

Warning: Invalid argument supplied for foreach() // on the line that the foreach is on

編集:わかりました、それは厄介でした、しかし私はそれを手に入れました!!! クエリからのデータは配列であると思われるかもしれませんが、実際には配列として設定する必要はありませんでした。これは私がそれをした方法です:

$data_array2 = mysql_query("SELECT pic_loc FROM pictures WHERE user_id = '".$id."'");


while($cell_pictures = mysql_fetch_array($data_array2))
{
$the_pics = $cell_pictures['pic_loc'];
$pics_as_array = array($the_pics);
}

foreach($pics_as_array as $pics_being_deleted) 
{

unlink("../../".$pics_being_deleted);


}

これはうまく機能します。これを読むために時間を割いてくれてありがとう!-マイク

4

3 に答える 3

2

実際foreach、あなたがやりたいことは完全に大丈夫です。

ただし、ロジックの一部を反復内に配置する必要があります。どれどれ:

$directory = realpath("../../"); // the directory where files are placed
foreach ($pics_to_delete as $basename) //deletes all pictures found
{
    $path = sprtinf('%s/%s', $directory, $basename);
    unlink($path);
}

より良いオプションは、逆の方法でそれを行うことです。最初にディレクトリとその中のすべてのファイルを取得し、次に削除するファイルに対してそのリストをフィルタリングします。名前が一致する場合にのみ、次の手順に進みます。

$dir = new  DirectoryIterator($path);
$toDelete = new DeleteFilter($dir, $pics_to_delete);
foreach ($toDelete as $file)
{
    printf("Delete: %s\n", $file->getPathname());
    unlink($file->getPathname());
}

PHPに同DirectoryIterator梱されています。これDeleteFilterは小さいためFilterIterator、一致する実際のファイルと配列からのエントリのみ$pics_to_deleteが返されます。

class DeleteFilter extends FilterIterator
{
    private $filenames;

    public function __construct(Iterator $iterator, array $filenames)
    {
        $this->filenames = $filenames;
        parent::__construct($iterator);
    }

    public function accept()
    {
        $current = $this->getInnerIterator()->current();
        if (!($current instanceof SplFileInfo)) {
            return FALSE;
        }
        if (!$current->isFile()) {
            return FALSE;
        }
        return in_array($current->getBasename(), $this->filenames);
    }
}

そのフィルターイテレーターは必要ありません。代わりに、そのロジックを内部に記述できますが、foreachこれはより流暢だと思います。

于 2012-04-16T10:08:36.890 に答える
1

$ cell_pictures ['pic_loc']が削除されるファイルの配列である場合、

foreach($cell_pictures['pic_loc'] as $pics_being_deleted) //deletes all pictures found
{

unlink("../../".$pics_being_deleted);

}
于 2012-04-16T10:07:40.797 に答える
0

場合によっては、Webホストの設定で、自分より上位のフォルダーであるファイルを削除またはアクセスする権限がないことがあります。あなたの場合、2つのフォルダを上に移動します。

写真を削除しようとしているファイルの下に写真が保存されるように、プログラムを再構築する必要があるかもしれません。

さらに、リンクを解除するために正しいファイル名文字列を渡していることを確認してください。よくわからない場合は、テスト用にファイル名をエコーすることができます。

于 2012-04-16T10:16:46.323 に答える