Comparaison de chaines en PHP

Comparaison de chaines en PHP - PHP - Programmation

Marsh Posté le 30-11-2008 à 19:21:44    

Bonjour à tous
J'ai créé un petit site en PHP/MySQL, et je suis confronté à un souci.
Dans l'espace membre, j'ai une partie qui permet de modifier son mot de passe. Je récupère donc l'ancien mot de passe, puis les 2 nouveaux (il est répété pour éviter les erreurs de frappe, banal quoi).
Tout ceci est envoyé via POST a une page qui compare les deux chaînes $newpass et $newpass2, et qui redirige via un header("Location:fdsfds.php" ) sur la page précédente avec un petit message d'erreur.
Jusque là, rien d'extraordinaire...
Sauf que ça marche pas !
J'ai testé avec des echo, et il ne se gêne pas du tout pour valider la comparaison des deux mots de passe !!!
Je ne comprends pas...
J'ai fait la même chose pour l'inscription, et il valide celle-ci même si le deuxième champ de password est vide  :??:  
ci-joint le code correspondant :
La page html avec le formulaire :

Code :
  1. echo '<table><form method = "POST" action = "changepass.php">
  2. <tr>
  3.  <td><p>Mot de passe actuel :</td><td><input type = "password" name = "oldpass"></p></td>
  4. </tr><tr>
  5.  <td><p>Nouveau mot de passe :</td><td><input type = "password" name = "newpass"></p></td>
  6. </tr><tr>
  7.  <td><p>Répéter :</td><td><input type = "password" name = "newpass2"></p></td>
  8. </tr><tr>
  9.  <td><p><input type = "submit" value = "Changer mon Mot de Passe"></p></td><td></td>
  10. </tr>
  11. </form></table>';


Et voici la page qui récupère les données :
 

Code :
  1. //on récupère les données
  2. $oldpass = $_POST['oldpass'];
  3. $newpass = $_POST['newpass'];
  4. $newpass2 = $_POST['newpass2'];
  5. /*echo 'pass1 : '.$newpass.'<br>';
  6. echo 'pass2 : '.$newpass2.'<br>';*/
  7. if ($newpass == "" ){
  8. header("Location:account.php?pv=1" );
  9. }
  10. if ($newpass != $newpass2) {
  11. header("Location:index.php" );
  12. }
  13. $sql = mysql_query("SELECT password FROM ".$mysql_prefix."accounts WHERE id = ".$_SESSION['id']."" ) or die(mysql_error());
  14. $verifmdp = mysql_fetch_array($sql);
  15. if (md5($oldpass) != $verifmdp['password']) {
  16. header("Location:account.php?mp=1" );
  17. } else {
  18. $newpassword = md5($newpass);
  19. mysql_query("UPDATE accounts SET password = '".$newpassword."' WHERE id = '".$_SESSION['id']."' " ) or die(mysql_error());
  20. header("Location:account.php?p=1" );
  21. }


Y a t'il un souci dans ma comparaison ? Il me semblait qu'un simple == suffirait mais apparemment non...Il me semblait aussi qu'une redirection par header stoppait le traitement du fichier...Le problème pourrait-il venir de là ? Dois-je mettre l'update de la bdd en conditionnelle [mot de passes identiques] ?  
Merci de vos réponses et aides :)

Reply

Marsh Posté le 30-11-2008 à 19:21:44   

Reply

Marsh Posté le 30-11-2008 à 20:11:23    

header n'arrête pas le traitement. il faut un exit; derrière.

Message cité 1 fois
Message édité par skeye le 30-11-2008 à 20:12:15

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-11-2008 à 20:13:58    

skeye a écrit :

header n'arrête pas le traitement. il faut un exit; derrière.


 
Merci, réponse concise et claire :)
Bon, j'ai tout mis en conditionnel et ça fonctionne, merci beaucoup !!
Par contre, j'ai un souci dans l'inscription, j'aimerais tester si le pseudo existe toujours, comment je peux faire ? J'ai fait un SELECT avec login = $login et regardé si le fetch était un tableau (is_array) mais ça ne fonctionne pas, il me laisse m'inscrire avec le meme pseudo...Une idée ?

Reply

Marsh Posté le 30-11-2008 à 20:19:09    

Pas compris la question. Tu veux tester si un pseudo existe déjà?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-11-2008 à 20:22:05    

Voila.
Donc je fais une requete avec le pseudo, et j'aimerais tester si j'ai des résultats ou pas quoi...
Si j'ai un résultat : le pseudo existe, si j'en ai pas c'est bon...
Comment tester si une requête mysql comprend des résultats ? J'ai essayé de faire un "mysql_num_rows == 0" mais ça fonctionne pas...
C'est correct comme méthode ou y'a plus simple ?

Reply

Marsh Posté le 30-11-2008 à 20:27:13    

montre ton code, ça doit fonctionner...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-11-2008 à 20:31:21    

Code :
  1. $sql = mysql_query("SELECT * FROM ".$mysql_prefix."accounts WHERE login = ".$login."" );
  2. $samelogin = mysql_num_rows($sql);
  3. if ($samelogin == 0) {
  4. //il n'y a pas de pseudo semblable


 
Voila la partie importante du code...  
Il ne bloque pas dessus et valide mon inscription même si j'utilise le même pseudo (identique minuscule et majuscule comprises)... [:agla]
 
Je comprends pas...

Reply

Marsh Posté le 30-11-2008 à 20:36:00    

euh, elle est valide ta requête là? Ton login c'est une chaine de caractères, et tu le met pas entre quotes...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-11-2008 à 20:41:16    

J'ai pas compris...Oui oui elle est valide, tout fonctionne a merveille ! A part qu'il me laisse m'inscrire avec un pseudo déja existant dans ma base de données...
$login c'est le login que le mec qui veut s'inscrire utilise. Je fais donc une requête dans "accounts" avec ce login, pour voir si il y a des résultats...
login sans quotes c'est le nom du champ dans ma base de données. J'ai jamais utilisé de quotes dans mes requetes pour les noms des champs, et ça fonctionne  :??: ...
J'ai une base accounts qui contient:
id login password ...etc
Et je fais une requête dessus avec le login que le mec veut utiliser pour son inscription ! Et moi je veux l'envoyer bouler si ce pseudo existe déjà...
Bon pour faire simple, je veux faire une requête sur ma table, et voir si il y a des résultats. Comment je fais ?

Message cité 1 fois
Message édité par garfunk71 le 30-11-2008 à 20:43:38
Reply

Marsh Posté le 30-11-2008 à 20:44:53    

garfunk71 a écrit :

J'ai pas compris...
$login c'est le login que le mec qui veut s'inscrire utilise. Je fais donc une requête dans "accounts" avec ce login, pour voir si il y a des résultats...
login sans quotes c'est le nom du champ dans ma base de données. J'ai jamais utilisé de quotes dans mes requetes pour les noms des champs, et ça fonctionne  :??: ...
J'ai une base accounts qui contient:
id login password ...etc
Et je fais une requête dessus avec le login que le mec veut utiliser pour son inscription ! Et moi je veux l'envoyer bouler si ce pseudo existe déjà...
Bon pour faire simple, je veux faire une requête sur ma table, et voir si il y a des résultats. Comment je fais ?


non, ce que je veux dire c'est que

Code :
  1. "SELECT * FROM ".$mysql_prefix."accounts WHERE login = ".$login.""


ça donne

Citation :

SELECT * FROM ton_prefixe_accounts WHERE login = leloginsaisi

 

Ceci n'est pas une requête sql valide, leloginsaisi devrait être entre quotes, ie 'leloginsaisi'


Message édité par skeye le 30-11-2008 à 20:45:18

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-11-2008 à 20:44:53   

Reply

Marsh Posté le 30-11-2008 à 20:51:44    

Ah oui !! En effet j'ai merdé sur ce coup-là..
Ca fonctionne maintenant...Je me sens con. Désolé :$ et encore merci


Message édité par garfunk71 le 30-11-2008 à 20:51:55
Reply

Marsh Posté le 30-11-2008 à 22:53:26    

Au passage, je te conseille si tu ne connais pas de jeter un oeil àla fonction mysql_real_escape_string, voire aux requêtes préparées, si tu as accès à mysqli ou PDO.


Message édité par skeye le 30-11-2008 à 22:53:32

---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed