Удалить файл перед удалением данных строки? - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу удалить файл из папки загрузки перед удалением данных строки из базы данных. Я использовал приведенный ниже код, но он дает ошибку. Ошибка => Нет такого файла или каталога

function deleteItem($conn,$product_id)
{
    $stmtgetfile=$conn->prepare("SELECT * FROM tbl_item WHERE product_id=:product_id");
    $stmtgetfile->bindParam('product_id',$product_id);
    $stmtgetfile->execute();
    $row = $stmtgetfile->fetch(PDO::FETCH_ASSOC);
    $item=$row['product_photo'];
    $path="../uploads/".$item;
    unlink($path);
    // $stmtdelete=$conn->prepare("DELETE FROM tbl_item WHERE product_id=:product_id");
    // $stmtdelete->bindParam('product_id',$product_id);
    // if($stmtdelete->execute())
    //     return true;
    // return false;
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

USE $_SERVER['DOCUMENT_ROOT'] для получения абсолютного пути к корневому каталогу.

$path=$_SERVER['DOCUMENT_ROOT']."/uploads/".$item;
if(file_exists($path)){
   unlink($path);
}else{
   echo $path; // check path here
}
0 голосов
/ 07 ноября 2018

Вам нужно будет исправить значение $path, чтобы получить фактический путь. Вы можете использовать __DIR__ константу для того же самого. А также используйте функцию file_exists(), чтобы проверить, существует ли файл на самом деле или нет, прежде чем пытаться удалить его. Кажется, что некоторые пути к файлам в вашей базе данных в настоящее время не существуют.

$path = __DIR__ . "/../uploads/" . $item;
if (file_exists($path)) {
    unlink($path);
}

Кроме того, если вам просто нужно значение столбца product_photo, не используйте Select *. Измените оператор подготовки запроса на:

$stmtgetfile=$conn->prepare("SELECT product_photo FROM tbl_item 
                             WHERE product_id=:product_id");

Прочитайте: Почему SELECT * считается вредным?

...