[sql] probleme de requete de mise a jour

Résolu/Fermé
Signaler
Messages postés
4607
Date d'inscription
lundi 7 novembre 2005
Statut
Contributeur
Dernière intervention
24 octobre 2020
-
Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
-
Bonsoir,

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 !

5 réponses

Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
7
Salut !

Quel est le contenu de $query ?

Tu as éxécuté cette requête aves phpMyadmin ? Que retourne-t-il comme message d'erreur ?


_
Messages postés
4607
Date d'inscription
lundi 7 novembre 2005
Statut
Contributeur
Dernière intervention
24 octobre 2020
1 311
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 :

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 ?
Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
7
J'ai essayé de reproduire ton problème, sans y parvenir. Peux-tu donner des infos sur la structure de la table ?


y'a un soucis, base64_decode(base64_encode(1180950895)) ne me retourne pas le bon résultat apparement. bizarre. 
? ? ? Tu es sûr ?

_
Messages postés
4607
Date d'inscription
lundi 7 novembre 2005
Statut
Contributeur
Dernière intervention
24 octobre 2020
1 311
Re, ci dessous ma table :

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...
Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
7
$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 ;-)
Messages postés
4607
Date d'inscription
lundi 7 novembre 2005
Statut
Contributeur
Dernière intervention
24 octobre 2020
1 311
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 :
(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_ !
Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
7
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" :
$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à ;-)

_
Messages postés
4607
Date d'inscription
lundi 7 novembre 2005
Statut
Contributeur
Dernière intervention
24 octobre 2020
1 311
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
Messages postés
69
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
3 novembre 2007
7
La réponse est dans le 1. :

c'est ma façon de coder :-)

Patapé ! J'avais oublié de le préciser...