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.
// 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.
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']));
}
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.
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.
// 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
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.
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.
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.
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.