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 :

Delete sur while


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Par défaut Delete sur while
    Bonsoir (ou bonjour) à tous,

    J'ai actuellement un problème de requête DELETE que j'aimerais utiliser sur une boucle WHILE.

    J'ai une section amis dans l'espace membre de mon site ou j'affiche une liste de tout les amis que l'utilisateur a ajouté en tant qu'amis, en faisant une boucle while ou j'affiche un bref résumé de l'amis en question : (pseudo, avatar et la date et l'heure depuis que ces 2 utilisateurs sont amis).
    Dans cet boucle while, j'en profite pour ajouter un formulaire HTML pour avec un simple bouton submit qui a comme valeur " Supprimer de mes ami".
    Ce bouton ce répète donc à chaque fois dans la boucle pour chaque utilisateur qui apparait dans la boucle.

    Dans ma boucle while je recupere 5 variables depuis une table Liste_Amis et je fais une jointure de table vers la table Membres ( qui n'a normalement rien à voir avec mon problème mais je précise quand même. )

    Le code PHP et SQL de ma boucle ressemble donc à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $reqfriends = $bdd->prepare('SELECT * FROM Liste_Amis JOIN Membres ON Liste_Amis.ID_Ami = Membres.ID_Utilisateur WHERE Utilisateur = ?');
                        $reqfriends->execute(array($_SESSION['id']));
                        $friendscount = $reqfriends->rowCount();
                            if($friendscount == 0) { ?> <div class="aucunamis">Vous n'avez actuellement aucun ami !</div> <?php } else { ?>
                                <?php while ($f = $reqfriends->fetch()) { ?>
    et l'html/php de la boucle qui affiche cette liste est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <div class="friend">
                                        <?php $Date = (strftime('%d/%m/%Y ', strtotime($f['DateAjout']))); ?>
                                        <p class="avatar"><img src="membres/avatars/<?= $f['Avatar']; ?>" /></p>
                                        <p class="pseudo"><?php if($f['Admin'] == true ) { ?><a class="admin" href="membre.php?Pseudo=<?= $f['Pseudo']; ?>"><i class="fas fa-fan fa-spin"></i> <?= $f['Pseudo'];?></a><?php } else { ?><a class="membre" href="membre.php?Pseudo=<?= $f['Pseudo']; ?>"><?= $f['Pseudo'];?></a><?php } ?></p>
                                        <p>Vous et <?php if($f['Admin'] == true ) { ?> <span class="admin"><?= $f['Pseudo']?></span><?php } else { ?> <span class="membre"><?= $f['Pseudo']?></span><?php } ?> êtes amis depuis le: <?= $Date; ?> à <?= $f['HeureAjout']; ?></p>
                                        <form method="POST">
                                            <input type="submit" name="Supprimer" value="Supprimer de mes amis"/>
                                        </form>
                                        <?php if(isset($_POST['Supprimer'])) {
                                                $deletefriend = $bdd->prepare('DELETE ID FROM Liste_Amis WHERE Utilisateur = ? && ID_Ami = ?');
                                                $deletefriend->execute(array($_SESSION['id'], $f['ID_Ami']));
                                        } ?>
                                    </div>
    La table SQL "Liste_Amis" ressemble à ça:

    ID / Utilisateur / ID_Ami / DateAjout / HeureAjout/

    L'ID est la clé primaire que j'auto incrémente à chaque nouvel ajout en ami. (int)
    l'Utilisateur est l'ID de l'utilisateur que je récupère automatiquement depuis une table "Membres".(int)
    l'ID_Ami est aussi un ID Utilisateur.(int)
    DateAjout et HeureAjout ne sont là qu'en tant que current-timestamp pour afficher l'heure et la date de l'ajout en ami comme mentionner plus haut.

    Donc mon problème c'est que:
    La requête que j'utilise actuellement ne fonctionne pas et je ne comprend pas du tout pourquoi...
    Le truc c'est que pour "essayer" j'ai déjà ajouter un bouton qui supprime touts les amis de l'utilisateur et celui-ci marche parfaitement. ( fonction qui n'est la que pour tester et qui ne sera pas présent dans la version finale de la page.)
    J'ai déjà tenter plusieurs manipulation de code, d'autres syntaxe, rien y fait. Soit ça ne supprime rien ou alors ça supprime tout !

    J'ai d'ailleurs exactement le même problème sur une autre partie de mon site avec les messages privés ou j'arrive à effacer touts les messages qu'un utilisateur a reçu mais pas à les supprimer un à la fois...

    Je ne sais pas si tout ce que j'ai dit est très compréhensible et si ce n'est pas le cas je m'en excuse très sincérement...
    Mais je serais très heureux si quelqu'un pouvait m'aider à résoudre mon problème !

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    normalement, tu traites les données à supprimer avant de les afficher, non ? Comme ça tu n'as pas à les afficher, toi tu affiches quand même les données supprimées. C'est bancal.
    Une idée de code :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // TRAITEMENT DES DEMANDES DE SUPPRESSION
    if (isset($_POST['Supprimer'], $_POST['id_ami']) && intval($_POST['id_ami'])) {
        $stmt = $bdd->prepare('DELETE FROM Liste_Amis WHERE Utilisateur = ? && ID_Ami = ?');
        $stmt->execute([(int)$_SESSION['id'], (int)$f['ID_Ami']]);
    }
     
    // LISTE DES AMIS
    $smt = $bdd->prepare('SELECT * FROM Liste_Amis JOIN Membres ON Liste_Amis.ID_Ami = Membres.ID_Utilisateur WHERE Utilisateur = ?');
    $stmt->execute([(int)$_SESSION['id']]);
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
     
    // fonction d'échappement des caractères dangereux : C'EST OBLIGATOIRE !!!
    $hsc  = function($p): string { return htmlspecialchars((string)$p, ENT_QUOTES, 'utf-8'); };
     
    if (empty($data)) {
        echo <<<'html'
    <div class="aucunamis">Vous n'avez actuellement aucun ami !</div>
    html;
    } else {
        foreach ($data as $f) {
            $date = new DateTime($f['DateAjout']);
            if ($f['Admin']) {
                $class = 'admin';
                $link = <<<html
    <a class="admin" href="membre.php?Pseudo={$hsc($f['Pseudo'])}"><i class="fas fa-fan fa-spin"></i>{$hsc($f['Pseudo'])}</a>
    html;
            } else {
                $class = 'membre';
                $link = <<<html
    <a class="membre" href="membre.php?Pseudo={$hsc($f['Pseudo'])}">{$hsc($f['Pseudo'])}</a>
    html;
            }
     
            echo <<<html
    <div class="friend">
      <p class="avatar"><img src="membres/avatars/{$hsc($f['Avatar'])}" /></p>
      <p class="pseudo">{$link}</p>
      <p>Vous et <span class="{$class}">{$hsc($f['Pseudo'])}</span> êtes amis depuis le: {$date->format('d/m/Y')} à {$hsc($f['HeureAjout'])}</p>
      <form method="post">
        <input type="hidden" name="id_ami" value="{$hsc($f['ID_Ami'])}">
        <input type="submit" name="Supprimer" value="Supprimer de mes amis"/>
      </form>
    </div>
    html;
        }
    }
    Tu dois beaucoup mieux présenter ton code, ta version est illisible.
    PHP te permet d'écrire du code très lisible avec toutes les notations à disposition : NOWDOC, HEREDEOC, String (passage de variables, etc...)

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Août 2018
    Messages : 40
    Par défaut
    mmm le probleme ne serrais pas au niveau du :
    DELETE ID FROM,

    pourquoi preciser de supprimer uniquement le champ ID qui est semble t'il ta clé primaire , je comprend pas bien.
    un DELETE FROM ne marcherais pas mieux ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Par défaut
    Citation Envoyé par saveus Voir le message
    mmm le probleme ne serrais pas au niveau du :
    DELETE ID FROM
    pourquoi preciser de supprimer uniquement le champ ID qui est semble t'il ta clé primaire , je comprend pas bien.
    un DELETE FROM ne marcherais pas mieux ?
    Le problème c'est que comme précisé dans mon premier post, j'ai déjà tenter plusieurs syntaxe différentes. Et évidemment, la premiere forme de ma requête était : (DELETE FROM Liste_Amis WHERE Utilisateur = ? && ID_Ami = ? ")Le problème c'est que cette requête supprime l'intégralité des amis du membre... Et je ne comprend pas pourquoi.....

    Ah et désolé si ma manière de coder en PHP est carrément bizarre mais c'est mon premier projet en PHP.... Et je n'ai suivi qu'un cours super basique en e-learning...... :/

    Ah et je précise aussi que j'ai mis ma requête de suppression directement dans l'html parce que si je la met au dessus, l'id ami n'est pas une variable qui est connu par php... Vu que je fais ma boucle après.....

    EDIT: J'ai résolu le problème en mettant un input hidden avec en value l'id de l'ami. Et ça fonctionne! Et j'ai également compris comment mettre le traitement de mon bouton delete en haut de ma page dans la section dédié au traitement des données. Merci beaucoup à vous.
    Et encore désolé de ne pas avoir une super syntaxe dans le code de mon post !

  5. #5
    Invité de passage
    Homme Profil pro
    Artist
    Inscrit en
    Avril 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Artist
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2020
    Messages : 1
    Par défaut
    Merci résolu

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

Discussions similaires

  1. Delete sur un filter ds un recordset
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/04/2006, 14h28
  2. delete sur plusieurs tables
    Par drinkmilk dans le forum Oracle
    Réponses: 11
    Dernier message: 22/03/2006, 16h43
  3. [VS2005][C#] Delete sur un Dataset typé
    Par Xno dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/09/2005, 18h13
  4. [Firebird] DELETE sur le résultat d'une requete d'un IBQUERY
    Par shashark dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/06/2005, 18h17
  5. delete sur une vue: rule
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 18/05/2004, 18h58

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