Page 1 sur 2

Trouvez l'erreur :)

Posté : 31 oct. 2011, 21:45
par besoin_daide
Bonjour alors voila, j'ai presque terminé mon site web,les scripts php etc..mais problème,lorsque j'essaye de m'inscrire pour tester si ca marche ou non:

Lorsque je clic sur le lien d'activation il m'affiche: erreur:pas de code de confirmation(message que j'ai crée dans la page confirm.php)

page d'inscription:
<?php
session_start();

//$_SESSION['mail']=$_POST['mail'];
//$_SESSION['passwd']=$_POST['passwd'];
//$_SESSION['ville']=$_POST['ville'];


$mail = htmlentities($_POST['mail']);
$nom_site = "";
$email_admin = "[email protected]";



		
		  
		  // on teste l'existence de nos variables. On teste également si elles ne sont pas vides //
		   if (( empty($_POST['login'])) || (empty($_POST['passwd'])) || (empty($_POST['passwdc'])) || ( empty($_POST['ville'])) || (empty($_POST['mail']))) 

			{
				echo 'Un ou plusieurs champs ne sont pas remplis, <a href="javascript:history.back(1)">Retour au formulaire</a>';
				exit();
 			}
			 elseif ((!empty($_POST['login'])) && (!empty($_POST['passwd'])) && (!empty($_POST['passwdc'])) && (!empty($_POST['ville'])) && (!empty($_POST['mail']))) 

			 {
            $base = mysql_connect ('confident') or die('Erreur de connexion '.mysql_error());
		    mysql_select_db('',$base)  or die('Erreur de selection '.mysql_error()); 
             
             // on recherche si ce login est déjà utilisé par un autre membre
             $sql = 'SELECT count(*) FROM pdf_membre WHERE login="'.mysql_real_escape_string($_POST['login']).'"'; 
             $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
             $data = mysql_fetch_array($req); 
     
             if ($data[0] > 0)  
         
			 { 
			 
                echo 'Un membre possède déjà ce login ==>  <a href="javascript:history.back(1)">Retour au formulaire</a>'; 
		exit();
             } 
          }
			
			
			/*if*/if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $mail)) //Verifie que l'email entrée n'est pas une fausse.
    {
		$chaine = "abcdefghijklmnopqrstuvwxyz0123456789"; 
		$confirm = str_shuffle($chaine); //On créé le code de confirmation
		
 	       
		
		$login = htmlentities($_POST['login']); //On recupère les infos
		$passwd = htmlentities($_POST['passwd']);
		$passwdc = htmlentities($_POST['passwdc']);
		$ville = htmlentities($_POST['ville']);
		
		

		mysql_query("INSERT INTO pdf_membre (id) VALUES (' ')") or die(mysql_error());;
		$id = mysql_query("SELECT LAST_INSERT_ID() FROM pdf_membre") or die(mysql_error());
		
		

		/*On Fait la variable contenant le mail de confirmation*/
	
		$message1 = '<html><body>Bonjour ' . $login . ' et bienvenue sur ' .$nom_site. '.</br>'; 
		$message1 .= '</br>';
		$message1 .= 'Vous venez de vous inscrire et nous sommes heureux<br>de pouvoir vous compter aujourd\'hui parmi nos membres.<br>'; 
		$message1 .= 'Voici un rappel de vos identifiants, notez les précieusement : <br>';
		$message1 .= 'Votre Pseudo :' . $login .'.<br>';
		$message1 .= 'Votre Mot de passe:' . $passwd .'.<br><br>';
		$message1 .= 'Votre Mail:' . $mail .'.<br><br>';
		$message1 .= 'Votre Ville:' . $ville .'.<br><br>';									
		$message1 .= 'Si vous souhaitez changer vos informations, rendez-vous dans votre compte pour les mettre à jour.<br>';
		$message1 .= 'Votre Clé d\'activation:<br>';
   		$message1 .= 'www....fr/confirm.php?id=' . str_replace(' ','%20',$id) . '&confirm=' . $confirm . '<br><br>';
		$message1 .= 'A très bientôt sur le site!<br>L\'équipe de ' .$nom_site. '.<br><a href="www....fr">' .$nom_site. '</a>';


		
		$verification = mysql_query("SELECT COUNT(*) FROM pdf_membre WHERE login='$login' OR mail='$mail'") or die (mysql_error());
		$donnees = mysql_fetch_array($verification)or die (mysql_error());
		

	
		
	


		
			if( $passwd != $passwdc) //On verifie que les 2 pass sont identiques
			{
				echo 'Les mots de passe ne sont pas identiques ==> <a href="javascript:history.back(1)">Retour au formulaire</a>';
			}
			else //Si tout est bon on entre la clé(les données )dans la BDD et on envoye le mail
			{
				
			mysql_query("INSERT INTO pdf_membre (confirm) VALUES ('$confirm')") or exit(mysql_error());  
	
				//mysql_query("INSERT INTO pdf_membre (id,login,passwd,mail,ville) VALUES ('','$login', '$passwd', '$mail', '$ville')");
				//mysql_query("INSERT INTO pdf_membre (confirm) VALUES ('$confirm')");
				echo 'Bravo, vous êtes maintenant inscrit sur ' .$nom_site. '. <br>Vous allez recevoir un e-mail pour activer votre compte. <br><a href="/index.php">Retour à l\'Accueil</a>';
				$entete = "MIME-Version: 1.0\r\n";
				$entete .= "Content-type: text/html; charset=iso-8859-1\r\n";
				$entete .= "From: <$email_admin>\r\n";
				$entete .= "Reply-To: $email_admin\r\n";
				mail($mail,'Bienvenue sur ' .$nom_site. ' ' . $login .'.' , $message1, $entete);
			}
		}
		

		else
		{ echo ' L\'adresse email entrée n\'existe pas ==> <a href="javascript:history.back(1)">Retour au formulaire</a>';}
		

		 mysql_close($base);  //On se deconnecte
	




?>

<html>
<body>

<!-- On affiche la reponse de tout le code du dessus -->
</body>
</html>





et voici ma page de confirmation:
<?php
session_start();



//on verifie si les variables ne sont pas vides
if (!isset($_GET['id']))//si le login  n'existe pas...
{
 echo 'erreur: pas id fourni';
 exit();
}
if ( !isset($_GET['confirm']) )
{
 echo 'erreur: pas de code de confirmation';
 exit();
} 

$base = mysql_connect ('') or die('Erreur de connexion '.mysql_error());
mysql_select_db('',$base)  or die('Erreur de selection '.mysql_error()); 

// Récupération des variables nécessaires à l'activation
$id = mysql_real_escape_string($_GET['id']);
$cle =  mysql_real_escape_string($_GET['confirm']);
$reponse = mysql_query ("SELECT actif FROM pdf_membre WHERE id =' $id' ") or exit(mysql_error()); //On recupère les infos à partir du pseudo $reponse = mysql_query ("SELECT * FROM pdf_membre WHERE login='$login'");//
$donnees = mysql_fetch_array ($reponse);
$actif = $donnees['actif'];


$reponse1 = mysql_query ("SELECT confirm FROM pdf_membre WHERE id =' $id' ") or exit(mysql_error()); //On recupère les infos à partir du pseudo $reponse = mysql_query ("SELECT * FROM pdf_membre WHERE login='$login'");//
$donnees = mysql_fetch_array ($reponse1);
$clebdd = $donnees['confirm'];



//Faut utiliser une variable session pour "appeler les variables ville mail et lautre"pour pouvoir les stocker
	
// Récupération de la clé correspondant au $login dans la base de données

/*$stmt = $base->prepare("SELECT confirm,actif FROM pdf_membre WHERE login like :login ");

if($stmt->execute(array(':login' => $login)) && $row = $stmt->fetch())
  {
    $clebdd = $row['confirm'];	// Récupération de la clé
    $actif = $row['actif']; // $actif contiendra alors 0 ou 1
  }
*/

//$sql = 'SELECT confirm,actif FROM pdf_membre WHERE login like %$login%'; 
$result = mysql_query("SELECT `confirm`,`actif` FROM `pdf_membre` WHERE `id` like '%$id%'") or exit(mysql_error());
$row= mysql_fetch_assoc($result);

if($result && $row)
{
      $clebdd = $row['confirm']; // Récupération de la clé 
      $actif = $row['actif'];  // $actif contiendra alors 0 ou 1 
     
}		
		
// On teste la valeur de la variable $actif récupéré dans la BDD
if($actif == '1') // Si le compte est déjà actif on prévient
  {
     echo "Votre compte est déjà actif !";
  }
else // Si ce n'est pas le cas on passe aux comparaisons
  {
     if($cle == $clebdd) // On compare nos deux clés	
       {
          // Si elles correspondent on active le compte !          // La requête qui va passer notre champ actif de 0 à 1 et on insert les données dans bdd
	$login =  mysql_real_escape_string($login); //On protege les infos
	$passwd = mysql_real_escape_string($passwd);
	$ville = mysql_real_escape_string($ville);
	$mail = mysql_real_escape_string($mail);
 	mysql_query("INSERT INTO pdf_membre (login,passwd,mail,ville) VALUES ('$login', '$passwd', '$mail', '$ville')") or exit(mysql_error());         

 mysql_query("UPDATE pdf_membre SET actif = 1 where id like '$id'");
	 echo "Votre compte a bien été activé !";
								
         /* $stmt = $base->prepare("UPDATE pdf_membre SET actif = 1 WHERE login like :login ");
	  
          $stmt->bindParam(':login', $login);
          $stmt->execute(); */
	 

       }
     else // Si les deux clés sont différentes on provoque une erreur...
       {
          echo "Erreur ! Votre compte ne peut être activé...";
       }
  }
  mysql_close($base);
  ?>
  
  <html>
<body>

<!-- On affiche la reponse de tout le code du dessus -->
</body>
</html>

mon but dans la confirmation est de faire passer les variables $confirm(la clé généré aleatoirement) et l'id du l'utilisateur(id primary key dans ma table)dans le lien d'activation(je les ai inséré dans ma table dans la page dinscription) afin de les recuperer grace a $get,puis verifier si l'utilisateur ne les a pas modifié dans la barre d'adresse en verifiant si ils sont semblables au couple id/clé de ma table

Re: Trouvez l'erreur :)

Posté : 31 oct. 2011, 21:51
par Ryle
Si tu as ce message d'erreur c'est que $_GET['confirm'] n'est pas définie, donc que dans ton url tu n'as pas d'attribut "confirm"

Vérifies donc l'url du lien que tu as suivi pour arriver sur cette page et rectifie le au besoin pour passer cette variable ;)

Re: Trouvez l'erreur :)

Posté : 31 oct. 2011, 21:56
par besoin_daide
c'est ca mon url:
  $message1 .= 'www....fr/confirm.php?id=' . str_replace(' ','%20',$id) . '&confirm=' . $confirm . '<br><br>';
je ne vois pas ou est l'erreur ???

Re: Trouvez l'erreur :)

Posté : 31 oct. 2011, 21:59
par Ryle
Nope, ça c'est ton code php... l'url c'est ce que tu as dans $message1 une fois que ton code a été exécuté ;)

Quand tu cliques sur le lien (ou que tu copies l'url) depuis ton mail, est-ce que dans la barre d'adresse du navigateur tu vois bien apparaitre ton attribut et sa valeur quand la page t'affiche ce message ?

Re: Trouvez l'erreur :)

Posté : 31 oct. 2011, 22:03
par besoin_daide

Re: Trouvez l'erreur :)

Posté : 31 oct. 2011, 22:59
par besoin_daide
quelque chose de ce genre

Re: Trouvez l'erreur :)

Posté : 01 nov. 2011, 09:48
par Ryle
Ben je réitère, si tu n'as pas le premier message, c'est que ta variable id est bien trouvée dans l'url. Si tu as le second c'est que confirm ne l'est pas.

Donc soit il n'est pas présent du tout dans l'url, soit ton url est mal constituée et il n'est pas considéré comme un attribut.. ou quelque chose de ce genre ... :?

Re: Trouvez l'erreur :)

Posté : 01 nov. 2011, 13:36
par besoin_daide
et dans ce cas,si il ne reconnait pas "l'attribut"qu' est-ce que je devrais faire?
pourquoi il ne le reconnait pas?alors que la clé est bien dans le lien ?
ca pourrait etre parce que $get ne fonctionne que lorsque un a fait un tableau avec method="get" dans la page precedente?

Re: Trouvez l'erreur :)

Posté : 01 nov. 2011, 15:26
par Ryle
Bonne question... faudrait voir l'url qui a véritablement été générée...

Comment ouvres-tu cette url ensuite ? un copier/coller du texte du mail dans ton navigateur ou un clic sur le lien dans le mail ?
Et dans ce dernier cas, quelle est l'url qui apparait dans ton navigateur (et si possible pas à "quelque chose près" :))

Re: Trouvez l'erreur :)

Posté : 01 nov. 2011, 18:26
par besoin_daide
non cest quelque chose de copié/collé, je n'arrive pas a faire de lien direct.
Ben ecoute je te laisse voir ca,essaye de t'inscrire dessus:www.anime-jap.fr tu verras ce que ca donne ;)

Re: Trouvez l'erreur :)

Posté : 01 nov. 2011, 21:00
par Ryle
Ayé, je suis inscrit et j'ai bien reçu le mail ! Et effectivement, le détail du "quelque chose du genre" était vachement important :)

Voici le lien reçu :

Code : Tout sélectionner

..../confirm.php?id=Resource%20id%20#3&confirm=d37v5o0ntfaplwbgkzmi89rcey2xjqsu6h41
Dans celui-ci tu peux voir que id ne contient pas un identifiant, mais une ressource sql (en fait tu as récupéré le résultat de l'exécution de la requête sans parcourir celui-ci pour en extraire le résultat)

En l'occurrence, ce "Resource id #3" colle dans ton url un "#" qui fait que php considère que l'url est terminée et que tout ce qui suit (donc le 3&confirm=d37...") est une ancre destiné à positionner l'ascenseur du navigateur sur la page générée (bref, un truc qui le concerne pas)

Si tu corriges la récupération de l'id créé, cela devrait résoudre ton problème :
$resultSet = mysql_query("SELECT LAST_INSERT_ID() FROM pdf_membre") or die(mysql_error());
$row = mysql_fetch_row($resultSet);
$id = $row[0];
ou plus simplement :
$id = mysql_insert_id();
Et puisqu'il s'agit d'un nombre, le "str_replace(' ','%20',$id)" ne sera plus utile.

Enfin, concernant ton lien, pour que celui-ci puisse être cliqué dans le mail, il te suffit simplement d'ajouter les balises <a href="..."></a> comme si tu faisais un lien dans une page html :)

Re: Trouvez l'erreur :)

Posté : 02 nov. 2011, 01:31
par besoin_daide
super merci !je n'ai plus le problème pour ca,bon maintenant, j'ai un autre problème, le message, erreur votre compte ne peut etre activé s'affiche -_-

Re: Trouvez l'erreur :)

Posté : 02 nov. 2011, 12:31
par besoin_daide
et si tu pouvais m'expliquer rapidement quand je dois me servir de mysql_real_scape_string,je n'ai pas bien compris,meri ;)

Re: Trouvez l'erreur :)

Posté : 02 nov. 2011, 15:10
par moogli
et si tu pouvais m'expliquer rapidement quand je dois me servir de mysql_real_scape_string,je n'ai pas bien compris,meri

c'est dans la doc, mais bon.

mysql_real_escape_string permet de 'protéger' une donnée que l'on va utiliser dans une requête sql ceci afin d'éviter les injections SQL (la faut demander à google :) ).

le message d'erreur c'est que if($cle == $clebdd) retourne false.

il faut que tu vérifie le contenu de ces deux variables avec var_dump();
var_dump($clef,$clebdd) pour vori ce que cela donne.

ta façon de faire est sujette a des soucis car il est possible de passer a travers tes contrôles et se retrouver avec des erreurs.

@+

Re: Trouvez l'erreur :)

Posté : 02 nov. 2011, 19:58
par besoin_daide
ok mais je met ou ce var duump?en debuut de code?