Passage au PDO...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Passage au PDO...

RESOLU Passage au PDO...

par spedgreg » 21 nov. 2011, 01:39

:D :D :D :D yesss !!

Après 2h de réflexion j'ai réussi ma page activer-compte-utilisateur.php , désormais mon espace membre est 100% passé à PDO

Voila le résultat réussi de la page acti.... pour ceux qui sont dans le même cas que moi :lol:
if(isset($_SESSION['id']))
{
     header("Location: page_membre.php");
}
else
{ 
        $iddd = $_GET["id"];
        $clefff = $_GET["clef"];
     // Vérifie que de bonnes valeurs sont passées en paramètres
     if(!preg_match("/^[0-9]+$/", $iddd) || !preg_match("/^[a-f0-9]{8}$/", strtolower($clefff)))
     {
          header("Location: page_membre.php");
     }
     else
     { 
       
          // Connexion à la base de données
                include("include/connexionpdo.inc.php");
				$q = array('id'=>$iddd,'Clef_Activation'=>$clefff);               				
		                $dba = 'SELECT id, Clef_Activation				                     
                                            FROM Comptes_Utilisateurs		                            								
					     WHERE id =:id
					   AND Clef_Activation =:Clef_Activation
					  ';
				$query = $db->prepare($dba);											
                               $query->execute($q);
		        	  
          
          // Si une erreur survient
          if(!$query)
          {
               $message = "Une erreur est survenue lors de l'activation de votre compte utilisateur";
          }
          else
          {
               
               // Si aucun enregistrement n'est trouvé
			   
			   
			   $data = $query->rowCount($dba);
			  
               if($data == 1)
               {
                             $v=array('id'=>$iddd,'Compte_Active'=>'1');
				   $dba = 'SELECT id, Compte_Active				                     
                                    FROM Comptes_Utilisateurs		                            								
				     WHERE id =:id
				     AND Compte_Active =:Compte_Active
				      ';
				   $query = $db->prepare($dba);											
                                   $query->execute($v);
				   $dejactif = $query->rowCount($dba);
				   
				   if($dejactif == 1)
				   {
				    $message = "Votre compte utilisateur a déjà été activé";
				   }
				   else
				   {
				   $u=array('id'=>$iddd,'Compte_Active'=>'1');
				   $dba = 'UPDATE Comptes_Utilisateurs
                                                SET Compte_Active =:Compte_Active					                             		                            								
						WHERE id=:id                                      
							';
				   $query = $db->prepare($dba);											
                                   $query->execute($u);
				   $message = "Félicitation, votre compte utilisateur a été correctement activé, connectez-vous";
				   				   			   
				    }
				   
				   
                          }
			   else
			   {
			      header("Location: index.php");
                            }
                   
                    
           }
               
      }
                             
}         


Merci xTG et moogli de votre aide

Re: Passage au PDO...

par spedgreg » 20 nov. 2011, 20:29

Grrr j'arrive pas à appliquer en code ce que tu me dis :( pourtant tu l’explique facilement :roll:

Re: Passage au PDO...

par moogli » 20 nov. 2011, 20:02

en fait cle truc c'est qu'a priori tu récupère des infos qui sont inutile. utilise le count de sql pour savoir si cela est déja fait !

exemple select count(id) as nb from comptes_utilisateurs where la condition qui va bien;

tu récupère nb et que tu regarde si égale à 0 si ce n'est pas le cas déjà activé si c'est le cas à activer.

mais bon si tu a un champ qui indique actif ou pas autant directement sélectionner le champs et vérifier sa valeur qui t'indiquera simplement et directement si le compte à déjà été activé ^^


@+

Re: Passage au PDO...

par spedgreg » 20 nov. 2011, 18:33

Il reste toujours un dernier petit probleme :(

sur ma page activer-compte-utilisateur.php

Lors de de la validation de l'inscription je reçois bien l’émail avec le lien d'activation quand je clique sur ce dernier ça dois activé le compte donc le ENUM passe de 0 à 1 et si exemple je re-clique sur ce lien ça doit me dire que mon compte a été déjà activé!

Mais avec avec l’évolution vers PDO le code fait à sa tête :shock:

c'est le PDOStatement::rowCount() qui me pose des problèmes on dit que PDOStatement::rowCount() retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE

mais là, ma requête est un SELECT donc comment faire ? :?

voila mon ancien code avec mysql:
// Sélection de l'utilisateur concerné
          $result = mysql_query("
               SELECT id
                    , Compte_Active
                    , Clef_Activation
               FROM Comptes_Utilisateurs
               WHERE id = '" . mysql_real_escape_string($_GET["id"]) . "'
               AND Clef_Activation = '" . mysql_real_escape_string(strtolower($_GET["clef"])) . "'
          ");
		  
          
          // Si une erreur survient
          if(!$result)
          {
               $message = "Une erreur est survenue lors de l'activation de votre compte utilisateur";
          }
          else
          {
               
               // Si aucun enregistrement n'est trouvé
               if(mysql_num_rows($result) == 0)
               {
                    header("Location: index.php");
               }
               else
               {
                    
                    // Récupération du tableau de données retourné
                    $row = mysql_fetch_array($result);
					
                    
                    // Vérification que le compte ne soit pas déjà activé
                    if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }
et avec PDO:
 // Connexion à la base de données
                include("include/connexionpdo.inc.php");                	  	  
		        $query=$db->prepare('SELECT id, Compte_Active, Clef_Activation
                                    FROM Comptes_Utilisateurs		                            								
				   WHERE id =:idd
				  AND Clef_Activation =:clef
							');
                $query->bindValue(':idd',strtolower($_GET["id"]), PDO::PARAM_INT);
		$query->bindValue(':clef',strtolower($_GET["clef"]), PDO::PARAM_STR);			
                $query->execute();
		        	  
          
          // Si une erreur survient
          if(!$query)
          {
               $message = "Une erreur est survenue lors de l'activation de votre compte utilisateur";
          }
          else
          {
               
               // Si aucun enregistrement n'est trouvé
			   
			   
			  $row = $query->rowCount(); 
			  
               if($row == 0)
               {
                    header("Location: index.php");
               }
			   
               else
               {
                    
                    // Récupération du tableau de données retourné
                    
				if (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false )
				 {
					
                    
                    // Vérification que le compte ne soit pas déjà activé
                      if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }
				  }


Donc là si je reste dans cette dernier configuration en cliquant sur mon lien d'activation rien ne se passe:

mais si je met
$row = $query->fetch(); 
à la place de
$row = $query->rowCount(); 
Mon compte s'active bien et j'ai bien le message de confirmation qu'il est bien activé, mais si je viens a re-cliqué sur mon lien d'activation j'ai toujours le message de confirmation qu'il est bien activé.

mais si je remet
$row = $query->rowCount();
à la place de
$row = $query->fetch()
j'ai bien mon message
 $message = "Votre compte utilisateur a déjà été activé";
Donc je suis un peu perdu avec les retours de tableau comment codé pour que sa fonctionne positivement?

Re: Passage au PDO...

par spedgreg » 20 nov. 2011, 15:03

Bon pour ce qui est de ma connexion auto c'est OK j'ai reussi :)

Exact tu avais raison ma requête SQL porté sur le mot de passe et nom d'utilisateur !!! j'avais mal codé ma requête #-o


Voila mon ancien code connexion.inc.php avec MySQL:
 $result = mysql_query("
                    SELECT id, Nom_Utilisateur, Mot_de_Passe, Compte_Active, hash_cookie
                    FROM Comptes_Utilisateurs
                    WHERE Nom_Utilisateur = '" .mysql_real_escape_string($username). "'
              
                    

Et ma transformation avec PDO qui était fausse:
 $query=$db->prepare('SELECT id, Nom_Utilisateur, Mot_de_Passe, Compte_Active, hash_cookie
                                    FROM Comptes_Utilisateurs 
	                            WHERE Mot_de_Passe =:passe 
				    AND Nom_Utilisateur =:user');
                                       									
			   $query->bindValue(':user',$username, PDO::PARAM_STR);					
			   $query->bindValue(':passe',sha1($password), PDO::PARAM_STR);			   
                           $query->execute();
               	 

Merci !!!!

Re: Passage au PDO...

par xTG » 19 nov. 2011, 21:16

Le problème dont tu parles est le même avec les fonctions mysql. La requête ne renvoie aucun enregistrement en cas de mauvais mot de passe ou pseudo. Donc c'est tout le temps le message "nom d'utilisateur" qui apparait.
La transformation du code avec PDO n'a pas apporté ce problème, il était déjà présent. ;)

Ta requête SQL ne doit pas porter sur le mot de passe, elle doit rechercher uniquement le nom d'utilisateur (et renvoyer le mot de passe par contre).
Ensuite si la requête ne renvoie pas de résultat => nom d'utilisateur incorrect
Sinon tu parcours les résultats renvoyés (généralement il n'y en a qu'un sauf si plusieurs membres peuvent porter le même nom d'utilisateur mais c'est bizarre...) et si aucun mot de passe ne correspond => mot de passe incorrect

Re: Passage au PDO...

par spedgreg » 19 nov. 2011, 20:34

Grrr j'aurais du resté avec l'extension MySQL car tout marché parfaitement mais bon en passant à PDO j'aurais pas pensé autant de problème et vu je suis débutant c'est dur a réaliser ce qu'on me dis même en lisant des tuto sur différent sites... :(

tu me dis :
ta requête possède une clause WHERE sur le pseudo ET le password... Donc mauvais password = aucun résultat = rowCount() ==0 => le message d'erreur en question


j'ai pas trop bien compris donc je dois mettre quoi à la place:
 if($query->rowcount()  == 0)
                    {
                         $message = "Le nom d'utilisateur " . $username . " n'existe pas";
                    }
avant avec Mysql :
if(mysql_num_rows($result) == 0)
                    {
                         $message = "Le nom d'utilisateur " . $username . " n'existe pas";
                    }

et pour la connexion de que ligne tu parle? :?

Re: Passage au PDO...

par xTG » 19 nov. 2011, 19:37

Pour le message c'est tout à fait normal, ta requête possède une clause WHERE sur le pseudo ET le password... Donc mauvais password = aucun résultat = rowCount() ==0 => le message d'erreur en question

Pour ta connexion automatique j'ai pas tout lu, mais déjà tu compares le pseudo enregistré à une variable nommé hash... Comment un hash pourrait-il être égal à un pseudo ? ^^

Re: Passage au PDO...

par spedgreg » 19 nov. 2011, 19:33

Exact bien vu :wink: pour le SELECT , une erreur de moins :)

mais bon il est pas encore au point mon code grrrrr :(

j’arrive bien me connecté si je rentre les bonne valeurs speudo et mot de passe et si exemple je me trompe de mot de passe ça me marque le message:
$message = "Le nom d'utilisateur " . $username . " n'existe pas";
au lieu de
$message = "Votre mot de passe est incorrect";
Voila l'image ci dessous plus explicative

Image

Donc c'est les $query->fetch(PDO::FETCH_ASSOC) , $query->rowcount(), etc qui doit poser problème voila la partie de mon code:

page connexion.inc.php
  $query=$db->prepare('SELECT id, Nom_Utilisateur, Mot_de_Passe, Compte_Active, hash_cookie
                                    FROM Comptes_Utilisateurs 
	                                WHERE Nom_Utilisateur = ? AND Mot_de_Passe = ?');
               
               $query->execute(array($username, sha1($password)));
               
			   
			     
               // Si une erreur survient
               if(!$query)
               {
                    $message = "Une erreur est survenue lors de la tentative de connexion";
               }
               else
               {
			   			          
                  		   
				     
                    // Si aucun utilisateur n'a été trouvé
                    if($query->rowcount()  == 0)
                    {
                         $message = "Le nom d'utilisateur " . $username . " n'existe pas";
                    }
				   
                    else
                    {
                                                						 
                      if (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false )
				      {  
                         // Si le compte n'a pas été activé
                         if($row['Compte_Active'] == 0)
                         {
                              $message = "Votre compte utilisateur n'a pas été activé";
                         }
					   	 
                         else
                         {
                            
                              // Vérification du mot de passe
                               if(sha1($password) != $row["Mot_de_Passe"])
                              {
                                   $message = "Votre mot de passe est incorrect";
                              }
							   // Vérification du hash
                               elseif (sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc') != $row["hash_cookie"])
                              {
                                   $message = "Votre compte utilisateur a été bloqué par securité, contactez nous";
                              }	
							  						  							 							  							  							  
                              else
                              {
							    					  												
                                   // Création des sessions
								   
								   $_SESSION['id']=$row["id"];
                                   $_SESSION['id_nom']=$row["Nom_Utilisateur"];
							   
								   	if (!empty($_POST['CB_Connexion_Automatique']))   // si l'utiliseur coche connexion auto 
									{	
																	                                         
						            
                                        // Création des cookies connexion auto
                                        $connexion = sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc');
                                      setcookie('connexion_automatique', $connexion, time() + 3600*24*365, '/');									   
			                         
				  }
							   
					// Redirection de l'utilisateur
				  header("Location: /page_membre.php");
                        }                             					  							   
							
                   }      								                                    								                                                                                                                                                                                                      						                                                                                          
              }
                         
       }


Et pour ce qui est de ma deuxième erreur c'est pour ma connexion auto si je rentre mon vrai pseudo et mot de passe en cochant la connexion auto j'arrive bien me connecter le cookie s'enregistre bien mais quand je reviens sur mon site je suis déco et pourtant mon cookie est toujours enregistré donc ça doit merder sur ma page index.php.

la partie de code de ma page index.php
<?php
try
{		   
include("include/connexionpdo.inc.php");			   
 if(!empty($_COOKIE['connexion_automatique']))
{ 
                                // Sélection de l'utilisateur concerné						
         					
					 $query=$db->prepare('SELECT id, Nom_Utilisateur, Mot_de_Passe, hash_cookie
                                    FROM Comptes_Utilisateurs 
	                                WHERE Nom_Utilisateur = :automatique');
					$query->bindValue(':automatique',$_COOKIE['connexion_automatique'], PDO::PARAM_STR);
                    $query->execute();
            if (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false )
            {
				           					    					

						// comparaison positive hash base de donée avec la connexion auto
			     if($row["hash_cookie"] == $_COOKIE['connexion_automatique'])
                {
				$_SESSION['id']=$row["id"];
                $_SESSION['id_nom']=$row["Nom_Utilisateur"];
                }				
					
				// comparaison negative hash base de donée avec la connexion auto
				if($row["hash_cookie"] != $_COOKIE['connexion_automatique'])
				{								
				setcookie("connexion_automatique", "", time() - 3600, "/");			    
				}	
             }   				
         
}		 				 		               
if(!empty($_SESSION['id'])) {

?>
<p class="deconnexion">
         
		   
     <strong>[ <?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?> ]</strong>
	  <a href="deconnexion.php">Déconnexion</a></p><hr />
	  	  
	<p><img src="image/control.gif" alt="espace membre" title="espace membre" /><a class="accueil" href="page_membre.php">-Espace utilisateur</a></p>
	<p><img src="image/poster-annonce.png" alt="poster annonce" title="poster annonce" /><a class="accueil" href="poster-annonce.php">-Poster une annonce</a></p>

<?php } else 

{ 
    
    require "include/connexion.inc.php";
			
}
?>


</div>	

                                                      <!-- corps -->
<?php												  
require "include/compteurconnectes.inc.php";
$query->CloseCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>	



:) Voila j'ai tout expliqué facilement donc vu que mon code marché avant de passer à PDO c'est avec les $query->fetch etc qui pose probleme

Re: Passage au PDO...

par xTG » 19 nov. 2011, 17:10

//On echape les variables pour pouvoir les mettre dans une requette SQL
                                $username =htmlspecialchars($_POST['TB_Nom_Utilisateur']);
                                $password =htmlspecialchars($_POST['TB_Mot_de_Passe']);
C'est le rôle de mysql_real_escape_string() (les requêtes préparées le font automatiquement, sinon il y a la fonction PDO::quote) de faire cela, et il le fait bien mieux. ;)

Pour l'erreur SQL tu as oublié le SELECT :
// Sélection de l'utilisateur concerné                                               
                                               
                                         $query=$db->prepare('id, Nom_Utilisateur, Mot_de_Passe, hash_cookie
                                                                         FROM Comptes_Utilisateurs
                                                                        WHERE Nom_Utilisateur = :connexion_automatique');

Re: Passage au PDO...

par spedgreg » 19 nov. 2011, 16:14

Cool ma page activer-compte-utilisateur.php fonctionne :D

Mais....

maintenant c'est ma page connexion.inc.php qui me posse des soucie.... :(

cette page est une include et elle s’intègre dans ma page index.php

Exemple de ma page index.php
http://files.getwebb.org/files/67/f8/4 ... urce.jpeg

quand je me connecte sans cocher sur "Rester connecté(e)" ça fonctionne je suis bien redirigé sur ma page_membre.php

Et si je me connecte en cochant "Rester connecté(e)" je suis redirigé sur ma page_membre.php avec cette erreur :



Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id, Nom_Utilisateur, Mot_de_Passe, hash_cookie ' at line 1


de plus si exemple je me trompe de mot de passe ça m’écris que "Le nom d'utilisateur n'existe pas" au lieu de m’écrire cette ligne:
$message = "Votre mot de passe est incorrect"
Voila ma page connexion.inc.php
<?php
	
// Redirige l'utilisateur s'il est déjà identifié
if(isset($_SESSION['id']))
{
     header("Location: /page_membre.php");
}
else
{
     
     // Formulaire visible par défaut
     $masquer_formulaire = false;
     
     // Une fois le formulaire envoyé
     if(isset($_POST["BT_Envoyer"]))
     {
          
          // Vérification de la validité des champs
          if(!preg_match("/^[A-Za-z0-99ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ_]{4,20}$/", $_POST["TB_Nom_Utilisateur"]))
          {
               $message = "Votre nom d'utilisateur doit comporter entre 4 et 20 caractères \n";
               $message .= "L'utilisation de l'underscore est autorisée";
          }
          elseif(!preg_match("/^[A-Za-z0-9]{6,}$/", $_POST["TB_Mot_de_Passe"]))
          {
               $message = "Votre mot de passe doit comporter au moins 6 caractères";
          }
          else
          {
		  //On echape les variables pour pouvoir les mettre dans une requette SQL
				$username =htmlspecialchars($_POST['TB_Nom_Utilisateur']);
				$password =htmlspecialchars($_POST['TB_Mot_de_Passe']);
				
										  	 			           
               // Connexion à la base de données                                         
               // Sélection de l'utilisateur concerné
              			   
			   $query=$db->prepare('SELECT id, Nom_Utilisateur, Mot_de_Passe, Compte_Active, hash_cookie
                                                           FROM Comptes_Utilisateurs 
	                                                   WHERE Nom_Utilisateur= ? AND Mot_de_Passe = ?
                                                           ');
               
                          $query->execute(array($username, sha1($password)));
               
			   
			     
               // Si une erreur survient
               if(!$query)
               {
                    $message = "Une erreur est survenue lors de la tentative de connexion";
               }
               else
               {
			   			          
                  		   
				     
                    // Si aucun utilisateur n'a été trouvé
                    if($query->rowcount()  == 0)
                    {
                         $message = "Le nom d'utilisateur " . $username . " n'existe pas";
                    }
				   
                    else
                    {
                                                						 
                     if (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false )
		     {  
                         // Si le compte n'a pas été activé
                         if($row['Compte_Active'] == 0)
                         {
                              $message = "Votre compte utilisateur n'a pas été activé";
                         }
					   	 
                         else
                         {
                            
                              // Vérification du mot de passe
                               if(sha1($password) != $row["Mot_de_Passe"])
                              {
                                   $message = "Votre mot de passe est incorrect";
                              }
							   // Vérification du hash
                               elseif (sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc') != $row["hash_cookie"])
                              {
                                   $message = "Votre compte utilisateur a été bloqué par securité, contactez nous";
                              }	
							  						  							 							  							  							  
                              else
                              {
							    					  												
                                   // Création des sessions
								   
				   $_SESSION['id']=$row["id"];
                                   $_SESSION['id_nom']=$row["Nom_Utilisateur"];
							   
				  if (!empty($_POST['CB_Connexion_Automatique']))   // si l'utiliseur coche connexion auto 
				{	
																	                                         
						            
                                        // Création des cookies connexion auto
                                        $connexion = sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc');
                                      setcookie('connexion_automatique', $connexion, time() + 3600*24*365, '/');									   
			                         
				  }
							   
					// Redirection de l'utilisateur
					header("Location: /page_membre.php");
                                                             					  							   
			     }
                           }      								                                    								                                                                                                                                                                                                      						                                                                                          
                        }
                         
                    }
                    
            }
                                                          
        }
          
    }
     
}


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<body>
                                                <!-- formulaire connexion --> 
<h3 class="connexion">Se connecter</h3><hr />
<p class="inscrire" ><a href="creer-compte-utilisateur.php" alt="s'inscrire" title="s'inscrire">S'inscrire</a></p><hr />

<form id="monform" action="http://<?php echo htmlspecialchars($_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]); ?>" method="post">
     <div class="center">
          <label for="username">Pseudo :</label><input type="text" name="TB_Nom_Utilisateur" size="35" maxlength="20" id="username" value="<?php if(isset($username)){echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8');} ?>" /><br />
     
     
         <label for="password">Mot de passe : </label><input type="password" name="TB_Mot_de_Passe" size="35" maxlength="40" id="password" /><br /><br />
     
 
          <input type="checkbox" name="CB_Connexion_Automatique" />Rester connecté(e)&nbsp;&nbsp;&nbsp;<input type="submit" name="BT_Envoyer" value="OK" />

<?php if(isset($message)) { ?>		  
		  
<p class="rouge"><?php echo htmlspecialchars($message); ?></p>
<?php } if($masquer_formulaire != true) { ?>
     </div>
</form>

                                                          <!-- footer -->
<?php }
?>

</body>
</html>
Et ma page_membre.php
<?php
session_start();
if(!isset($_SESSION['id']))
{
     header("Location:index.php");
}
$titre = " Espace membre";
include("include/debut-xhtml.inc.php");	
?>
                                                                <!-- espace membre -->
<div class="espacemembre">
<?php
try
{
include("include/connexionpdo.inc.php");
 if(!empty($_COOKIE['connexion_automatique']))
{ 
                                // Sélection de l'utilisateur concerné						
         					
					 $query=$db->prepare('id, Nom_Utilisateur, Mot_de_Passe, hash_cookie
                                                                         FROM Comptes_Utilisateurs 
	                                                                WHERE Nom_Utilisateur = :connexion_automatique');
				       $query->bindValue(':connexion_automatique',$_COOKIE['connexion_automatique'], PDO::PARAM_STR);
                                       $query->execute();
                                       $query->rowcount();
					
				           					    
					

						// comparaison positive hash base de donée avec la connexion auto
		        if($row["hash_cookie"] == $_COOKIE['connexion_automatique'])
                        {
				$_SESSION['id']=$row["id"];
                               $_SESSION['id_nom']=$row["Nom_Utilisateur"];
                          }				
					
				// comparaison negative hash base de donée avec la connexion auto
				if($row["hash_cookie"] != $_COOKIE['connexion_automatique'])
				{								
				setcookie("connexion_automatique", "", time() - 3600, "/");			    
				}	
                      				
}			 				 		               

if(!empty($_SESSION['id'])) {
?>
<p class="deconnexion">
         		   
      <strong>[ <?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?> ]</strong>
	  <a href="deconnexion.php">Déconnexion</a></p><hr />
	  	  
	<p><img src="image/control.gif" alt="espace membre" title="espace membre" /><a class="accueil" href="page_membre.php">-Espace utilisateur</a></p>
	<p><img src="image/poster-annonce.png" alt="poster annonce" title="poster annonce" /><a class="accueil" href="poster-annonce.php">-Poster une annonce</a></p>
	

	 

<?php } else 

{ 
    
    require "include/connexion.inc.php";
			
}
?>

</div>	
                                                                   <!-- corps -->

<?php												  
require "include/compteurconnectes.inc.php";
$query->CloseCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>																	   
<h2>Espace utilisateur</h2>

    <p>
        Bienvenue, <?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>.  
    </p>
	
	
</div>
                                                          <!-- footer -->

<div id="pied_de_page">
<p>© Tous droits réservés</p>
</div>
</body>
</html>



ps: tout fonctionner avant de passer à PDO

Re: Passage au PDO...

par spedgreg » 19 nov. 2011, 14:28

Merci beaucoup pour ces infos qui mon éclaircie, je vais modifier cela et je vous tiendrais au courant :D

Re: Passage au PDO...

par moogli » 19 nov. 2011, 14:19

salut,

utilise var_dump() pour debugger et tu verra que "$row" est vide.

pourquoi ?
<?php
// Si aucun enregistrement n'est trouvé
               if($query->fetch()== 0) // <= la tu demande le jeux de résultat
               {
                    header("Location: index.php");
               }
               else
               {
                   
                    // Récupération du tableau de données retourné
                    $row = $query->fetch(); // <= la tu recommence à demander un jeux de résultat
                    // Vérification que le compte ne soit pas déjà activé
                    if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }
?>
tu fait donc appel deux fois à fetch() or cette fonction avance a chaque appel dans le jeux de résultat et tu ne peux avoir qu'un résultat, si non c'est le merdier dans ta base :)

de plus fetch() ne peux retourner zéro, c'est soit false, soit un tableau, un objet etc donc le 1er test n'est pas cohérent

il devrait être ainsi
<?php
if (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false ){
 if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }
}
else {
// affichage d'un message d'erreur propre
}
?>
pour le message d'erreur utilise PDOStatement::errorInfo

@+

Re: Passage au PDO...

par xTG » 19 nov. 2011, 14:09

Et quel est ton casse tête ? Car les deux écritures reviennent au même et donnent le même résultat. :)

Re: Passage au PDO...

par spedgreg » 19 nov. 2011, 13:42

Ah c'est bon le ENUM est passé à 1 dans ma base de donnée quand je clique sur le lien, le problème était là:
$query->bindValue(':enum', 1, PDO::PARAM_STR);
j'avais mis:

PDO::PARAM_INT au lieu de PDO::PARAM_STR

Mais bon maintenant j'ai encore un casse tête :?

Si exemple la personne re-clique sur son lien dans l'e_mail ça doit lui écrire Votre compte utilisateur a déjà été activé donc sa cloche là:
  
                    // Récupération du tableau de données retourné
                    $row = $query->fetch();
					
                    
                    // Vérification que le compte ne soit pas déjà activé
                    if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }


Je m’embrouille avec les Récupération de tableau en PDO :(

Avant avec l'extension mysql s’était comme ça :

// Récupération du tableau de données retourné
                    $row = mysql_fetch_array($result);
					
                    
                    // Vérification que le compte ne soit pas déjà activé
                    if($row["Compte_Active"] != 0)
                    {
                         $message = "Votre compte utilisateur a déjà été activé";
                    }