Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vérification d'une donnée en BDD

Ma requête ne marche pas

Sujet résolu
    18 juillet 2019 à 15:38:27

    Bonjour à tous,

    Je fais un site qui possède un formulaire de contact. Ca, ça marche bien.

    Je cherche à tenir une BDD dans laquelle j'aurais le nom de la personne qui a envoyée le message, son mail et la date. Le but est que cette "BDD clients" soit à jour : si la personne reposte plus tard, on met à jour la date dans la BDD clients, si c'est son premier message, on crée.

    Seulement, ma requête ne marche pas. J'ai modifié mon script plusieurs fois en fonction des infos que j'ai pu trouver sur le net et rien y fait.

    La requête que j'ai à ce jour me parait claire et pourtant fonctionnelle. Voici la portion qui peine :

    // Recherche de l'adresse mail dans la base
    	$recherche_mail = $bdd->query('SELECT 1 FROM bdd_clts WHERE email = ":from" ');
    	$recherche_mail->execute(array(
    				'from' => $_POST['contact-email']
    				));
    	// Si on trouve,on crée
    		if($recherche_mail->fetch())
    		{
    			$req2 = $bdd->prepare('INSERT INTO bdd_clts(nom, email, date) VALUES(:nom, :email, NOW())');
    			$req2->execute(array(
    				'nom' => $_POST['contact-name'],
    				'email' => $_POST['contact-email']
    				));
    		}
    	// Sinon on met à jour
    		else
    		{
    			$req = $bdd->prepare('UPDATE bdd_clts SET date = "NOW()" WHERE email = ":from" ');
    			$req->execute(array(
    				'from' => $_POST['contact-email']
    				));
    		}
    	$recherche_mail->closeCursor();

    Pas d'erreur renvoyée. Mais quand j'inverse le requête du if et du then ca me crée une ligne en DBB, alors qua là, ça ne met même pas la ligne à jour.

    Je pense que je formule mal mon UPDATE.

    Pouvez-vous m'aider ?

    Merci et bonne journée

    -
    Edité par Korgahn 18 juillet 2019 à 15:39:22

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2019 à 15:42:23

      Bonjour.

      Ta condition est incorrecte, tu lui dit en quelque sorte :

      Si tu me trouve un enregistrement, tu en crées un nouveau, sinon tu le modifie.

      Que trouves-tu logique dans cette condition ?

      Comment le SGBD pourrait mettre à jour un enregistrement qui n'existe pas ?

      -
      Edité par Lartak 18 juillet 2019 à 15:43:52

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        18 juillet 2019 à 15:58:37

        Tout à fait vrai.

        Du coup, j'ai fait ça :

        	// Recherche de l'adresse mail dans la base
        		$recherche_mail = $bdd->query('SELECT 1 FROM bdd_louam_clts WHERE email = ":from" ');
        		$recherche_mail->execute(array(
        					'from' => $_POST['contact-email']
        					));
                // Si on trouve, on met à jour
                    if($recherche_mail->fetch())
                    {
                        $req = $bdd->prepare('UPDATE bdd_louam_clts SET date = "NOW()" WHERE email = ":from" ');
                        $req->execute(array(
                            'from' => $_POST['contact-email']
                            ));
                    }
                // Sinon on crée
                    else
                    {
                        $req2 = $bdd->prepare('INSERT INTO bdd_louam_clts(nom, email, date) VALUES(:nom, :email, NOW())');
                        $req2->execute(array(
                            'nom' => $_POST['contact-name'],
                            'email' => $_POST['contact-email']
                            ));
                    }
                $recherche_mail->closeCursor();


        Mais ça crée quand même une ligne même si le mail est déjà présent dans la bdd.

        Où ai-je faux ?

        -
        Edité par Korgahn 18 juillet 2019 à 16:10:27

        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2019 à 16:14:01

          Non, la méthode fetch ne renvoi jamais 0, c'est donc normal que tu ne rentres pas dans le premier cas de la condition :

          La valeur retournée par cette fonction en cas de succès dépend du type récupéré. Dans tous les cas, FALSE est retourné si une erreur survient.

          Source: PHP: PDOStatement::fetch - Manual » Retour.

          Si tu changes le contenu de ton code entre-temps, on ne va pas s'en sortir.

          -
          Edité par Lartak 18 juillet 2019 à 16:15:40

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            18 juillet 2019 à 17:57:17

            Ca y est ça fonctionne.

            Il y avait deux problèmes :

            • Le premier, soulevé par Lartak, était l'inversion de if-else
            • La deuxième venait de l'utilisation de la variable dans ma requête. Il vaut mieux préparer la requête contenant la variable avant de l'exécuter.

            Résultat :

            	// Recherche de l'adresse mail dans la base
            		$req = 'SELECT * FROM bdd_louam_clts WHERE email=?';
            		$recherche_mail = $bdd->prepare($req);
            		$recherche_mail->execute(array($_POST['contact-email']));
            		$resultat = count($recherche_mail->fetchAll());
            
            		// Si on ne trouve pas, on crée
            			if($resultat==0)
            			{
            				$req1 = $bdd->prepare('INSERT INTO bdd_louam_clts(nom, email, date) VALUES(:nom, :email, NOW())');
            				$req1->execute(array(
            					'nom' => $_POST['contact-name'],
            					'email' => $_POST['contact-email']
            					));
            			}
            		// Sinon on met à jour
            			else
            			{
            				$req2 = $bdd->prepare('UPDATE bdd_louam_clts SET date=NOW() WHERE email=? ');
            				$req2->execute(array($_POST['contact-email']));
            			}


            Merci ! :)

            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2019 à 18:29:48

              Même si ça fonctionne, c'est incorrect, utiliser la méthode fetchAll pour simuler la récupération de plusieurs enregistrements juste pour utiliser la fonction count est totalement faux, surtout que tu n'es censé récupérer qu'un seul enregistrement.

              Donc remplaces la méthode fetchAll par fetch dont tu stockes son retour dans la variable, et fais une condition approprié pour la vérification.

              • Partager sur Facebook
              • Partager sur Twitter

              Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                19 juillet 2019 à 11:36:39

                Mais... Pourquoi tu fais ça ? :'(

                Bon allez, on fait ça propre ! J'y retourne.

                Dis-moi si j'ai bon : (ce script fonctionne)

                	// Recherche de l'adresse mail dans la base
                		$req = 'SELECT * FROM bdd_louam_clts WHERE email=?';
                		$recherche_mail = $bdd->prepare($req);
                		$recherche_mail->execute(array($_POST['contact-email']));
                		$resultat = $recherche_mail->fetch();
                
                		// Si on ne trouve pas, on crée
                			if($resultat==FALSE)
                			{
                				$req1 = $bdd->prepare('INSERT INTO bdd_louam_clts(nom, email, date) VALUES(:nom, :email, NOW())');
                				$req1->execute(array(
                					'nom' => $_POST['contact-name'],
                					'email' => $_POST['contact-email']
                					));
                			}
                		// Sinon on met à jour
                			else
                			{
                				$req2 = $bdd->prepare('UPDATE bdd_louam_clts SET date=NOW() WHERE email=? ');
                				$req2->execute(array($_POST['contact-email']));
                			}

                Je demande à ma requête d'aller me cherche les lignes où l'adresse mail est la même que celle de la personne qui poste et d'en exprimer le résultat au travers de fetch.

                Si il n'y a pas de mail existant, la requête ne peut pas s'éxécuter et fetch retourne un FALSE.

                Le reste est gérer par les conditions.

                C'est ça ?

                En fait le principal problème était la gestion de la variable avec WHERE.

                Ca m'a mis dedans dès le départ et je suis parti chercher des trucs compliqués.

                -
                Edité par Korgahn 19 juillet 2019 à 11:57:39

                • Partager sur Facebook
                • Partager sur Twitter

                Vérification d'une donnée en BDD

                × 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