Passage au PDO...

Eléphant du PHP | 58 Messages

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?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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é ^^


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 58 Messages

20 nov. 2011, 20:29

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

Eléphant du PHP | 58 Messages

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