IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

suppression d'un avatar [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut suppression d'un avatar
    bonjour à tous, sur le site que je suis entrain de développer en projet pour mon iut, j'ai donné la possibilité aux utilisateurs de mettre un avatar.
    l'upload et le référencement de celui-ci dans la base de donnée fonctionne parfaitement. J'ai fait une requete qui supprime l'url de l'avatar dans la base de donnée en cas de suppression de l'utilisateur. jusqu'ici tout fonctionne mais si je laisse comme ça, mon serveur va se retrouver blinder d'avatar obsolete. j'ai donc essayé de supprimer les fichiers avec la fonction unlink() mais apparement je n'ai pas les droits. je travaille sous windows en local avec wamp et voilà le bout de code que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $quer=mysql_query("select id_avatar from internaute where id_internaute='".$element[$i]['id_internaute']."';");
    $query=mysql_fetch_array($quer);
    $quer2=mysql_query("select url from avatar where id_avatar='".$query['id_avatar']."';");
    $query2=mysql_fetch_array($quer2);
    chmod('http://localhost/boby/image/avatar',0777); 
    unlink($query2['url']);
    l'url récupérée dans $query2['url'] est bonne je pense puisque je l'utilise pour afficher l'avatar dans plusieurs pages de mon site. ( dans url, il y a aussi le fichier . jpeg mais j'ai essayé en le retirant sans aucun changements ... )
    si quelqu'un a une idée pour ce problème de droits, j'ai deja essayé tout ce que je savais :S

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Déjà tu peux faire une seule requête avec jointure.
    Ensuite chmod() sur du windows, ce n'est pas vraiment bien.
    unlink() fonctionne avec des chemins complets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $quer=mysql_query("select url from internaute 
    JOIN avatar USING (id_avatar)
    WHERE id_internaute=".$element[$i]['id_internaute']);
    unlink($_SERVER['DOCUMENT_ROOT'] . mysql_result($quer,0));
    Je suppose par contre que ton champ "url" contient seulement le nom du fichier et non une url.

    En prime, c'est toujours une bonne chose de nettoyer une chaine qu'on utilise avec unlink de tout caractère suspect comme \.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    pour mon champs url, non c'est réellement une url du style : http://localhost/boby/image/avatar/11.jpg
    je vais regarder ce que tu m'as donné, j'imagine que $_SERVEUR['DOCUMENT_ROOT'] est sensé contenir le chemin complet non ?
    en tout cas en testant ce que tu m'as donné j'ai toujours la meme erreur :

    <b>Warning</b>: unlink(localhost/boby/image/avatar/73.jpg) [<a href='function.unlink'>function.unlink</a>]: No such file or directory in <b>C:\wamp\www\boby\script_modification.php</b> on line <b>52

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est une erreur de stocker ton url complète :
    - tu repetes la meme information sur toute les lignes
    - tu ne peux plus désigner le fichier sur le disque

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    d'accord, je changerai ça. mais meme si je change ça ton code ne suffit pas si ? parce quand je le met pr le moment ça me met l'erreur que j'ai écrite au dessus. ( désolé si je ne suis pas très rapide, je ne suis pas tres doué en php vu qu'on viens de le commencer en cours )
    EDIT : le tableau $_SERVER['DOCUMENT_ROOT'] est créé automatiquement lors de l'upload du fichier ou il faut que je le remplisse moi même avec l'adresse complète du dossier où sont stoquées les images ?

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca ne peut pas fonctionner puisque ta reference de fichier est mauvaise.

    Il y aura par contre peut etre besoin d'ajouter un "/" ; selon les systemes DOCUMENT_ROOT contient ou non le / final.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unlink($_SERVER['DOCUMENT_ROOT'] . "/" . mysql_result($quer,0));

  7. #7
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par Kuchiki Byakuya Voir le message
    J'ai fait une requete qui supprime l'url de l'avatar dans la base de donnée en cas de suppression de l'utilisateur
    Le mieux à faire dans ce cas là (le plus optimisé et la méthode permettant à 100% de ne pas garder des bribes d'informations dans ta base) est de construire ta base avec le moteur MySQL InnoDB te permettant automatiquement de supprimer toutes les informations de l'utilisateur de tes tables adjacentes via les foreigns keys et les instructions ON DELETE CASCADE notamment

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Le mieux à faire dans ce cas là (le plus optimisé et la méthode permettant à 100% de ne pas garder des bribes d'informations dans ta base) est de construire ta base avec le moteur MySQL InnoDB te permettant automatiquement de supprimer toutes les informations de l'utilisateur de tes tables adjacentes via les foreigns keys et les instructions ON DELETE CASCADE notamment
    c'est ce que je voulais faire au début mais les profs nous ont demandé d'essayer de faire autrement :S

    @sabotage : je vais essayer ça demain matin, pour information, j'upload en utilisant la fonction copie, est ce approprié à ta méthode ou pas ?
    EDIT : finalement j'ai testé ce soir. dans url j'ai 75.jpg ce qui est le nom du fichier à supprimer. j'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $quer=mysql_query("select url from internaute JOIN avatar USING (id_avatar) WHERE id_internaute=".$element[$i]['id_internaute']);
    unlink($_SERVER['DOCUMENT_ROOT'] ."/". mysql_result($quer,0));
    mais ça ne marche pas et si je veux afficher la variable serveur, il me dit qu'elle n'est pas definie.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    j'upload en utilisant la fonction copie
    On utilise plutot move_uploaded_file() qui est faite pour ça.
    Attention sur la notion par contre, que tu utilises copy() ou move_uploaded_file() ces fonctions ne font que déplacer un fichier qui est déjà arrivé dans un repertoire temporaire sur son ton serveur lors de l'envoi du formulaire.

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    if(is_uploaded_file($_FILES['fichier']['tmp_name']))//test si le fichier est réellement uploader sur le dossier temp
    {
    	$nom = $_FILES['fichier']['name'];//met le nom du fichier dans la variable $nom
    	$type = str_replace('.','',strstr($nom, '.'));//met dans $type les caractères du nom qui sont APRES le . afin d'obtenir l'extension du fichier.
    	$login=$_SESSION['login'];
    	$quer=mysql_query("select id_avatar from internaute where login='$login';")or die(mysql_error());//
    	$query=mysql_fetch_array($quer);
    	mysql_query("DELETE FROM avatar where id_avatar='".$query['id_avatar']."';")or die(mysql_error());// suppression de l'ancien avatar
    	mysql_query("INSERT INTO avatar values('','aucun');")or die(mysql_error());// création du tuple pour lui donner un id
    	$requete=mysql_query("select MAX(id_avatar) from avatar;")or die(mysql_error()); // on selectionne le dernier id inséré
    	$req=mysql_fetch_array($requete);
    	$url=SITE.'image/avatar/'.$req['MAX(id_avatar)'].'.'.$type; // création de l'url de l'image pour la mettre dans la base
    	$id_avatar=$req['MAX(id_avatar)'];
    	mysql_query("UPDATE internaute SET id_avatar='$id_avatar' where login='$login';")or die(mysql_error()); // on update la table internaute pour donner au nouvel inscrit son avatar.
    	mysql_query("UPDATE avatar SET url='$url' where id_avatar='$id_avatar';")or die(mysql_error()); //update la table avatar pour mettre l'url
    	if(move_uploaded_file($_FILES['fichier']['tmp_name'], './image/avatar/'.$req['MAX(id_avatar)'].'.'.$type)) //copie l'avatar sur l'espace de stockage, et test si celà a fonctionné.
    	{
                    echo 'avatar modifié';
    }
    voilà comment j'upload mon image, ici $_FILES['fichier']['tmp_name'] est il l'équivalent de ton $_SERVEUR['DOCUMENT_ROOT'] ??
    meme ainsi je n'arrive pas a faire fonctionner ton code car il ne reconnait pas la variable $_SERVEUR
    EDIT :bon apparement ta requete avec jointure il ne l'aime pas beaucoup, car elle ne reçoit aucun résultat, j'ai donc remis mes deux requetes et cela renvoie quelque chose.
    voilà le bout de code que j'ai pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $quer=mysql_query("select id_avatar from internaute where id_internaute='".$element[$i]['id_internaute']."';");
    $query=mysql_fetch_array($quer);
    $quer2=mysql_query("select url from avatar where id_avatar='".$query['id_avatar']."';");
    $query2=mysql_fetch_array($quer2);
    unlink(SITE.'./image/affiche/'.$query2['url']);
    la constante SITE contient : http://localhost/boby/
    ( j'ai remis un chemin au lieu du $_SERVEUR['DOCUMENT_ROOT'] car il me dit que cette variable n'existe pas ).
    mon erreur a changé :
    <b>Warning</b>: unlink() [<a href='function.unlink'>function.unlink</a>]: http does not allow unlinking in <b>C:\wamp\www\boby\script_modification.php</b> on line <b>52</b><br />
    il s'agit donc d'un problème de droits et non d'adresse non ?
    En attente de votre aide

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Désolé pour le double post mais si je continue, ça va juste être illisible
    bon finalement j'ai trouvé la solution à mon problème. Comme je l'ai dit plus haut, la requete avec jointure n'a pas marché donc j'ai refait en deux requetes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $quer=mysql_query("select id_avatar from internaute where id_internaute='".$element[$i]['id_internaute']."';");
    $query=mysql_fetch_array($quer);
    $quer2=mysql_query("select url from avatar where id_avatar='".$query['id_avatar']."';");
    $query2=mysql_fetch_array($quer2);
    unlink("./image/avatar/".$query2['url']);
    j'ai mis une adresse en relatif au lieu d'absolu et ça marche nikel ( merci pour la remarque sur l'inneficacité du http://localhost/boby/image/avatar/ devant le nom du fichier ( dans la basse de donnée )
    merci à tous

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 41
    Points
    41
    Par défaut
    J'aurais plutôt ajoute if(fil_exists()) par sécurité. Sais-on jamais, si tu as une variable vide et que ça supprime tout le rep aii

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $quer=mysql_query("select id_avatar from internaute where id_internaute='".$element[$i]['id_internaute']."';");
    $query=mysql_fetch_array($quer);
    $quer2=mysql_query("select url from avatar where id_avatar='".$query['id_avatar']."';");
    $query2=mysql_fetch_array($quer2);
    if (file_exists("./image/avatar/".$query2['url']) {
    unlink("./image/avatar/".$query2['url'])
    }
    else {
    //ton message d'erreur ou autre
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression de l'avatar d'un user
    Par HeB91 dans le forum SharePoint
    Réponses: 1
    Dernier message: 29/03/2010, 16h33
  2. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 18h56
  3. [CR] suppression du bas de page
    Par grosjej dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 10/09/2002, 09h58
  4. Réponses: 3
    Dernier message: 12/06/2002, 22h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo