mon script marche sur Mozilla mais pas sur iE : /

Eléphant du PHP | 101 Messages

27 janv. 2006, 23:30

Bonsoir le peuple : x

J'explique le fonctionnement.. l'utilisateur s'inscrit, j'envois un email à la fin de son inscription afin qu'il puisse la valider en cliquant sur un lien de la forme http://.../index.php?email=[email protected]&temp=a3hc65jGU2EH1HD
où temp est une sorte de mot de passe aléatoire que j'ai créé

en cliquant sur le lien il se retrouve sur mon index?email=.....&temp=..... je compare le temp de ma base de donnée et le $_GET['temp'] et ça affiche "votre compte vient d'être activé" (sauf erreur de $_GET['temp']) ensuite ça efface le temp et ça passe le compte en "valide" ça c'est ok

après tout le reste ça marche pas sur iE
si je reclique sur le lien de validation ça doit afficher "votre compte est déjà activé."
et mon mini formulaire pseudo/pass iE il le prend pas en considération si je clique sur l'image OK il devrait marquer "Veuillez saisir votre Login." alors qu'il ne fait rien.. et quand je rentre mon login/pass il recharge la page sans rien faire ni afficher aucun message d'erreur
alors que j'arrive à me loguer sur Mozilla : /

voici mon code:
<?php
$host = "localhost";
$user = "root";
$password = "";
$bdd = "mysql";

$email = isset($_GET['email']) ? trim($_GET['email']) : "" ;
$temp = isset($_GET['temp']) ? trim($_GET['temp']) : "" ;
$login = isset($_POST['login']) ? trim($_POST['login']) : "" ;
$pass = isset($_POST['pass']) ? trim($_POST['pass']) : "" ;

// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {

        // on teste si le champ login est vide
        if (empty($login)) {
            $erreur = 'Veuillez saisir votre Login.<br>';
        }
        // on teste les caractères du champ Login
        elseif(!preg_match('`^[[:alnum:]-_.]{6,15}$`', $login))  {
            $erreur = 'Votre Login doit comporter<br>6 caractères minimum.';
        }
        // on teste si le champ pass est vide
        elseif (empty($pass)) {
            $erreur = 'Veuillez saisir votre Pass.<br>';
        }
        // on teste les caractères du champ Pass
        elseif(!preg_match('`^[[:alnum:]-_.]{6,15}$`', $pass)) {
            $erreur = 'Votre Pass doit comporter<br>6 caractères minimum.';
        }
		
else {

        $connect = mysql_connect($host, $user, $password);
        mysql_select_db($bdd, $connect) or die("Impossible de se connecter à la base de donnee $bdd");
        
        // on teste si une entrée de la base contient ce couple login / pass
        $sqlloginpass = 'SELECT count(*) FROM membre WHERE login="'.addslashes($_POST['login']).'" AND pass_md5="'.md5(addslashes($_POST['pass'])).'"';
        $reqloginpass = mysql_query($sqlloginpass) or die('Erreur SQL !<br />'.$sqlloginpass.'<br />'.mysql_error());
        $dataloginpass = mysql_fetch_array($reqloginpass);
        
        mysql_free_result($reqloginpass);
        mysql_close();
        
        // si on obtient une réponse, alors l'utilisateur est un membre
        if ($dataloginpass[0] == 1) {
            session_start();
            $_SESSION['login'] = $_POST['login'];
            header('Location: membre.php');
            exit();
        }
        // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
        elseif ($dataloginpass[0] == 0) {
            $erreur = 'Ce compte n\'existe pas.<br>Vérifiez votre Pseudo et votre Pass.';
        }

    }

}

if ($email != NULL) {

            $connect = mysql_connect($host, $user, $password);
            mysql_select_db($bdd, $connect) or die("Impossible de se connecter à la base de donnee $bdd");
            			
			// on recherche la valeur du champ Confirm spécifique à l email
			$confirmsql = 'SELECT confirm FROM membre WHERE email="'.addslashes($email).'"';
            $confirmreq = mysql_query($confirmsql) or die('Erreur SQL !<br />'.$confirmsql.'<br />'.mysql_error());
            $confirmdata = mysql_fetch_array($confirmreq);
			// on recherche le temp spécifique à l email
            $tempsql = 'SELECT temp FROM membre WHERE email="'.addslashes($email).'"';
            $tempreq = mysql_query($tempsql) or die('Erreur SQL !<br />'.$tempsql.'<br />'.mysql_error());
            $tempdata = mysql_fetch_array($tempreq);

			//on teste si le compte est déjà validé
			if ($confirmdata[0] == "valide") {
				$erreur="Votre Compte est déjà activé.<br>";
            }		
			//on teste les deux clefs d'activation
			elseif ($tempdata[0] != $temp) {
				$erreur="Impossibilité d'activer votre Compte.<br /> Reportez-vous à la F.A.Q<br>";
            }
			//si la clef d activation est bonne on update le compte en "valide" et effacement du champ temp
            elseif ($temp != NULL AND $tempdata[0] == $temp) {
				$sql = 'UPDATE membre SET confirm="valide",temp="" WHERE email="'.addslashes($email).'"';
                mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
				mysql_close();

				$erreur="Votre Compte vient d'être activé.<br>";
			}

}
?>
iE il doit pas aimer ma logique... c'est mes conditions else if qui merdent ? si vous pouviez me donner un peu de logique dans tout ça : (
Modifié en dernier par - HXSS - le 28 janv. 2006, 15:58, modifié 2 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 janv. 2006, 23:40

iE il le prend pas en considération si je clique sur l'image OK
attention il faut récupérer les coordonnées du clic pour les boutons de type image !!

il faut donc tester
if(isset($_POST['bouton_x']))
avec le nom du bouton suivi de "_x" ou "_y"

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

28 janv. 2006, 01:33

Pouah le truc bateau :x

2 jours que je tourne en rond comme un chien battu nez marre de perdre du temps : |
bon par contre j'ai pas trop compris le fait de reprendre les coordonnées j'ai cherchouillé sur Google et jsuis tombé sur un topic où le gars avait le même soucis.. en créant un champ caché "connexion" ça à l'air de fonctionner : /

jsais pas si c'est la meilleure façon mais bon... sinon dans l'ensemble mon code il est correct ? j'ai changé la syntaxe de fin, je teste si le compte est déjà activé et s'il l'est pas je teste les temp etc

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 janv. 2006, 15:45

bon par contre j'ai pas trop compris le fait de reprendre les coordonnées
Ce n'est pas compliqué, tout se fait pratiquement seul :wink:

si tu as un bouton image:
<input type="image" name="bimage" value="" src="" />
tu n'auras rien de plus à faire que d'ajouter "_x" à l'indice de la variable POST:
$var=$_POST['bimage_x'] // car $_POST['bimage'] n'est pas crée pour ce type d'input
C’est donc l'abscisse du clic par rapport à l'image qui est récupérer pour la vérification de la pression sur le bouton.
sinon dans l'ensemble mon code il est correct ?

en diagonale ça à l'air correct, mais j'ai pas tout regardé... j'aime pas du code PHP entre balises

Code : Tout sélectionner

:sick:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

28 janv. 2006, 17:04

Youkay ça marche : )

par contre j'ai dû remplacer
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
par
if (isset($_POST['connexion_x']) == 'Connexion') {
du coup jme demande à quoi ça sert de mettre && $_POST['connexion'] == ...
mais bon ça à la limite... jme demande surtout si mon truc c'est sécurisé, parce que à mon avis ça l'est pas du tout : O
surtout au niveau des variables passées par l'url

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 janv. 2006, 17:39

if (isset($_POST['connexion_x']) == 'Connexion') {
du coup jme demande à quoi ça sert de mettre && $_POST['connexion'] == ...
eh bien en principe ça sert pour verifier si le contenu est bien celui attendu.

Dans ton test tu peux même supprimer le "== 'Connexion'" ça n'as pas de sens comme ça.

Tu test le retour de isset() donc un booléen avec une chaine de caratères !!

si le retour de isset est faux alors le test est faux (idem pour true).

En ce qui concerne la sécurité, eh bien si tu teste justement les valeurs qui sont transmises avant d'effectuer des opération il n'y a pas de problème.

Tu peux toujours passer les variables GET en POST par des champs cachées mais celà n'empèche pas la verification des variables POST.

Ici tu fait 2 requetes sur la meme table, c'est inutile:

supprime:
     // on recherche le temp spécifique à l email
            $tempsql = 'SELECT temp FROM membre WHERE email="'.addslashes($email).'"';
$tempreq = mysql_query($tempsql) or die('Erreur SQL !<br />'.$tempsql.'<br />'.mysql_error());
$tempdata = mysql_fetch_array($tempreq); [/php]
par une seule requete en séléctinnant les 2 champs voulus:
$confirmsql = 'SELECT confirm,temp FROM membre WHERE email="'.addslashes($email).'"';
et tu as la valeur de temp dans:
$confirmdata[1]
[/php]

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

28 janv. 2006, 19:30

Merci pour la requête ! je savais qu'on pouvait faire comme ça mais j'arrivais pas à récupérer la valeur pour mes tests... : s

sinon j'ai rajouté des expressions régulières pour savoir si l'email est bien un email et pas autre chose et si la clef d'activation est valide, si tout est ok je me connecte à ma base de donnée et je compare ... je pense que tout est bon : |