Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL 5.5] Modifier une ligne de ma BDD en PHP

Comment bien programmer ma requête pour incrémenter une donnée

    17 novembre 2017 à 14:02:08

    Bonjour

    Voici mon problème : je dispose d'un table d'éléments qui peuvent être publiés ou dépubliés

    Ces éléments ont un ID appelé "Listing" qui va de 1 à 15. La variable pour publier/dépublié est un booléen appelé "Approval"

    Lorsqu'ils sont dépubliés, leur "Listing" est chiffré de 21 à 35. Il me suffit d'ajouter 20 à la donnée "Listing" pour faire changer mes éléments de ligne dans ma table.

    Je souhaite modifier toutes les lignes de ma table pour faire passer les publiés en dépubliés. 

    J'ai donc écrit une requête SQL qui fonctionne très bien si je l'écris directement dans mon logiciel (HeidiSQL) :

    UPDATE MaTable SET Listing=Listing+20 WHERE (!Approval AND Listing<20);

    Seulement lorsque je tente un programme simple en PHP pour l'éxécuter pas moyen, j'ai beau effectuer une requête préparée, rien ne se passe, aucune ligne n'est affectée. Je dois passer à côté de quelque chose mais même en relisant les cours correspondant de fond en comble je n'arrive pas à comprendre mon erreur. Voici le code en PHP que j'utilise :

    $nb_depub=$bdd->exec('UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)');

                echo $nb_depub." éléments ont été dépubliés.";

    Merci si vous avez une idée de ce que j'ai fait de travers, et pardon pour le dérangement

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2017 à 15:16:38

      Bonjour,

      Je déplace dans le forum PHP ;)

      La première chose à faire est d'activer l'affichage des erreurs de PHP et de PDO :

      https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/configurer-php-pour-visualiser-les-erreurs

      https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/lire-des-donnees-2#/id/r-914292

      Reviens vers nous avec ces erreurs ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        17 novembre 2017 à 16:17:34

        Je ne comprends pas trop à quoi sert ton !approval 

        Tu veux dire quoi par là que sa doit se faire quand il est différent de dépublié ? Si c'est un booléen imaginons 0pour publié 1pour dépublié 

        Pourquoi ne pas plutôt mettre 

        WHERE Approval <> 1

        Après je ne te dis pas que c'est la solution, j'ai du mal à comprendre le tout un peu plus d'explication serrait bénéfique pour mieux t'aider ;)

        • Partager sur Facebook
        • Partager sur Twitter
        étudiant en BTS SIO (SLAM) en Alternance, je débute dans le dev web, mon premier site d'entrainement, je suis ouvert à toute suggestions.
          17 novembre 2017 à 16:34:48

          Fr0stFR a écrit:

          Je ne comprends pas trop à quoi sert ton !approval

          Pour info, le point d'exclamation est l'opérateur logique NOT ... Mais pour MySQL un booléen est en fait un TINYINT, donc potentiellement on peut stocker de -128 à 127, donc WHERE !approval revient à écrire WHERE approval = 0, et WHERE approval revient à écrire WHERE approval <> 0.

          https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            17 novembre 2017 à 16:43:15

            Fr0stFR a écrit:

            Je ne comprends pas trop à quoi sert ton !approval 

            Tu veux dire quoi par là que sa doit se faire quand il est différent de dépublié ? Si c'est un booléen imaginons 0pour publié 1pour dépublié 

            Pourquoi ne pas plutôt mettre 

            WHERE Approval <> 1

            Après je ne te dis pas que c'est la solution, j'ai du mal à comprendre le tout un peu plus d'explication serrait bénéfique pour mieux t'aider ;)


            Pour le coup, Quand un élément est publié, Approval vaut 1 et toute la ligne du tableau (avec toutes ses données) à le numéro de listing inférieur à 20 (compris entre 1 et 15 pour rappel). Si un élément devient dépublié, Approval passe à 0 mais c'est tout, je souhaite rajouter un correctif qui ajoute 20 a Listing si Listing est <20 et que Approval vaut 0, pour eviter de répéter a l'infini ce dernier changement

            Ainsi l'élément dépublié passe par exemple de 10 à 30, ce qui correspond au même élément mais dépublié.

            Pour répondre à Benzouye, il me semble avoir suivi le cours à la lettre et déjà activer les erreurs et justement, il n'en affiche aucune !

            J'ai rajouter la commande pour me signifier combien de lignes SQL sont touchées pour justement me rendre compte qu'aucune n'était affectée.
            Je retourne vérifier si je n'ai rien oublié cependant, on ne sait jamais...

            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2017 à 16:50:32

              Bonjour,

              On peut voir le reste de ton code ?  Parce que si ta requête fonctionne a priori (et je ne vois pas non plus d'erreur), le pb vient peut-être de la connexion ou du code php.

              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2017 à 17:14:21

                Voici mon code complet :

                <?php session_start();?>
                <!DOCTYPE html>
                <html>
                    <head>
                        <link rel="stylesheet" href="style.css" />
                
                </head>
                <body>
                            <?php include ("mon_entete.php"); ?>
                
                        <?php
                        //connection à la base de données
                        
                                    try {
                                $bdd = new PDO('mysql:host=monhote;dbname=mabase;charset=utf8','basename','motdepasse',
                                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                                  
                                        } catch (Exception $e) {
                                die('Erreur : ' . $e->getMessage());
                                    }
                                $nb_pub=$bdd->exec('UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)');
                                                
                                $nb_depub=$bdd->exec('UPDATE MaTable SET Listing=(Listing-20) WHERE (Approval and Listing>20)');
                                    
                                   echo "<br />Mise à jour effectuée avec succès !<br /><br />";
                                 echo $nb_depub." éléments ont été dépubliés,<br />".$nb_pub." éléments ont été republiés.";
                    ?>
                
                </body>
                </html>



                -
                Edité par FrancoisGuillaume 17 novembre 2017 à 17:16:46

                • Partager sur Facebook
                • Partager sur Twitter
                  17 novembre 2017 à 17:29:32

                  Et voici donc le résultat qui s'affiche :

                  Mise à jour effectuée avec succès !

                  0 éléments ont été dépubliés,

                  0 éléments ont été republiés. 

                  philodick a écrit:

                  Bon ben désolé, je ne vois pas...


                  Voila, on est d'accord, je ne vois pas d'où peut venir le problème; par contre tu évoques un souci de connexion ca reste possible surtout que l'hébergeur a eu des soucis de maintenance dans la journée, je vais attendre avant de retester...

                  -
                  Edité par FrancoisGuillaume 17 novembre 2017 à 17:39:58

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    17 novembre 2017 à 18:13:28

                    Bonsoir,

                    Plusieurs remarques :

                    - Tu ne l'as pas précisé, mais d'après ce que je comprends de ta table, les ID de 1 à 20 doivent être en Approval = TRUE (1) et sinon ceux de 21 à 35 doivent être en Approval = FALSE (0)
                    Si je me trompe, toutes mes remarques ci-dessous seront probablement fausses :)


                    - Ton système est mauvais, car tu "encodes" 2 fois la même information dans ta table. Si tu as un booléen Approval à TRUE (1) ou FALSE (0), tu n'as absolument pas besoin de modifier les identifiants. Ou réciproquement, si tu sais que tes ID sont > 20 alors tu peux déduire la valeur ton booléen Approval. Donc c'est de l'information redondante qui complique ton code et risque de provoquer des incohérences de données un jour. Imagine si pour une raison X ou Y que tu as un ID 8 (par exemple) avec un Approval = 0. C'est incohérent pour ton application et provoquera des affichages d'informations erronées.


                    - Ta requête est la suivante :
                    UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)
                    Ta requête est fausse, dans ton WHERE, tu cherches les Listing < 20  et qui ont Approval à FALSE (0). C'est pas bon, tu dois chercher ceux qui sont à TRUE (1) du coup :
                    UPDATE MaTable SET Listing=(Listing+20) WHERE (Approval and Listing<20)


                    - De plus, tu ne fais que ajouter 20 au Listing, mais tu laisses Approval à 1, donc voilà, ce que je disais auparavant est vrai, ta base est devenu incohérente. Il faudrait que tu modifies Approval à FALSE (0) en même temps :
                    UPDATE MaTable SET Listing=(Listing+20), Approval=false WHERE (Approval and Listing<20)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 novembre 2017 à 4:03:58

                      Bonsoir

                      Ta remarque n'est pas fausse mais c'est que tu n'as pas tous les éléments. Ce code est un correctif pour rattraper des erreurs d'encodage où, justement, un ID<20 se retrouve en Approval=0 alors qu'il devrait être à 1, et inversement un ID >20 qui aurait un Approval=True.

                      Sinon tu as effectivement parfaitement compris la table, j'ai rajouté moi-même en fait les lignes >20 pour gérer ces !Approval et les déplacer pour mieux les regrouper. La requête fonctionne en direct sur la base SQL mais pas quand je l'appelle dans mon programme PHP et c'est là que je ne comprends pas parce que je ne pense pas avoir fait d'erreur....

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 novembre 2017 à 14:06:39

                        FrancoisGuillaume a écrit:

                        tu évoques un souci de connexion ca reste possible

                        Si tu avais un souci de connexion, tu aurais une erreur d'exécution à la ligne 15 et tu irais donc dans le catch ...

                        Par contre si tu fais :

                        SELECT *
                        FROM MaTable
                        WHERE (!Approval and Listing<20)

                        As-tu un retour ? Il n'y a tout simplement pas d'enregistrement à mettre à jour ...

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          18 novembre 2017 à 16:41:05

                          Benzouye a écrit:

                          FrancoisGuillaume a écrit:

                          tu évoques un souci de connexion ca reste possible

                          Si tu avais un souci de connexion, tu aurais une erreur d'exécution à la ligne 15 et tu irais donc dans le catch ...

                          Par contre si tu fais :

                          SELECT *
                          FROM MaTable
                          WHERE (!Approval and Listing<20)

                          As-tu un retour ? Il n'y a tout simplement pas d'enregistrement à mettre à jour ...

                          Là, au jour d'aujourd'hui, j'en ai 3...
                          Edit : Pour être plus clair, ce n'est (malheureusement) pas moi qui ai codé le site qui gère ces données. Quand un élément n'a plus besoin d'être visible on a choisi de le "dépublier" plutôt que de le supprimer, puisqu'il arrive parfois qu'on ai besoin de le re-publier.

                          Mais celui qui a codé le bouton "publier/dépublier" n'a pas pensé à déplacer la donnée dans la base, ce qui fait qu'un hyperlien qui pointerait vers une de ces données avant la dépublication pointe toujours dessus après, d'où mon intervention avec ce correctif (tant que je n'arrive pas à joindre le responsable), puisque je n'ai pas accès à cette partie du code (c'est compliqué, je sais).

                          A l'heure où j'écris, une 4è donnée vient d'être dépubliée mais toujours pas de réussite avec mon programme, toujours 0 lignes modifiées mais pas d'erreur signalée

                          -
                          Edité par FrancoisGuillaume 18 novembre 2017 à 18:56:11

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 novembre 2017 à 10:59:17

                            Bien le bonjour, je viens de corriger mon erreur qui, comme c'est souvent le cas, était toute simple : je ne me connectai pas à la bonne BDD :p

                            Celle ci a migré récemment vers un autre serveur et je n'avais tout simplement pas modifié l'adresse de l'hôte dans mon programme.

                            Problème résolu donc, tout fonctionne correctement !

                            Merci pour votre patience et encore désolé ;P

                            • Partager sur Facebook
                            • Partager sur Twitter

                            [SQL 5.5] Modifier une ligne de ma BDD en PHP

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown