Et bonsoir amis du soir !

J'ai un petit soucis pour supprimer plusieurs images d'un coup qui serait liées à un article. Je tente en fait de récupérer les images associées à un article dans un tableau et de les supprimer à la chaine dans un foreach, mais sans succès. Mon code me retournant cette erreur :

Warning: unlink(/galerie/img/works/1.jpg): No such file or directory in /customers/9/2/e/alexandre-ribes.fr/httpd.www/galerie/admin/work.php on line 23 Warning: unlink(/galerie/img/works/2.jpg): No such file or directory in /customers/9/2/e/alexandre-ribes.fr/httpd.www/galerie/admin/work.php on line 23 Warning: Cannot modify header information - headers already sent by (output started at /customers/9/2/e/alexandre-ribes.fr/httpd.www/galerie/admin/work.php:23) in /customers/9/2/e/alexandre-ribes.fr/httpd.www/galerie/admin/work.php on line 38

Et voici le code en question :

$id = $db->quote($_GET'delete']);
    // Avant de supprimer le produit, on supprime aussi les images associées
    $images = $db->query("SELECT img_id, img_name FROM " . PREFIX . "images WHERE img_work_id=$id")->fetchAll();
    foreach($images as $k => $image)
    {
        //  On la supprime du dossier img/works/
        unlink(WEBROOT . 'img/works/' . $image'img_name']);
        $img_id = $db->quote($image'img_id']);
        $db->query("DELETE FROM " . PREFIX . "images WHERE img_id=$img_id");
    }
    //  On met à jour le nombre d'items dans la catégorie
    $item = $db->query("SELECT i_cat_id FROM " . PREFIX . "items WHERE i_id=$id")->fetch();
    $cat_id = $db->quote($item'i_cat_id']);
    $db->query("UPDATE " . PREFIX . "cats SET c_count = c_count - 1 WHERE c_id=$cat_id");

    //  Enfin on supprime le produit
    $db->query("DELETE FROM " . PREFIX . "items WHERE i_id=$id");

Si quelqu'un a une idée ou bien saurait m'expliquer ce qui ne fonctionne et pourquoi (ou ce que je fais mal aussi), je suis preneur :)

Merci bien :)

5 réponses


essaie cette fonction, et dis nous ce que ça te retourne:

UPDATE: 04:20

/**
* Test un unlink() sur un fichier, et affiche des informations de debug
* si des events sont rencontrés
* @param string $file
* @return bool
**/
function jaimeLesCourgettes($file){
    $realpath = realpath($file);
    switch($file){
        case !file_exists($file):
            yaQuoiDansCeDossier(dirname($file));
            var_dump(
                'Path to file : '.$file,
                'Realpath : '.$realpath
            );
            return false;
            break;
        default:
            var_dump( 'You can unlink($file) !' );
            // unlink($file);
            // or you can try
            // unlink($realpath);
            return true;
            break;
    }
}
/**
* Affiche les fichiers contenue dans un dossiers
* @param string $path chemion vers le dossier
* @return bool
**/
function yaQuoiDansCeDossier($path){
    if(!file_exists($path) || file_exists($path) && !opendir($path)){
        yaQuoiDansCeDossier(dirname($path));
        return true;
    }
    $folderOpen = opendir($path);
    $listFiles = ];
    while($entry = readdir($folderOpen)){
        if(in_array($entry, '.', '..'])) continue;
        $path = preg_replace("/\\\|\//", DIRECTORY_SEPARATOR, $path);
        $pathEntry = $path.DIRECTORY_SEPARATOR.$entry;
        $listFiles] = $pathEntry;
    }
    echo '<h1>Files contents from '.$path.'</h1>';
    var_dump( $pathEntry );
    echo '-----------------';
    return true;
}

tu l'appel AVANT la ligne 9 (selon ton past)

jaimeLesCourgettes(WEBROOT . 'img/works/' . $image'img_name']);

Je vais tester ça te je remercie :)

WEBROOT ne te renvoie pas le bon chemin essaie en le remplaçant :

$galeriePath = "/customers/9/2/e/alexandre-ribes.fr/httpd.www/galerie/";
foreach($images as $k => $image)
{
    // On la supprime du dossier img/works/
    $imageFilename = $galeriePath . 'img/works/' . $image'img_name'];
    if (file_exists($imageFilename) {
        unlink($imageFilename);
    } else {
        echo "Impossible de supprimer $imageFilname, le fichier n'existe pas";
    }

    $img_id = $db->quote($image'img_id']);
    $db->query("DELETE FROM " . PREFIX . "images WHERE img_id=$img_id");
}

Mieux, selon l'emplacement du controleur frontal de ton application, tu peux utiliser $_SERVER'DOCUMENT_ROOT'] (qui va te retourner le chemin absolu du répertoire où se trouve ton fichier php) et ajouter un chemin relatif à ce chemin. Par exemple si tu exécute un fichier PHP situé dans /var/www/mon_projet/web/app.php et que tu veux accéder à une image se trouvant dans /var/www/mon_projet/galerie/img/poulet.jpg tu peux faire :

// On utilise ../ pour descendre d'un dossier
$filename = $_SERVER'DOCUMENT_ROOT'] . '/../galerie/img/poulet.jpg';
unlink($filename);

Pourtant le chemin est bon, c'est ça que je ne comprends pas vraiment :/

Donc, selon le code montrer post 1, ajoute avant la ligne 9 ceci:

var_dump( substr(sprintf('%o', fileperms(WEBROOT . 'img/works/' . $image'img_name'])), -4) ); die( __FILE__.':'. __LINE__ ); //

ça va t'afficher les droits du fichier