حذف الملفات مع AJAX/PHP
-
25-09-2019 - |
سؤال
المشكلة
أريد حذف ملف مع AJAX/PHP
.
لكن PHP يقول أن اسم الملف ما أرسله مع Ajax ليس ملفًا ، ولكن عندما أذهب مباشرة إلى الرابط ، يمكنني حذف الملفات. تحقق من PHP الحالي الخاص بي ، لقد وضعت في عبارة if/else للتحقق مما إذا كانت السلسلة عبارة عن ملف مع: is_file
, ، النتيجه هي false
.
بدون is_file
يقول هذا:
Warning: unlink("image.jpg") [function.unlink]: Invalid argument in C:\wamp\www\images\users\delete.php on line 8
الملف الذي يدعو Ajax هو داخل المجلد حيث تكون الملفات أيضًا ما أريد حذفه.
PHP
<?php
// I save the file sources from the URL what was sent by AJAX to these variables.
$photo_id = $_GET['photo_id'];
$thumbnail_id = $_GET['thumbnail_id'];
function deletePhotos($id){
// If is a file then delete the file.
if(is_file($id)){
return unlink($id);
// Else show error.
} else {
echo $id . " is not a file, or there is a problem with it.<br />" ;
}
}
if(isset($photo_id)){
deletePhotos($photo_id);
}
if(isset($thumbnail_id)){
deletePhotos($thumbnail_id);
}
?>
أياكس
function deletePhoto(photo, thumbnail){
var photos = encodeURIComponent(photo);
var thumbnails = encodeURIComponent(thumbnail);
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("media").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET", "http://192.168.2.104/images/users/delete.php?photo_id=\""+photos+"\"&thumbnail_id=\""+thumbnails+"\"", true);
xmlhttp.send();
}
المحلول
طلب AJAX الخاص بك يحتوي على البيانات في عروض الأسعار.
//Bad
delete.php?photo_id="1234"
//Good
delete.php?photo_id=1234
//So use this:
xmlhttp.open("GET", "http://192.168.2.104/images/users/delete.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true);
نصائح أخرى
تحتاج إلى إعطاء طريق كامل إلى IS_FILE. مسار جزئي مثل Image.jpg لا يخبره أين يوجد هذا الملف. إذا كان من المفترض أن تكون نسبة إلى جذر المستند ، فستحتاج إلى إعداد ذلك.
هذه واحدة من أخطر البرامج النصية التي رأيتها على الإطلاق. يمكنك تمرير أي ملف إلى photo_id ، وطالما أن خادم الويب لديه الأذونات المناسبة ، فإنه سيحذفه. يجب عليك على الأقل التأكد من تقييده على حذف الملفات فقط داخل دليل معين.
قد تحتاج إلى تحديد المسار على سبيل المثال
file_exists( realpath('.') . '/' . $id );
(على افتراض أن ملفاتك موجودة في نفس المجلد مثل البرنامج النصي) ، فقد تم تحديد ما قاله الآخرون ، هذا نص خطير ما لم يكن هناك أمان آخر في مكانه!
حاول استخدام تقليم في رسالتك أو الحصول على متغير ، على سبيل المثال:
$photo_id=trim($_GET['blah..blah']);
في حالتي المشكلة $photo_id
لا يعيد اسم الملف - إنه يعيد شيئًا مثل " nfilename" ، عندما يكون "اسم الملف" لذلك أضفت trim
وعملت لي الآن.