PHP在for循环中擦除文件

时间:2013-07-24 22:59:45

标签: php mysql

我的库存中有一系列汽车,每张最多可以有12张照片。如果我愿意,我可以成功擦除汽车,我遇到的麻烦也是擦除图片。

所以我可以查询这样的内容:

$pictures = "picture1, picture2, picture3, picture4, picture5, picture6, picture7, picture8, picture9, picture10, picture11, picture12";
$data = mysql_fetch_assoc(mysql_query("SELECT $pictures FROM `auto` WHERE `auto_id` = $autoid"));

使用$data变量,我可以访问图片的名称,如echo $data['picture1'];

我正在尝试使循环遍历每张图片,只要db中的字段不为空,从数据创建这些文件路径的数组并循环遍历使用{{1}的数组擦除它们}?

SO FAR SOLUTION [有效但需要改进吗?]

unlink()

2 个答案:

答案 0 :(得分:0)

在查询后添加一个foreach循环。

    foreach($data AS $photo)
    {
         if (!empty($photo) && file_exists($photo)) unlink($photo);
    }

更新了答案,添加了file_exists()

答案 1 :(得分:0)

你可以做一个for循环,将循环索引值附加到字符串' picture'然后使用它来访问$ data []元素。 为什么你只能做一些像:

这样的事情
foreach ($data as $picname) {
  if (file_exists($picname) && is_file($picname)) unlink($picname);
}

容易。

好的,让我们来看看: 这是一个小问题,但我更喜欢使用array_key_exists而不是isset。如果不使用foreach,我会使用for循环并保存自己必须在查询字符串中规定picture [n]列。那怎么样:

if (array_key_exists('delete',$_POST))
{
    // not needed
    // $pictures = "picture1, picture2, picture3, picture4, picture5, picture6, picture7,
    // picture8, picture9, picture10, picture11, picture12";
    // if $autoid is an integer, you can reduce the risk of sql injection by intval()
    // otherwise look at using preg_replace or using mysqli functions with prepare and bind_params
    $autoid=intval($autoid); 
    $res=mysql_query("SELECT * FROM `auto` WHERE `auto_id` = $autoid"));
    if (!($res===false))
    {
      $data = mysql_fetch_assoc($res);
      if (!($data===false))
      {
        for ($i=0; $i<=12; $i++)
        {
          $pic_col="picture$i";
          if (!array_key_exists("$pic_col",$data) || !strcmp(trim($data["$pic_col"]))) continue;
          $picname = '../../'.trim($data["$pic_col"]);
          if (file_exists($picname) && is_file($picname)) unlink($picname);
        }
      }
    }
    mysql_query("DELETE FROM `auto` WHERE `auto_id` = $autoid");
    header('Location: ../../admin.php?manage_vehicles');
    exit();
}