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

PHP & Base de données Discussion :

Plusieurs enregistrement à supprimer depuis un checkbox [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut Plusieurs enregistrement à supprimer depuis un checkbox
    Bonjour à tous,

    Je ne dois pas être bien réveillé vu que le problème me semble simple, toutefois je n'arrive point à le résoudre, d'où ce post empli d'un style que vous apprécierez sans nul doute.

    Le problème est le suivant :
    Dans l'admin du site il y a un formulaire pour récupérer les nouveaux commentaires.
    Pour supprimer les post indésirables, il y a un checkbox.
    Si on coche le checkbox correspondant à un post, ou si, pris d'une crise de suppression, il nous vient à l'idée d'en éliminer plusieurs, alors en validant le formulaire, d'un clic nonchalant, la page de réception du formulaire supprime sans discuter le ou les commentaires sélectionnés.

    Cela est en fait la théorie.
    Car dans la pratique, le script semble relativement flegmatique puisque se refusant à effectuer ce pour quoi il doit pourtant son existence.

    Ainsi donc, amis développeurs, je vous prie d'admirer ci-dessous le script dont votre aimable narrateur est l'auteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <form action="commentaire-validation.php" method="post">
     
    echo"contenu1" ; //j'affiche le contenu pour lire tout de même le post
    <input type="checkbox" name="supprimer" value="$R[id]>
     
     
    echo"contenu2" ; //j'affiche le contenu pour lire tout de même le post
     <input type="checkbox" name="supprimer" value="$R[id]">
     
     
    <input type="submit" name="envoyer" value="Envoyer">
     
    </form>
    Vous l'aurez compris, j'ai supprimé tout ce qui est requête sql et autres affichages php, l'important est de savoir qu'une même requête sql affiche plusieurs commentaires au sein d'un même formulaire,
    le but étant de supprimer plusieurs commentaires d'un coup et de valider les autres.

    Afin d'effectuer cela, j'utilise sur la page de réception du formulaire, ce modeste script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
    if (isset($supprimer))
    {
    $supprimer="DELETE  FROM `commentaire` WHERE id='".$id."' ";
    mysql_query($supprimer);
    ;}
     
    ?>

    L'erreur flagrante vous aura certainement éblouie, mais en ce qui me concerne je suis dans une obscurité relativement irritante quant aux causes de l'échec de ce script.


    Auriez-vous l'amabilité de m'éclairer de votre savoir-faire ?

  2. #2
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    salut,
    met un name avec des [] name="supprimer[]"

    tu recevras un tableau d'id sur lequel tu peux faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ids = implode(",",$_POST["supprimer"]);
    suivi de la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM latable WHERE id IN ($ids);

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 234
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 234
    Points : 8 497
    Points
    8 497
    Billets dans le blog
    17
    Par défaut
    Vous l'aurez compris, j'ai supprimer tout ce qui est requête sql et autres affichages php
    Cool, mais il faudrait tout de même que ton script reste *cohérent*
    Que penser de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="supprimer" value="$R[id]>
    ?

    Bon si tes checkboxes sont de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="checkbox" name="fruits[]" value="1"> Pomme
    <input type="checkbox" name="fruits[]" value="2"> Fraise
    La requête sera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ids = implode(', ', $_POST['fruits']) ;
    $sql = "DELETE FROM fruits WHERE fruit_name IN($ids)" ;

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    en clair et en français
    Tu souhaites supprimer plusieurs enregistrements en utilisant une seule et unique validation.

    Effectivement pour le moment sa ne peut pas fonctionner car tu ne renvoies qu'une valeur et non pas un tableau de valeur.

    Pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    echo"contenu1" ; //j'affiche le contenu pour lire tout de même le post 
    <input type="checkbox" name="supprimer[]" value="$R[id]> 
    echo"contenu2" ; //j'affiche le contenu pour lire tout de même le post 
     <input type="checkbox" name="supprimer[]" value="$R[id]">
    Et dans le PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php 
    if (isset($supprimer)) 
    { 
    for($i=0,$n=count($_POST["supprimer"];$i<$n;$i++){
    $supprimer="DELETE  FROM `commentaire` WHERE id='".intval($_POST["supprimer"][$i])."' "; 
    mysql_query($supprimer); 
    }
    ;} 
     
    ?>
    Manque de bol siddh est deja passé par la :o Et même Séb

    bye

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Oyez oyez gents développeurs,

    Nonobstant la promptitude et l'élégance des réponses de nos amis Séb et Siddh, nous noterez la pertinence du script de Monseigneur ePoX, qui peut se targuer d'une réponse fonctionnant dès la première fois (à l'exception notable d'une parenthèse s'étant faite la belle, mais que votre aimable serviteur à rattrapé sans flegme afin de l'enchaîner à son poste).


    Reste à comprendre les rouages de ce script encore obscurs à cet instant et pour ce faire, je m'en vais feuilleter quelques savants ouvrages sur les tableaux.

    Bien entendu, s'il vous plaît de commenter le script nominé, bien vous en prenne de ne point vous en priver !


    je reviens de suite avec quelques questions.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ma foi la logique du script est étincelante, toutefois deux éléments spécifiques me posent questions :

    1) Dans le checkbox du formulaire, nous plaçons donc : name="fruits[]".
    Je suis simplement étonné que l'on puisse ainsi créer un tableau dans un formulaire HTML.
    Auriez-vous quelques explications sur le sujet?

    2) Concernant cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE  FROM `commentaire` WHERE id='".intval($_POST["supprimer"][$i])."' ";
    Quel est le rôle de ce " .intval ", salvateur au demeurant ?

  7. #7
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    les [] te permettent de récupérer un tableau de valeurs dans $_POST["fruits"] au lieu de ne recevoir qu une seule valeur.

    le intvale permet de "convertir" une chaine en entier.
    AMHA ce n'est pas necessaire ici car tu construit une chaine et le type de donnée de ta variable ne sera pas testé.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Merci Siddh

    les [] te permettent de récupérer un tableau de valeurs dans $_POST["fruits"] au lieu de ne recevoir qu une seule valeur.
    Oui j'ai compris le rôle des [], j'ignorais juste que l'on pouvait en disposer dans des formulaires html.
    Auriez vous des exemples d'utilisation de cette fonction, pour que j'en perçoive mieux les multiples objectifs ?


    le intvale permet de "convertir" une chaine en entier.
    Un exemple ?

    AMHA
    AMHA ?

    ce n'est pas necessaire ici car tu construit une chaine et le type de donnée de ta variable ne sera pas testé
    Donc je peux inscrire dans la requête id='".($_POST["supprimer"][$i])."' ?

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    en fait les [] servent quand tu as des checkbox liées ou un select multiple ou des que tu veux mettre le meme name a des elements de formulaires et récupérer les différentes valeurs.

    AMHA => A Mon Humble Avis

    Pour ce qui est de la conversion de type, php est un langage peu ou pas typé, dans certains cas, par exemple pour des operations mathematiques, il faut changer le type de données de String en int pour que ca marche.

    Donc oui tu peux mettre ce que tu as dis, mais sans les ()

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ok, je vais réapprofondir ces explications après résolu ce nouveau problème.

    Comme je l'expliquais au début, il s'agit de supprimer en une fois les commentaires cochés.
    Cela fonctionne.
    Mais il s'agit aussi de valider les autres, ceux qui n'ont pas été cochés.
    Pour ce faire la solution consiste à updater le champ "vue" de ces commentaires, en passant leur valeur de 0 à 1 une fois le formulaire validé.

    A cette fin, j'ai adopté le script suivant sur la page de validation du formulaire (sachant que je n'ai pas touché au formulaire lui-même, dont le script est dans le premier post) :

    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
    20
    21
    <?php 
    //on récupère chaque checkbox dans un tableau
    if ($supprimer==TRUE) 
    { 
    for($i=0,$n=count($_POST["supprimer"]);$i<$n;$i++){ 
    $supprimer="DELETE  FROM `commentaire` WHERE id='".intval($_POST["supprimer"][$i])."' "; 
    mysql_query($supprimer); 
    } ;
    ;};
     
     
    // ici on valide les commentaires non cochés pour être supprimés
    if ($supprimer==FALSE) 
    { 
    for($i=0,$n=count($_POST["supprimer"]);$i<$n;$i++){ 
    $supprimer="UPDATE  `commentaire` SET vue='1' WHERE id='".intval($_POST["supprimer"][$i])."' "; 
    mysql_query($supprimer); 
    } ;
    ;}
     
    ?>
    Donc la première partie concerne la suppression des messages cochés et elle fonctionne.
    La deuxième partie devrait permettre d'updater le champe vue, mais ne fonctionne pas.

    Qu'ai-je raté ?

  11. #11
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    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
    <?php
    // on valide tout, on supprimera les autres apres 
    $valider="UPDATE  `commentaire` SET vue='1'";
    mysql_query($valider);
     
    // on teste si y a des checks de cochées
    if (isset($_POST["supprimer"]))
    {
    // on créé une liste des id ce qui va consommer moins que ta boucle je pense
    $ids = implode(",",$_POST["supprimer"]);
    $supprimer="DELETE  FROM `commentaire` WHERE id IN ($ids)";
    mysql_query($supprimer);
    } 
    ?>

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Excellent Siddh cela fonctionne du premier coup, j'ai stocké ces deux solutions dans ma boite à script.


    L'idée d'updater au préalable le champ 'vue' est bonne, toutefois j'aimerais bien comprendre pourquoi l'exemple que j'avais placé avant ton post, ne fonctionne pas.

  13. #13
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    alors deja faudrais savoir ce qu est ta variable $supprimer, dans tout les cas, en testant un coup true un coup false, tu ne pouvais que supprimer ou que mettre a jour !

    De plus tu utilisais les memes id ...

    Penses au si c'est ok

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Donc mon instinct de développeur débutant ne m'a pas trompé, j'ai bien quelque chose à apprendre.

    Donc je creuse :
    A priori ma variable checkbox s'appelle "supprimer", elle peut être soit TRUE soit FALSE.

    Qu'est ce qui m'empêche de définir un rôle distinct selon qu'elle est TRUE OU FALSE ?
    De même pour les id puisque de toutes façons ces deux requêtes sont placés dans des conditions IF et sont traitées distinctement ==> une action si 'supprimer' est FALSE , une autre si elle est 'TRUE'.

    Là, Siddh, tu me dis que si elle est TRUE elle ne peut plus être FALSE. Mais je ne lui attribue pas de valeur, je la constate et indique une action pour chaque cas.

    Bon



    Ne criez pas, je sais que j'ai tort, sinon ça aurait fonctionné.

  15. #15
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    le fonctionnement des check est le suivant :
    si elle est cochée, on reçoit ce qu'il y a dans son value, sinon on ne reçoit rien

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ahh

    Donc le problème était qu'il n'y avait en fait pas d'id de retournés ?

  17. #17
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    exactement, tu ne reçoit que les id de ceux que tu veux supprimer

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ok,

    Grand merci à tous, j'aurai plaisir à transmettre ces nouvelles connaissances à qui en aura besoin à son tour



    Je marque résolu et vais manger un quignon de pain.

  19. #19
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    le intvale permet de "convertir" une chaine en entier.
    AMHA ce n'est pas necessaire ici car tu construit une chaine et le type de donnée de ta variable ne sera pas testé.
    Effectivement le but n'est pas de respecter un typage dans la requete ou autre puisque php comme mysql sont très libertains à ce niveau. C'est juste pour ne pas avoir de mauvaise suprpise le jour ou un type X , Y s'amuse à lui balancer un " ' OR 1=1 ' dans son champs supprimer...

    Je vous laisse imaginer la suite, une mise en commentaire, puis un drop table ou je ne sais quoi et c'est bon ta journée est bien pourrie.

    Au moins avec le intval, tu t'assures, en faisant très simple, que tu n'auras jamais de mauvaise surpise.

    bon ceci dit, cela ne remplace une fonction de protection des insert pour tout ce qui est des champs textes.

    Thats all,

    bye

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ah non finalement il y a un problème :

    En testant avec plusieurs enregistrement et non un seul, j'obtiens le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning:  implode(): Bad arguments. in /home/site/www/Arkan7/commentaire-validation.php
    Donc j'ai par exemple 4 commentaires et veux en supprimer un.

    Et bien le commentaire censé être supprimé ne l'est pas, tandis que les autres sont bien updatés.

    **edit** je vais me repencher sur le intval mais je voudrais bien résoudre le problème du warning ci-dessus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2010, 13h24
  2. comment supprimer plusieurs enregistrements
    Par NABIL74 dans le forum Bases de données
    Réponses: 20
    Dernier message: 19/01/2009, 13h58
  3. Supprimer plusieurs enregistrements sélectionnés dans un dbGrid
    Par kroma23 dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/09/2008, 14h10
  4. Réponses: 12
    Dernier message: 18/10/2007, 10h34
  5. Réponses: 6
    Dernier message: 19/09/2006, 18h55

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