[sql] probleme de requete de mise a jour
Résolu
gryzzly
Messages postés
4608
Date d'inscription
Statut
Contributeur
Dernière intervention
-
webtotoche Messages postés 69 Date d'inscription Statut Membre Dernière intervention -
webtotoche Messages postés 69 Date d'inscription Statut Membre Dernière intervention -
Bonsoir,
un osucis avec ma requete qui ne marche jamais, je comprend pas pourquoi !!
J'envoie aux utilisateurs ceci :
Lorsqu'ils passent le lien dans leur navigateur, ceci doit updater la table user , en passant le statut - user_status - (par défaut à zéro) à 1. Voici le code associé :
Je recupere donc le hash et le stamp de mon url pour les utiliser dans la requete de mise a jour :
Le problème, c'est que ca ne marche pas. J'ai toujours le message comme quoi l'opération n'est pas possible, alors qu'il existe bien un utilisateur ou le hash et le stamp correspondent aux paramètres de l'url (et bien sur le statut n'est pas updaté) !! aaaaaaaaaahh! ca fait 2 heures je galère.
Une idée ? La solution ?
Merci d'avance !
un osucis avec ma requete qui ne marche jamais, je comprend pas pourquoi !!
J'envoie aux utilisateurs ceci :
$url = mondomaine.com/activate.php?hash='.$encrypted.'&stamp='.base64_encode($timestamp);
Lorsqu'ils passent le lien dans leur navigateur, ceci doit updater la table user , en passant le statut - user_status - (par défaut à zéro) à 1. Voici le code associé :
<?php // Connection à la base de données mysql_connect ($db_host, $db_user, $db_pass) or die ('Les paramètres de connection à la base sont erronés.'); mysql_select_db ($db_database) or die ('Impossible de sélectionner la base.'); $query = "UPDATE user SET user_status = 1 WHERE (user_password = '$GET[hash]') AND (user_timestamp = 'base64_decode($GET[stamp])')"; $result = mysql_query($query) or die(mysql_error()); if (mysql_affected_rows() == 1){ echo 'Votre compte vient d\'être validé. Vous pouvez désormais vous connecter et profiter des avantages des membres de $site_nom. <br/><br /> <a href="./" title="Hop, c\'est parti !">Cliquez ici</a> pour retourner à l\'accueil.'; } else { echo 'L\'opération demandée n\'est pas possible. Ressayez en faisant un copier/coller de l\'adresse qui vous a été fournie dans le mail. Si cela ne fonctionne toujours pas, <a href="./contact.php" title="Signaler un problème">contactez un administrateur</a> en précisant votre login d\'inscription.'; } mysql_close(); ?>
Je recupere donc le hash et le stamp de mon url pour les utiliser dans la requete de mise a jour :
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$GET[hash]') AND (user_timestamp = 'base64_decode($GET[stamp])')";
Le problème, c'est que ca ne marche pas. J'ai toujours le message comme quoi l'opération n'est pas possible, alors qu'il existe bien un utilisateur ou le hash et le stamp correspondent aux paramètres de l'url (et bien sur le statut n'est pas updaté) !! aaaaaaaaaahh! ca fait 2 heures je galère.
Une idée ? La solution ?
Merci d'avance !
A voir également:
- [sql] probleme de requete de mise a jour
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise a jour windows 10 - Accueil - Mise à jour
- Mise a jour chromecast - Accueil - Guide TV et vidéo
- Mise a jour kindle - Guide
- Mise à jour libre office - Accueil - Bureautique
5 réponses
Salut !
Quel est le contenu de $query ?
Tu as éxécuté cette requête aves phpMyadmin ? Que retourne-t-il comme message d'erreur ?
_
Quel est le contenu de $query ?
Tu as éxécuté cette requête aves phpMyadmin ? Que retourne-t-il comme message d'erreur ?
_
Salut webtotoche,
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$GET[hash]') AND (user_timestamp = 'base64_decode($GET[stamp])')";
$result = mysql_query($query) or die(mysql_error());
--> je n'ai pas de message d'erreur, donc la fonction passe, et me retourne :
car il n'y a pas eu de modif dans la table... (car (mysql_affected_rows() == 1) est faux !)
----
avec un exemple :
si je fais :
donc j'ai mis la valeur user_timestamp de la base de données directement, c'est ok, la requete fonctionne
si je fais :
ce qui revient en réalité à :
c'est pas ok, la requete fonctionne pas.
y'a un soucis, base64_decode(base64_encode(1180950895)) ne me retourne pas le bon résultat apparement. bizarre.
une idée ?
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$GET[hash]') AND (user_timestamp = 'base64_decode($GET[stamp])')";
$result = mysql_query($query) or die(mysql_error());
--> je n'ai pas de message d'erreur, donc la fonction passe, et me retourne :
else { echo 'L\'opération demandée n\'est pas possible. Ressayez en faisant un copier/coller de l\'adresse qui vous a été fournie dans le mail. Si cela ne fonctionne toujours pas, <a href="./contact.php" title="Signaler un problème">contactez un administrateur</a> en précisant votre login d\'inscription.'; }
car il n'y a pas eu de modif dans la table... (car (mysql_affected_rows() == 1) est faux !)
----
avec un exemple :
$hash = a034c9a555cec60b7987fded5ed3c126 ; $timestamp = 1180950895 ; $stamp = base64_encode($timestamp) ;
si je fais :
UPDATE user SET user_status = 1 WHERE (user_password = '$hash ') AND (user_timestamp = '1180950895')
donc j'ai mis la valeur user_timestamp de la base de données directement, c'est ok, la requete fonctionne
si je fais :
UPDATE user SET user_status = 1 WHERE (user_password = 'a034c9a555cec60b7987fded5ed3c126') AND (user_timestamp = 'base64_decode($stamp)')
ce qui revient en réalité à :
UPDATE user SET user_status = 1 WHERE (user_password = 'a034c9a555cec60b7987fded5ed3c126') AND (user_timestamp = 'base64_decode(base64_encode(1180950895))')
c'est pas ok, la requete fonctionne pas.
y'a un soucis, base64_decode(base64_encode(1180950895)) ne me retourne pas le bon résultat apparement. bizarre.
une idée ?
Re, ci dessous ma table :
avec user_status par défaut à 0
et oui je suis sur :
--> Nombre d'enregistrements affectés : 1 (traitement: 0.0028 sec.)
--> Nombre d'enregistrements affectés : 0 (traitement: 0.0094 sec.)
c'est donc bien de decode/encode qui merdouille... mais pourquoi ? apparement pas de probleme de syntaxe...
CREATE TABLE `user` ( `user_id` int(11) NOT NULL auto_increment, `user_name` varchar(25) character set latin1 collate latin1_general_cs NOT NULL, `user_password` varchar(32) character set latin1 collate latin1_general_cs NOT NULL, `user_email` varchar(50) character set latin1 collate latin1_general_cs NOT NULL, `user_timestamp` varchar(20) character set latin1 collate latin1_general_cs NOT NULL, `user_status` binary(1) NOT NULL, ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=27 ;
avec user_status par défaut à 0
et oui je suis sur :
UPDATE user SET user_status = 1 WHERE (user_password = 'a034c9a555cec60b7987fded5ed3c126') AND (user_timestamp = '1180950895')
--> Nombre d'enregistrements affectés : 1 (traitement: 0.0028 sec.)
UPDATE user SET user_status = 1 WHERE (user_password = 'a034c9a555cec60b7987fded5ed3c126') AND (user_timestamp = 'base64_decode(base64_encode(1180950895))')
--> Nombre d'enregistrements affectés : 0 (traitement: 0.0094 sec.)
c'est donc bien de decode/encode qui merdouille... mais pourquoi ? apparement pas de probleme de syntaxe...
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$GET[hash]') AND (user_timestamp = 'base64_decode($GET[stamp])')";
$_GET['stamp'] au lieu de $GET[stamp] ? :-)
$query = 'UPDATE user SET user_status = 1 WHERE (user_password = "'.$_GET['hash'].'") AND (user_timestamp = "'.base64_decode($_GET['stamp']).'")';ça marche ;-)
lol, en fait y'avait carrément des problèmes de syntaxe dans la requete !
merci de l'aide.
quelle est la signification de des points (.) dans :
et pourquoi faut il coupler les guillets doubles et les guillements simples ?
Pour le $_GET j'aurais pu m'en rendre compte..
mais c'est la journée je fais n'importe quoi. j'ai passé deux heure sur une analyse cette apres midi, a pas comprendre pourquoi je n'avais pas le mm résultat sur 2 logiciels différents... pour finalement me rendre compte que mes données source n'etaient pas les meme !
merci webt_ !
merci de l'aide.
quelle est la signification de des points (.) dans :
(user_password = "'.$_GET['hash'].'")
et pourquoi faut il coupler les guillets doubles et les guillements simples ?
Pour le $_GET j'aurais pu m'en rendre compte..
mais c'est la journée je fais n'importe quoi. j'ai passé deux heure sur une analyse cette apres midi, a pas comprendre pourquoi je n'avais pas le mm résultat sur 2 logiciels différents... pour finalement me rendre compte que mes données source n'etaient pas les meme !
merci webt_ !
quelle est la signification de des points (.) dans :
(user_password = "'.$_GET['hash'].'")
Dans ce contexte le point sert à concaténer les chaines de caractères.
et pourquoi faut il coupler les guillets doubles et les guillements simples ?
Plusieurs possibilités :
1. Pas obligé, là c'est ma façon de coder :-)
(Ceci étant, j'ai vu, et appris, partout que le nom de l'indice est entre simple-quotes dans un $_GET, mais j'ai fait des essais en les omettant et ça marche quand même)
2. si tu construis ta chaine $query en concaténant des chaines et des variables chaines, tu peux tout encadrer par des double-quote, l'expression sera bien "évaluée" :
-----------
Mais c'est déconseillé lorsqu'il y a une une fonction :
-----------------
-----------------
Pour le $_GET j'aurais pu m'en rendre compte..
Tu n'es pas seul sur ce coup-là ;-)
_
(user_password = "'.$_GET['hash'].'")
Dans ce contexte le point sert à concaténer les chaines de caractères.
et pourquoi faut il coupler les guillets doubles et les guillements simples ?
Plusieurs possibilités :
1. Pas obligé, là c'est ma façon de coder :-)
(Ceci étant, j'ai vu, et appris, partout que le nom de l'indice est entre simple-quotes dans un $_GET, mais j'ai fait des essais en les omettant et ça marche quand même)
2. si tu construis ta chaine $query en concaténant des chaines et des variables chaines, tu peux tout encadrer par des double-quote, l'expression sera bien "évaluée" :
$dec = base64_decode($_GET[stamp]); $query = "UPDATE user SET user_status = 1 WHERE (user_password = '$_GET[hash]') AND (user_timestamp = '$dec')";ça marche
-----------
Mais c'est déconseillé lorsqu'il y a une une fonction :
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$_GET[hash]') AND (user_timestamp = 'base64_decode($_GET[stamp])')";ça marche pas
-----------------
$query = "UPDATE user SET user_status = 1 WHERE (user_password = '$_GET[hash]') AND (user_timestamp = '".base64_decode($_GET[stamp]).'")";ça marche
-----------------
Pour le $_GET j'aurais pu m'en rendre compte..
Tu n'es pas seul sur ce coup-là ;-)
_
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
quelle est la signification de des points (.) dans :
(user_password = "'.$_GET['hash'].'")
Dans ce contexte le point sert à concaténer les chaines de caractères.
mais dans ce cas, je n'ai rien a concaténer ! j'ai uniquement ma variable $_get['hash']... si j'avais eu qqch de ce style : $user.$_GET['hash'] j'aurais compris, mais là :s
(user_password = "'.$_GET['hash'].'")
Dans ce contexte le point sert à concaténer les chaines de caractères.
mais dans ce cas, je n'ai rien a concaténer ! j'ai uniquement ma variable $_get['hash']... si j'avais eu qqch de ce style : $user.$_GET['hash'] j'aurais compris, mais là :s