使用PHP / SQL进行选择,然后删除用户表

时间:2016-08-06 00:56:37

标签: mysql

我有一个包含用户个人资料的网站。我删除了phpmyadmin中的大量配置文件,但我删除的配置文件仍将其图片文件放在网站上的文件夹中。

我正在寻找一个我可以运行的脚本,它将选择/删除文件夹中与数据库中任何现有配置文件无关的所有图片。

典型的图像名称是这样的:0ae71e1bc25cae7e243464adb.jpg

我确定有办法做到这一点,但我并不是使用mysql操作的主要专家。

所以试图更清楚:

  • 我已经让100个现有用户说出他们在数据库中的信息,包括他们的个人资料图片名称。

  • 他们的个人资料图片位于服务器上名为images

  • 的文件夹中
  • 在同一文件夹中是不存在的用户的图像

  • 我想运行一个脚本,检查该图像是否在"用户"任何用户的表,如果没有,删除它。

您对我们的帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我认为这个脚本应该可以解决问题。

// Query the images paths as array using mysqli
$db = new mysqli("localhost", "user", "pass", "foo_db"); 
$result = $db->query("SELECT image_path FROM users");    
$images_db = $result->fetch_all(MYSQLI_ASSOC);

// Use glob to retrieve all the existing img in dir
$directory = "/home/user/public_html/images/";
$images_dir = glob($directory . "*.*");

// if image_dir is not in images_db delete it using unlink fn
foreach($images_dir as $image_dir) {
  if (!in_array($image_dir, $images_db)) {
   unlink($directory . $image_dir);
  }
}

您必须根据需要调整脚本 小心取消链接!首先在本地测试脚本!

答案 1 :(得分:0)

更轻松的内存解决方案:

$files = scandir(DIR_TO_IMAGES_FOLDER);
$db_conn = create_db_connection(); //assume this creates the connection to your db and return false if it cant;
if (!$db_conn) exit(); //no connection
foreach ($files as $file){
  if (is_file($file)){
      $query = "SELECT COUNT(*)
                FROM TABLE_NAME
                WHERE image_name=:image_name";
      $result = $db_conn->prepare($query);
      $result->bindParam(":image_name", $file);
      $in_use = true; //assume it is in use just incase sql execute fails;
      try{
        $result->execute();
        $in_use = $result->fetchColumn();
      }catch (Exception $e){

      }

      if (!$in_use) unlink(DIR_TO_IMAGES_FOLDER . '/' . $file);
  }
}

但是我会在你的用户'上创建一个新的TABLE image_delete_pending和一个触发器BEFORE DELETE。表。触发器会将image_name插入image_delete_pending TABLE。然后脚本肯定会知道image_delete_pending中的每个图像都需要删除。

然后脚本将是:

$db_conn = create_db_connection(); //assume this creates the connection to your db and return false if it cant;
if (!$db_conn) exit(); //end script; no connection

$query = "SELECT image_name
          FROM image_delete_pending;";
try{

    $result = $db_conn->prepare($query);
    $result->execute();
    while ($row = $result->fetch()){
         if(unlink(DIR_TO_IMAGES_FOLDER . '/' . $row['image_name'])){
            $db_conn->query("DELETE FROM image_delete_pending WHERE image_name='". $row['image_name'] ."';";
         }

    }

}catch (Exception $e){

}