Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数组中取消链接()_Php_Mysql_Arrays - Fatal编程技术网

Php 从数组中取消链接()

Php 从数组中取消链接(),php,mysql,arrays,Php,Mysql,Arrays,不太了解如何在数组中的每个项目上运行函数,这对PHP来说还是很新的,下面的$pic_loc是一个从MySQL到图像的数据数组,其中包含路径和文件名,匹配执行的任何搜索条件 试图让unlink函数在找到的每个人身上运行。没有错误返回。我认为foreachforeach不是正确的方式,有人能给我指出正确的方向吗 $pic_loc = $cell_pictures['pic_loc']; //gathers an array from the database of files locations

不太了解如何在数组中的每个项目上运行函数,这对PHP来说还是很新的,下面的
$pic_loc
是一个从MySQL到图像的数据数组,其中包含路径和文件名,匹配执行的任何搜索条件

试图让
unlink
函数在找到的每个人身上运行。没有错误返回。我认为foreach
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);

    }
编辑: 我对这两个答案都做了很多修改,我知道我可以删除两层以上的文件,因为我可以毫无问题地删除单个文件。这就是我目前正在做的,我去掉了
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);


}
这个很好用。感谢大家花时间来阅读这篇文章!
-Mike

如果$cell\u pictures['pic\u loc']是要删除的文件数组,则

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

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

}

如果$cell_pictures['pic_loc']是要删除的文件数组,则

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

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

}

实际上,
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\u to\u 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
中编写该逻辑,但是我认为这一个更流畅。

实际上
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\u to\u 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
中编写该逻辑,但是我认为这一个更流畅。

有时候,web主机设置是您无权删除或访问任何高于您的文件夹的文件。在您的情况下,您将向上移动两个文件夹

您可能需要重新构造程序,以便图片存储在试图删除它们的文件下面


此外,请确保传递正确的文件名字符串以取消链接。如果您不确定,可以回显文件名以进行测试。

有时,web主机设置为您无权删除或访问任何高于您所在文件夹的文件。在您的情况下,您将向上移动两个文件夹

您可能需要重新构造程序,以便图片存储在试图删除它们的文件下面


此外,请确保传递正确的文件名字符串以取消链接。如果您不确定,可以回显文件名以进行测试。

有一个
array\u walk
函数,但是foreach也不是那么糟糕。@user1053263那么有什么问题吗?图片没有被删除?似乎$Pics_to_delete是一个字符串,而不是一个可以通过foreach访问的数组。如果你想获取一个目录中所有文件的数组,请使用
scandir
函数。@ozzy,是的,图片没有被删除,John,我只是假设它是一个数组,因为我使用mysql\u fetch\u array()来获取数据。有一个
array\u walk
函数,但foreach也没那么糟糕。@user1053263那么问题出在哪里?图片没有被删除?似乎$Pics_to_delete是一个字符串,而不是一个可以通过foreach访问的数组。如果你想获取一个目录中所有文件的数组,请使用
scandir
函数。@ozzy,是的,图片没有被删除,John,我只是假设它是一个数组,因为我使用mysql\u fetch\u array()来获取数据。我将尝试你的第二个选项。这是一堆!第二种选择有效!我只是不能用它,因为我想它扫描目录会对高清更具吸引力。我要试试你的第二个选择,一堆!第二种选择有效!我只是无法使用它,因为我认为它扫描目录会对高清更具吸引力。$file=$cell_pictures['pic_loc'];foreach($pics\u文件被删除)。在您编辑的代码中尝试此操作。$file=$cell_pictures['pic_loc'];foreach($pics\u文件被删除)。在您编辑的代码中尝试此操作。