[RESOLU] Problème avec un UPDATE

Eléphanteau du PHP | 47 Messages

14 nov. 2021, 10:32

Bonjour à tous,

J'ai un problème avec un UPDATE qui ne fonctionne pas, je ne comprends pas pourquoi. Si quelqu'un pouvait regarder mon code ce serait super sympa.

Code : Tout sélectionner

$db =Database::connect(); $stmt= $db->prepare("UPDATE users SET date=:date WHERE email=:email"); $stmt->bindValue(':email',$mail, PDO::PARAM_STR); $stmt->bindvalue(':date',$date, PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor();
Les variables mail et date contiennent bien une valeur toutes les deux, j'ai bien entendu vérifié au préalable. Mais rien ne s'enregistre dans ma base. Je sais lire des données, insérer et supprimer. Mais impossible de faire une mise à jour de celles-ci !

À l'aide s'il vous plait, merci d'avance et bonne journée à tous

Mammouth du PHP | 2703 Messages

14 nov. 2021, 13:26

afficher
echo "UPDATE users SET date='$date' WHERE email='$mail'";
l'exécuter dans phpmyadmin pour voir si cela provoque une erreur.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

14 nov. 2021, 15:25

Également, active la gestion d'erreur PDO en WARNING ça aide pour débuguer :
https://www.php.net/manual/fr/pdo.error-handling.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 09:00

Bonjour à tous,

D'abord un tout grand merci de vous pencher sur mon problème.
Ma requête fonctionne correctement dans MySQL, j'avais testé aussi avant d'envoyer un message sur le forum. Par contre, je n'ai pas activé les message d'erreur pour PDO je vais tester et je reviens vers vous :wink:

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 09:20

Re,

@rthur, j'ai activé la gestion d'erreur PDO, malheureusement il me retourne aucune erreur :(

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 09:38

Je viens de faire encore une série de test et rien ne passe vers ma base de données. SAUF, quand je mets des valeurs directement dans la requête qui ce trouve dans ma page php. Là étrangement tout passe mais dès que je travaille en PDO ou autre plus rien de rentre à rien comprendre.

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 09:49

Quand je fais un print_r juste avant l'excute de ma variable $stmt voici ce qu'elle m'affiche

PDOStatement Object ( [queryString] => UPDATE users set date=:date WHERE email=:email )

Elle ne contient aucune valeur, est-ce normal svp ?

ynx
Mammouth du PHP | 586 Messages

15 nov. 2021, 17:26

Oui c'est normal que les valeurs ne s'affichent pas lorsqu'on affiche l'objet PDOStatement correspondant à la requête préparée.
A priori le problème viendrait des variables $mail et $date.
Que donne le test suivant ?
var_dump($mail);
var_dump($date);

$db = Database::connect();
$stmt= $db->prepare("UPDATE users SET date=:date WHERE email=:email");
$stmt->bindValue(':email', $mail, PDO::PARAM_STR);
$stmt->bindvalue(':date', $date, PDO::PARAM_STR);
$stmt->execute();

$stmt->debugDumpParams();

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 19:41

Bonsoir,

Merci du suivi, mes variables ont bien une valeur et c'est bien là le problème. Je m'arrache les cheveux car je ne comprends absolument pas pourquoi cette requête ne fonctionne pas :?

Eléphanteau du PHP | 47 Messages

15 nov. 2021, 21:42

Re,

Voici le résultat de l'option debug

SQL: [52] UPDATE users set date = :date WHERE email = :email Sent SQL: [74] UPDATE users set date = 2021-11-15' WHERE email = '[email protected]' Params: 2 Key: Name: [6] :email paramno=-1 name=[6] ":email" is_param=1 param_type=2 Key: Name: [6] :date paramno=-1 name=[6] ":date" is_param=1 param_type=2

Pour les variables var_dump elles retournent bien toutes les deux une valeur.

Mammouth du PHP | 2703 Messages

15 nov. 2021, 22:29

set date = 2021-11-15'
cela marcherait mieux avec
set date = '2021-11-15'

quel est le retour exact de :
var_dump($date);
?

Eléphanteau du PHP | 47 Messages

16 nov. 2021, 17:04

Salut Or1,

Il ne manque pas d'apostrophe à set date, c'est une erreur de manipulation de ma part (effacé par inadvertance).
var_dump($date); donne bien 2021-11-16, la date d'aujourd'hui vu que je viens de refaire le test à l'instant.

Mammouth du PHP | 2703 Messages

16 nov. 2021, 18:40

et la sugestion d'Arthur, cela dit quoi ?

Eléphanteau du PHP | 47 Messages

17 nov. 2021, 08:38

Je n'ai aucune erreur de retourner, je n'y comprend rien. Je vais vous envoyer mon code complet comme ça vous aurez une vue d'ensemble.
Merci pour votre aide

Eléphanteau du PHP | 47 Messages

17 nov. 2021, 08:56

Re,

Afin que tout le monde voit plus claire, voici un exemple qui ressemble à mon code. Vous verrez que celui-ci ne retourne aucune erreur et que mes variables contiennent bien des valeurs. J'ai remplacé le champs date par un token, pour voir le changement à chaque rafraichissement plus simple et plus visuel.
Bien entendu, j'ai créé une table avec les bons champs et les bonnes valeurs.

Code : Tout sélectionner

<?php require 'classes/core.php'; $dsn = 'mysql:dbname=testcode;host=localhost'; $user = 'root'; $password = ''; try { $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo 'Échec lors de la connexion : ' . $e->getMessage(); } $mail ='[email protected]'; $token = uniqid(); var_dump($mail); var_dump($token); $db =Database::connect(); $db->exec("SET CHARACTER SET utf8"); $stmt= $db->prepare('UPDATE users set token = :token WHERE email = :email'); $stmt->bindValue(":email",$mail,PDO::PARAM_STR); $stmt->bindvalue(":token",$token,PDO::PARAM_STR); $stmt->execute(); $stmt->debugDumpParams(); ?> <!DOCTYPE html> <html lang="en"> <head> <title>Récupération de votre psw</title> </head> <body> <section id="cours"> <div class="container"> <div class="tprinc"> <h2>Page de test </h2> </div> <div class="white"> Page de test </div> </div> </section> </body> </html>
Ce code ne fonctionne pas chez moi et je ne comprends pas pourquoi !!!! Il est pourtant basic et plus que rudimentaire.

Vous constaterez comme moi que les valeurs sont bien transmisses à la requête SQL, mais que celle-ci ne s'exécute pas car rien ne s'inscrit dans ma base de données.

Merci pour votre aide