Passage au PDO...

Eléphant du PHP | 58 Messages

18 nov. 2011, 16:27

Bonjour, :)

j'utilisais MySQL pour mon espace membre tout marché parfaitement et j'ai décider de passer au PDO, malheureusement j'ai des petit problème sur quelque ligne de codes qui génère des erreurs :(

J'ai modifié ma page inscription.php, et tout fonctionne bien, les informations s'enregistre dans ma base de donnée et je reçois l’émail avec mon lien pour l'activation! :D

Mais quand je clique sur ce lien mon compte s'active pas :(

Dans ma base table j'ai un champs de type " enum('0','1') " et il veut pas passer de la valeur 0 à 1, je pense c'est quand je fais ma requête préparé que ça bloque et pour récupérer les valeurs dans un tableau

Page activation-compte.php

 // il y a du code avant

 // 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 =:id
				    AND Clef_Activation =:clef');
         $query->bindValue(':id',$_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é
               if($query->rowcount() == 0)
               {
                    header("Location: index.php");
               }
               else
               {
                    
                    // Récupération du tableau de données retourné
                    $row = $query->fetch(PDO::FETCH_ASSOC);
					
                    
                    // 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é";
                    }
                    else
                    {
                         
                         // Activation du compte utilisateur
                        						 						 
	 $query=$db->prepare('UPDATE  Comptes_Utilisateurs
                                         SET Compte_Active = :enum
			                WHERE id=:id	
                                        AND Clef_Activation=:clef						 
					 ');
	 $query->bindValue(':enum', 1, PDO::PARAM_INT);
	  $query->bindValue(':id', $_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
                         {
                              $message = "Félicitation, votre compte utilisateur a été correctement activé, connectez-vous";
                         }
                         
                    }
                    
               }
// il y a du code apres

Merci, greg

ViPHP
xTG
ViPHP | 7331 Messages

19 nov. 2011, 11:27

Tu as activé les erreurs PDO ?
C'est peut être un problème de cast, il me semble que l'enum n'est pas considéré comme un int mais comme une String sous MySQL.

Eléphant du PHP | 58 Messages

19 nov. 2011, 12:32

:wink: Oui j'ai activé les erreur PDO comme ça:
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
// du code
// du code...
$query->CloseCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
Quand je dis que mon code ne met pas à jour la ligne, je parle que dans la base de donnée du champ "Compte_Active" vu c'est un enum('0','1') quand l'inscription reussi il a la valeur 0 logique vu qu'il faut que la personne qui s'inscrit l'active, donc,
Quand je reçois l’émail d'activation du compte,

h...//localhost/activer-compte-utilisateur.php?id=10&clef=c0136789

j'ai ce lien ci-dessus, quand je clique ça ouvre la page "activer-compte-utilisateur.php" et si tout se passe bien sa exécute le code et dans mon champs "Compte_Active" le ENUM prend la valeur 1!

et du coup vu je passe à PDO je change tout en requête préparé et là le ENUM prend pas la valeur 1, mais ça m’écris bien que mon compte a était activé,
donc mon code cloche quelque part, je pense au enum et je ne vois pas comment faire... :(


Voila ma page activer-compte-utilisateur.php en entier:
<?php
session_start();
try
{
include("include/connexionpdo.inc.php");
// Redirige l'utilisateur s'il est déjà identifié
if(isset($_SESSION['id']))
{
     header("Location: page_membre.php");
}
else
{
     
     // Vérifie que de bonnes valeurs sont passées en paramètres
     if(!preg_match("/^[0-9]+$/", $_GET["id"]) || !preg_match("/^[a-f0-9]{8}$/", strtolower($_GET["clef"])))
     {
          header("Location: page_membre.php");
     }
     else
     {
          
          // Connexion à la base de données
                             
          	  	  
     $query=$db->prepare('SELECT id, Compte_Active, Clef_Activation
                                    FROM Comptes_Utilisateurs
		                     WHERE id =:id
				   AND Clef_Activation =:clef');
            $query->bindValue(':id',$_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é
               if($query->fetch()== 0)
               {
                    header("Location: index.php");
               }
               else
               {
                    
                    // 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é";
                    }
                    else
                    {
                         
                         // Activation du compte utilisateur
                        						 						 
			 $query=$db->prepare('UPDATE  Comptes_Utilisateurs
                                                        SET Compte_Active = :enum
                                                       WHERE id=:id   
                                                       AND Clef_Activation=:clef                                                
                                                          ');
                         $query->bindValue(':enum', 1, PDO::PARAM_INT);
                         $query->bindValue(':id', $_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
                         {
                              $message = "Félicitation, votre compte utilisateur a été correctement activé, connectez-vous";
                         }
                         
                    }
                    
               }
               
          }
                             
     }
     
}

          
$titre = " Activation de votre compte";
include("include/debut-xhtml.inc.php");
?>
<div class="espacemembre">

<?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 = :automatique');
		$query->bindValue(':automatique',$_COOKIE['connexion_automatique'], PDO::PARAM_STR);
                $query->execute();
					  
					           // Récupération des données hash cookie,id, nom utilisateur
							   
					            $row=$query->fetchall();
					           					    
					

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

<h2>Page d'activation</h2>

<p><?php echo $message; ?></p>

</div>


                                                          <!-- footer -->
<div id="pied_de_page">
<p>© 2011 Tous droits réservés.</p>
</div>
</body>
</html>
Modifié en dernier par spedgreg le 19 nov. 2011, 13:20, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

19 nov. 2011, 13:15

Donc pas d'erreur, une requête qui s'exécute correctement du fait du message. On peut donc penser que l'update ne touche aucun n-uplet.
Vérifies la correspondance de la clé avec celle dans la table ainsi que l'id.

Eléphant du PHP | 58 Messages

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é";
                    }

ViPHP
xTG
ViPHP | 7331 Messages

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. :)

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

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

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

Eléphant du PHP | 58 Messages

19 nov. 2011, 14:28

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

Eléphant du PHP | 58 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

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');

Eléphant du PHP | 58 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

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

Eléphant du PHP | 58 Messages

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? :?

ViPHP
xTG
ViPHP | 7331 Messages

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

Eléphant du PHP | 58 Messages

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 !!!!