Probleme supresssion de sa propre annonce

Eléphant du PHP | 58 Messages

22 déc. 2011, 11:26

Bonjour :wink:

j'ai une annonce avec photos j'ai crée un icône supprimer, lorsque le client clique sur celui ci je demande à la personne si désire bien supprimer son annonce "OUI ou NON"

Si clique sur OUI l'annonce et bien supprimer de la base de donnée ainsi la photo miniature et la photo normale qui se trouvaient dans un répertoire! CA FONCTIONNE PARFAITEMENT

MAIS

Si la personne lors de la création de son annonce n'a pas ajouter de photo donc son annonce sera sans photo et si il désire la supprimer j'aurai bien mon message de confirmation et si je met OUI mon annonce et bien supprimer mais avec ces erreurs:

Warning: unlink(../image/avatars/) [function.unlink]: Permission denied in C:\wamp\www\......
Warning: unlink(../image/avatars/min/) [function.unlink]: Permission denied in C:\wamp\www\.......

Logique car on demande à la fonction d'effacer des photo qui n'existe pas donc comment faire pour que il ny est pas ce genre de message d'erreur?

ma page supprimer-annonce.php
<?php

require('../include/connexionpdo.inc.php');

                                         //Pas encore certain de supprimer
    if (!empty($_GET['id_annonce']))
    {
	?>
    Etes-vous certain de vouloir supprimer cette annonce ?&nbsp;&nbsp;
	<a class="accueil" href="supprimer-annonce.php?id=<?php echo htmlspecialchars($_GET['id_annonce'], ENT_QUOTES, 'UTF-8');?>">
    Oui</a> - <a class="accueil" href="page_membre.php">Non</a>
	<?php
    }

                                          //certain de supprimer
if(!empty($_GET['id']))
{   


$query=$db->prepare('SELECT avatar
                     FROM annonce 
                     WHERE id_annonce = :id');
                  $query->bindValue(':id',$_GET['id'],PDO::PARAM_INT);							  			
                  $query->execute();
		 $donnees=$query->fetch();

		   $photo = $donnees['avatar'];
		
		$filename = '../image/avatars/'.$photo.''; 
        unlink($filename);
		$filename = '../image/avatars/min/'.$photo.''; 
        unlink($filename);



	
   $query=$db->prepare('DELETE 
                        FROM annonce 
			WHERE id_annonce = :id');
        $query->bindValue(':id',$_GET['id'],PDO::PARAM_INT);
        $query->execute();
        $query->CloseCursor(); 
			
		
        echo'L\'annonce a bien été supprimé.Revenir sur votre <a class="accueil" href="page_membre.php">espace membre.</a>';
       
}

?>
Le lien pour supprimer l'annonce (icône croix)

<div><a title="supprimer annonce" href="../user/supprimer-annonce.php?id_annonce=<?php echo $donnees['id_annonce'];?>"><img src="../image/supprimer-icone.png" alt="supprimer annonce" title="supprimer annonce" /></a></div>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 déc. 2011, 11:34

salut,

soit tu vérifie le contenu des champs de ta base de données (je suppose qu'il sont vide quand il n'y a pas d'image) soit tu test l'existence du fichier pour conditionner la suppression.

le mieux étant bien entendu de faire les deux. Ceci simplement parce que tu ne peux pas être certain que le fichier soit présent sur disque même si la base de le dit (pas de corrélation entre les deux).

donc
<?php
if ( !empty($donnees['avatar'])) {
                 $filename = '../image/avatars/'.$donnees['avatar'];
if (file_exists($filename))
         unlink($filename);
                 $filename = '../image/avatars/min/'.$donnees['avatar']
if (file_exists($filename))
         unlink($filename);
?>

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 58 Messages

22 déc. 2011, 12:06

Merci beaucoup c'est bon ça fonctionne !!!!! :wink:

ps: dommage que sur ce forum il manque une indication que notre sujet est résolu :D

Eléphanteau du PHP | 49 Messages

22 déc. 2011, 20:49

Fais bien attention avec la fonction unlink() , ça peut faire des ravages sur un serveur si le script est buggé ou mal sécurisé
Comme dit moogli, en plus de vérifier si $filename est rempli, tu devrais vérifier avec une expression régulière que ton fichier est bien une image.
Souvent, je ne supprimais pas en 1 fois le images, je les déplaçais dans un répertoire temporaire (non accessible par l'internaute), et les supprimais qqes temps après.

C'est dommage de supprimer tes annonces (et tes images) pour ton référencement naturel, non?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 déc. 2011, 20:55

Supprimer une annonce périmé est normale, référencer une annonce qui n'a plus court est une bonne idée pou faire fuir le gens. De plus la personne qui la dépose ayant droit d'accès à ces infos la suppression doit être autorisée. ;)

Il n'y a pas de soucis de sécurité si le nom de fichier et gérer sur le serveur le "client" n'ayant pas accès a la partie qui supprime (l'info provenant de la base si elle est correctement entrée y a pas de problème)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 49 Messages

22 déc. 2011, 22:14

Tu as raison pour les vieilles annonces, je suis trop dans une logique e-commerce là.

Pour l'aspect sécurité, si tu as une faille à l'upload ça peut être la fête du slip dans le dossier et ses sous dossiers.

Eléphant du PHP | 58 Messages

22 déc. 2011, 22:30

:wink: Oui le client a le droit de supprimer son annonce. Imagine grâce à son annonce il a réussi à vendre son produit, il ne va pas la laisser en ligne du coup il peut la supprimer :wink:

Pour la sécurité lors de l'upload j'utilise ce script :
if(!empty($_FILES['img']['size']))
    {
	require('../include/functions.inc.php');
  
        //On définit les variables :
        $maxsize = 2097152; //Poid de l'image        
        $extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png' ); //Liste des extensions valides
        
        if ($_FILES['img']['error'] > 0)
        {
		        $erreurCritique++;
                $aErrors['photo'] = "Erreur lors du transfert de la photo : ";
				
        }
        if ($_FILES['img']['size'] > $maxsize)
        {
                $erreurCritique++;
                $aErrors['photo'] = "Le fichier est trop gros : (<strong>".$_FILES['img']['size']." Octets</strong>    contre <strong>".$maxsize." Octets</strong>)";
        }

        
        $extension_upload = strtolower(substr(  strrchr($_FILES['img']['name'], '.')  ,1));
        if (!in_array($extension_upload,$extensions_valides) )
        {
                $erreurCritique++;
                $aErrors['photo'] = "Extension de la photo incorrecte";
        }
	
$nomavatar=(!empty($_FILES['img']['size']))?move_img($_FILES['img']):''; 	 
    }


et le script de la fonction
<?php
function move_img($img)
{
require("../include/imgClass.php");
    $extension_upload = strtolower(substr(  strrchr($img['name'], '.')  ,1));
    $name = time();
    $nomavatar = str_replace(' ','',$name).".".$extension_upload;
    $ok = "../image/avatars/".str_replace(' ','',$name).".".$extension_upload;
    move_uploaded_file($img['tmp_name'],$ok);
    return $nomavatar;
}
?>


Eléphanteau du PHP | 49 Messages

23 déc. 2011, 00:09

Tu as essayé d'uploader un fichier php que tu renommes en xx.php.jpg , pas exemple?

Eléphant du PHP | 58 Messages

23 déc. 2011, 15:06

oui j'ai fais le test avec un fichier .php en rajoutant l'extension .jpg comme ceci xx.php.jpg j'ai une erreur de redimensionnement mais l'annonce se crée quand même et dans mon dossier ou se trouve les photos uploadé j'ai le fichier avec l'extension .jpg nommé avec la fonction time() "1324645354.jpg"

Eléphanteau du PHP | 49 Messages

23 déc. 2011, 16:55

Salut,
Une méthode pour vérifier que le fichier uploadé est bien une images est d'utiliser la fonction getimagesize()

http://fr.php.net/manual/fr/function.getimagesize.php
Si l'accès à filename est impossible ou bien si filename n'est pas une image valide, getimagesize() générera une erreur de niveau E_WARNING. Si une erreur survient lors de la lecture, getimagesize() générera une erreur de niveau E_NOTICE.