我有一个包含用户个人资料的网站。我删除了phpmyadmin中的大量配置文件,但我删除的配置文件仍将其图片文件放在网站上的文件夹中。
我正在寻找一个我可以运行的脚本,它将选择/删除文件夹中与数据库中任何现有配置文件无关的所有图片。
典型的图像名称是这样的:0ae71e1bc25cae7e243464adb.jpg
我确定有办法做到这一点,但我并不是使用mysql操作的主要专家。
所以试图更清楚:
我已经让100个现有用户说出他们在数据库中的信息,包括他们的个人资料图片名称。
他们的个人资料图片位于服务器上名为images
在同一文件夹中是不存在的用户的图像
我想运行一个脚本,检查该图像是否在"用户"任何用户的表,如果没有,删除它。
您对我们的帮助表示赞赏。
答案 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){
}