Bonsoir,
J'utilise le code ci-dessous pour mettre à jour la bdd pourtant la mise à jour ne s'effectue pas ! Pire encore pdo retourne true ???

code:

$confirm_token  = sha1(uniqid());
        $date_token     = date('G-i/d-n-Y');
        require ('db.php');
        $new_token = $pdo->query('UPDATE users SET confirm_token="'.$confirm_token.'", date_token="'.$date_token.'" WHERE id="'.$id.'" ');
        if($new_token)
        { return true; }
        else
        { return false; }

12 réponses


kwik
Réponse acceptée

Salut

Il ne faut plutot faire passer les valeurs dans l'execute directement ? du style :

$new_token = $pdo->prepare('UPDATE users SET confirm_token = :confirm_token, date_token = :date_token WHERE id = :id');
$new_token->execute([
    ':confirm_token' => sha1(uniqid()),
    ':date_token' => date('Y-m-d H:i:s'),
    ':id' => $id
]);

ou bien sans les nommés :

$new_token = $pdo->prepare('UPDATE users SET confirm_token = ?, date_token = ? WHERE id = ?');
$new_token->execute([sha1(uniqid()), date('Y-m-d H:i:s'), $id]);
LesTutossUE4
Réponse acceptée

Tu ne devrais pas passer par un varchar pour enregistrer une date. Je pense que si tu passer par un datetime comme l'a dit tleb ou par un timestamp, tu pourrais faire un NOW() et tu aurais moins de problème par la suite.
Pour reafficher la date dans le format que tu veux, il te suffira de faire un :

date('G-i/d-n-Y',$timestamp);

ou

date('G-i/d-n-Y',strtotime($date));

Hello,

Tu es sûre que la valeur de $id existe dans la bdd ?

Sinon, pourquoi tu n'utilises pas la méthode prepare dans ce cas ? Ca semble plus adapté, non ? ^^

EDIT : Je ne suis pas sûr, mais le problème ne viendrait pas de la date ? Dans les bases de données, la date est sous la forme Y-m-d H:i:s. Si tu l'insères sous cette forme, ça ne marche toujours pas ?

vavoir
Auteur

J'ai tester avec prepare + execute, cela ne change rien.
Quand à la date je ne pense pas que le problème vienne de là car lorsque j'insère pour la première il est sous cette forme:

$insert_content_database[] = date('G-i/d-n-Y');

Et je n'ai aucun problème. Le problème persiste pour l'instant. J'ai cependant noter une chose la coloration change dans mon éditeur en effet WHERE n’apparaît pas en violet ?

vavoir
Auteur

Si j'écrits ceci:

$new_token = $pdo->prepare('UPDATE users SET confirm_token="", date_token="" WHERE id="'.$id.'" ');

La coloration fonctionne WHERE apparait en violet celà un peut êre un rapport.

J'ai testé ton code et j'ai la date plante, elle ne s'enregistre pas dans la bdd. Pourquoi tu n'utilises pas NOW() à la place ? C'est tellement plus simple. :p
Suffit de faire date_token = NOW() dans ta requête.

Sinon, y'a pas de soucis des les " et ', donc la coloration de WHERE étrange, je ne peux pas te dire de quoi ça vient. ^^

vavoir
Auteur

Je n'utilise pas NOW() car la date doit avoir un format spécifique. J'ai tester le code suivant directement dans phpmyadmin:

UPDATE users SET confirm_token="4a004bab8ded05ddd5771ccf1c5c9ed39add27ec", date_token="21-58/04-11-2015" WHERE id="7"

Et je n'ai eu aucune erreur mais si je passe par pdo rien ne se passe:

$truc = 'UPDATE users SET confirm_token="'.sha1(uniqid()).'", date_token="'.date('G-i/d-n-Y').'" WHERE id="'.$id.'" ';
        require ('db.php');
        //die(var_dump($truc));
        $new_token = $pdo->prepare($truc);
        $new_token->execute();
        if($new_token)
        { return true; }
        else
        { return false; }

Salut,

MySQL possède un format datetime, adapté à ce que tu souhaites faire. Avec ça, tu pourras utiliser NOW().

Quel est le format de ton champ confirm_token?

vavoir
Auteur

@Damien Moser

varchar(255)

La solution de kwik est la bonne :)

vavoir
Auteur

Bonjour,

Je vous remercie beaucoup pour vos réponse malheureusement j'ai était très pris pas la configuration de mon NAS je n'ai pas pu pour l'instant tester tout ça je vous tiens au courant.

Encore merci.