Problème avec une requête préparé...

Invité
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 11:04

Bonjour a tous!!! tite embrouille qui m'donne mal à la tête j'vous explique... :) J'ai récupéré un tuto pour faire la connexion à un compte client mais j'ai dus l'adapter pour être en PDO et quand j'ai modifié mes requête c'est là que ca s'est mis a déconner... Alors le symptome est que lorsque je tape un email existant il ne l'enregistre pas dans la base comme convenu mais par contre il m'envois vers ma redirection quand meme au lieu d'afficher le message disant "Cet email est déjà utilisé". J'pense que c'est ma requête INSERT INTO qui est pas bonne car j'ai lu qu'elle devrait retourner true si elle s'est bien déroulé et là j'ai l'impression qu'elle retourne rien du tout :( bouh!
<?php
  /*************************************************************************/
 /*** Création du compte client à partir de l'email et d'un mot de pass
/*************************************************************************/

// Initialisation du message de réponse
$message = null;



if (isset($_POST['email'])) 
{

	// Vos identifiants
	$email = (isset($_POST['email']) && trim($_POST['email']) != '')? Verif_magicquotes($_POST['email']) : null;

	$password = (isset($_POST['password']) && trim($_POST['password']) != '')? Verif_magicquotes($_POST['password']) : null;

	
	
	
	
	
    // Si $email et $password est déjà présent dans la base
    if (isset($email,$password)) 
    {




		$reponse = $bdd->prepare("
								SELECT COUNT(email)
								AS nb_entrees
								FROM membres
								WHERE email = :email
								");
		$reponse->execute(array(
								'email' => $email
								));
		$resultat = $reponse->fetch();

	
echo $resultat['nb_entrees'];


        if ($resultat['nb_entrees'] == 0) 
        {
		 
		// Insertion à l'aide d'une requête préparée
		$req = $bdd->prepare("
							INSERT INTO membres 
							VALUES('', :email, :password)
							");
		$req->execute(array(
							'email' => $email,
							'password' => $password
							));
	 
		$verif = $req->fetch();
        
            if ($verif == true)
            {

                 $_SESSION['email'] = $email;

            	header("Location: ../../templates/pages/etape6_recapitulatif.php");
				exit();

			}   


			
        }
        else
        {
             $message = 'Cet email est déjà utilisé, changez-le.';
        }
    }
    else 
    {
         $message = 'Les champs "email" et "Mot de passe" doivent être remplis.';
    }
}
?>

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 11:26

tu devrais utiliser l'attribut UNIQUE sur ton champs mysql, ca te ferait qu'une seule requête a exécuter :wink:

Mammouth du PHP | 672 Messages

01 avr. 2010, 11:37

Bonjour.

A priori, si l'email existe déjà dans la table, tu n'éxécutes pas ta requête INSERT (d'ailleurs, tu le dis toi-même :roll: )
Le problème ne vient donc pas de là...

Il manque la partie gérant l'affichage, donc on va supposer que l'erreur est dans cette partie de code, et on part de l'erreur pour remonter à la cause.

Tu t'attends à passer dans $message = 'Cet email est déjà utilisé, changez-le.' et tu arrives sur le header(...)
Donc le if ($resultat['nb_entrees'] == 0) ne te branche pas au bon endroit.
Donc, c'est que $resultat['nb_entrees'] est à 0 alors qu'il devrait être à 1 (ou plus).

Tu fais un echo $resultat['nb_entrees']; Ca te donne bien 1 quand l'email existe déjà ?

Invité
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 17:01

Alors MacGawel ta bien trouvé ou ca allait pas effectivement mon COUNT affiche rien, pourtant j'y suis arrivé a un moment a compter grace à une requete avec le PDO mais j'ai changé jsais pas quoi et depuis j'arrive à rien, arf! :|
C'était pourtant tellement simple ya deux jours avec mysql... J'arrive meme plus à faire une simple requete, c'est pourtant bon ca :
		// Compter à l'aide d'une requête préparée
		$reponse = $bdd->prepare("
								SELECT COUNT(*)
								AS nb_entrees
								FROM bouilleusers
								WHERE nom = :nom
								");
		$reponse->execute(array(
								'nom' => $nom
								));
		$resultat = $reponse->fetch();

		
		
echo $resultat['nb_entrees'];
Et pour répondre à Stealth35 je ne connais pas l'attribut UNIQUE tu n'aurais pas un lien vers un cour pour que je puisse savoir l'utiliser parce que j'ai regardé la doc et c'est toujours autant le flou pour moi :?

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 17:04

c'est un attribute de champs pour mysql, comme tu dirais INDEX, ou PRIMARY KEY
http://dev.mysql.com/doc/refman/5.0/fr/ ... y-key.html

Mammouth du PHP | 985 Messages

01 avr. 2010, 17:09

Sinon quand tu as juste un élément à insérer tu peux utiliser: bindParam au lieu d'un array().
Le tableau étant surtout pratique quand il y a plusieurs éléments, comme toujours d'ailleurs.

Regarde par exemple dans les commentaires de cette page:
http://php.net/manual/fr/pdo.prepare.php

Pour info, il y a plusieurs syntaxes possible, regarde les deux exemples du manuel de la page ci-dessus aussi :)

(Personellement je trouve la deuxième plus simple, mais bon ceci est juste mon avis personnel)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 17:13

la 2eme est plus simple (mon avis aussi), mais la 1er ne prend pas en compte l'ordre et ca c'est pratique :wink:

Mammouth du PHP | 985 Messages

01 avr. 2010, 17:17

Et aussi, encore juste pour info, regarde fetch_style, ici:
http://www.php.net/manual/fr/pdostatement.fetch.php

C'est pratique aussi pour récupérer que ce que tu as besoin et/ou comment :)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Invité
Invité n'ayant pas de compte PHPfrance

02 avr. 2010, 11:57

Bon j'ai regardé les liens que vous m'avez donné et du coup j'ai repris les révisions. Alors c'est repartis j'continu à bien avancer sur le nouveau http://www.MABOUILLE.COM. Par contre j'ai bien l'impression que pour le SELECT COUNT il n'existe plus en PDO car on dirait qu'il est remplacé par count() à partir d'un SELECT qui est d'ailleur à mon sens plus logique car le SELECT COUNT avait plutot tendance à m'agacer avec le AS qui désignait une variable.... Enfin voilà mon count() péparé pour ceux que ca intéresse :wink: ...
				$reponse = $bdd->prepare("
						SELECT email
						FROM membres
						WHERE email = :email
						");
				$reponse->execute(array(
						'email' => $email
						));
				
				$reponse->setFetchMode(PDO::FETCH_OBJ);


				$reponse->execute();
				$array = $reponse->fetchALL();
				$nb_entrees = count($array);