اريد كود برمجي يحذف من قاعدة البيانات عمود مع الصورة من الملف لتخزين الصور

  • Moheeb_1994

السلام عليكم ورحمة الله وبركاته

if(isset($_GET['delete'])){

  $delete_id = $_GET['delete'];

  $delete_message = $conn->prepare("DELETE FROM `moto` WHERE id = ?");

  $delete_message->execute([$delete_id]);

  header('location:witmoto.php');

}

هذا الكود البرمجي لا يحذف الصورة من الملف uploade_img/

انما يحذف العمود مع اسم الصورة ولكن اذا فتشت في ملف الرفع للصور اجد الصورة باقية ولا تنحذف ممكن تعدلون على هذا الكود :يحذف العمود من القاعدة و الصورة من الملف uploade_img

وجزاكم الله خيرا

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

 يمكن حذف الصورة من ملف الرفع بعد حذفها من قاعدة البيانات عن طريق الدالة unlink

  $delete_id = $_GET['delete'];
  // احصل على اسم الصورة قبل الحذف
  $query = $conn->prepare("SELECT image FROM moto WHERE id = ?");
  $query->execute([$delete_id]);
  $row = $query->fetch();
  $image_name = $row['image'];  
  $delete_message = $conn->prepare("DELETE FROM `moto` WHERE id = ?");
  $delete_message->execute([$delete_id]);
  // ثم حذف الصورة
  unlink('upload_img/'.$image_name);
  header('location:witmoto.php');
}

حذف مسار الصورة من قاعدة البيانات لا يعني حذف الصورة نفسها، ولذلك ستحتاج بجانب هذا حذف الصورة أيضا.

إليك الشيفرة التالية:

// استرجاع اسم الملف من قاعدة البيانات
$get_filename = $conn->prepare("SELECT image FROM `moto` WHERE id = ?");
$get_filename->execute([$delete_id]);
$filename = $get_filename->fetchColumn();

// حذف الملف من مجلد uploade_img إذا كان موجوداً
if ($filename && file_exists("uploade_img/{$filename}")) {
   unlink("uploade_img/{$filename}");
}

فيكون كاملا:

if(isset($_GET['delete'])) {
    $delete_id = $_GET['delete'];

    // استرجاع اسم الملف من قاعدة البيانات
    $get_filename = $conn->prepare("SELECT image FROM `moto` WHERE id = ?");
    $get_filename->execute([$delete_id]);
    $filename = $get_filename->fetchColumn();

    // حذف السجل من قاعدة البيانات
    $delete_message = $conn->prepare("DELETE FROM `moto` WHERE id = ?");
    $delete_message->execute([$delete_id]);

    // حذف الملف من مجلد uploade_img إذا كان موجوداً
    if ($filename && file_exists("uploade_img/{$filename}")) {
        unlink("uploade_img/{$filename}");
    }
    header('location: witmoto.php');
}

جزيت خيرا و زوجت بكرا الكود اجى في محله

ولكن الان صارت مشكلة أخرى وهو اذا نشرت منشورين يحملون نفس اسم الصورة ترتفع صورة واحدة فقط واسم واحد

واذا حذفت السجل مع الصورة بالكود حقك الذي ارسلته ينحذف السجل الاول مع الصورة والمنشور الاخر يبقى ولكن بلا صورة بسبب ان الصورة انحذفت مع السجل الاول

لو تقدر تعطيني حل وهو عند رفع الصورة يقوم بالكود باضافة مثلا id المنشور الى اسم الصورة وبهذا يكون اسم الصورة غير مساوي للمنشور الثاني اذا رفعته بنفس الصورة :

مثلا اذا رفعت صورة تحمل اسم : moheeb.png فيقوم الكود بزيادة عدد عشوائي او ID المنشور الى اسم الصورة فتكون مثلا :moheeb1.png

واذا رفعت منشور اخر بنفس الصورة :moheeb.png فيعطيها الكود ID المنشور الى اسم الصورة فتكون مثلا moheeb2.png

وهذا هو الكود الذي ارفع به الصور ولكن اذا رفعت صورة تحمل نفس الاسم لا تتكرر في ملف الرفع اذا كانت نفس الاسم تكون صورة واحدة فقط لكل المنشورات واذا حذف الصورة تتخرب جميع المنشورات التي تحمل نفس اسمها

if(isset($_POST['add_product'])){

  $name = $_POST['name'];

  $name = filter_var($name, FILTER_SANITIZE_STRING);

  $city = $_POST['city'];

  $city = filter_var($city, FILTER_SANITIZE_STRING);

  $date = $_POST['date'];

  $date = filter_var($date, FILTER_SANITIZE_STRING);

  $price = $_POST['price'];

  $price = filter_var($price, FILTER_SANITIZE_STRING);

  $number = $_POST['number'];

  $number = filter_var($number, FILTER_SANITIZE_STRING);

  $place = $_POST['place'];

  $place = filter_var($place, FILTER_SANITIZE_STRING);

  $category = $_POST['category'];

  $category = filter_var($category, FILTER_SANITIZE_STRING);

  $details = $_POST['details'];

  $details = filter_var($details, FILTER_SANITIZE_STRING);

  $image = $_FILES['image']['name'];

  $image = filter_var($image, FILTER_SANITIZE_STRING);

  $image_size = $_FILES['image']['size'];

  $image_tmp_name = $_FILES['image']['tmp_name'];

  $image_folder = 'uploaded_img/'.$image;

  $image_type=$_FILES['image']['type'];

  $select_products = $conn->prepare("SELECT * FROM `car` WHERE name = ?");

  $select_products->execute([$name]);

  if(! in_array($image_type,array('image/png','image/gif','image/jpg','image/jpeg'))){

   $errors[] = $message['center'] = 'قم بتحميل صورة صالحة بالضغط على المربع الاصفر';

  }else{

   $insert_products = $conn->prepare("INSERT INTO `car`(name, category, details, price, image, number, place,type,city,date) VALUES(?,?,?,?,?,?,?,?,?,?)");

   $insert_products->execute([$name, $category, $details, $price, $image, $number, $place,$image_type,$city,$date ]);

   if($insert_products){

     if($image_size > 2000000){

      $message[] = 'حجم الصورة جدا كبير';

     }else{

      move_uploaded_file($image_tmp_name, $image_folder);

      $message[] = 'تم نشر الإعلان';

     }

   }

  }

};

?>

بالطبع، يجب عليك أن تقوم بحذف الملف الخاص بالصورة بشكل منفصل بعد حذف السجل من قاعدة البيانات، يمكنك تحقيق ذلك بإضافة كود لحذف الملف بناء على اسم الصورة، هذا مثال لتعديل الكود:

if(isset($_GET['delete'])){
  $delete_id = $_GET['delete'];

  // استعلام لاسترجاع اسم الصورة
  $get_image_name = $conn->prepare("SELECT image_column_name FROM `moto` WHERE id = ?");
  $get_image_name->execute([$delete_id]);
  $image_row = $get_image_name->fetch(PDO::FETCH_ASSOC);
  $image_name = $image_row['image_column_name'];

  // حذف السجل من قاعدة البيانات
  $delete_message = $conn->prepare("DELETE FROM `moto` WHERE id = ?");
  $delete_message->execute([$delete_id]);

  // حذف الملف من مجلد الرفع إذا كان موجوداً
  $upload_path = 'uploade_img/';
  $full_image_path = $upload_path . $image_name;
  if(file_exists($full_image_path)) {
    unlink($full_image_path);
  }

  header('location:witmoto.php');
}

لكن يرجى استبدال `image_column_name` بالاسم الصحيح لعمود الصور في قاعدة البيانات، وكذلك التأكد من أن الكود متوافق مع نوع قاعدة البيانات التي تستخدمها (PDO أو غيرها).

اخ ياسر للاسف لم يتوافق الكود