Php mysql pdo espace membre pseudo déjà pris [Résolu/Fermé]

-
Bonjour,

Je suis en train de créer un petit espace membre pour mon site et j'en suis à la page inscription.php ( je suis en local avec WAMP ).

Je voudrais vérifier si le pseudo rentré par l'utilisateur n'est pas déjà pris mais une erreur s'affiche une fois que j'ai rentré un pseudo et un mot de passe :

Notice: Undefined variable: bdd in C:\wamp\www\tests\Site internet\Bazar\Essai 1\register.php on line 33

Fatal error: Call to a member function query() on a non-object in C:\wamp\www\tests\Site internet\Bazar\Essai 1\register.php on line 33

Voici le code d'inscription.php simplifié :

<?php include ("cnx.php");
//démarrage de la session
session_start(); ?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>

<body>
<h2> Formulaire d'inscription : </h2>

<form action="" method = "POST">
<label for="pseudo"> pseudo (4 à 20 caractères !) : </label> </br>
<input type="texte" name = "pseudo" /> </br>

<label for="password"> Password : </label> </br>
<input type="password" name = "password" /> </br>

<input type="submit" value ="Inscription" />
</form>

<?php

// On vérifie que le formulaire à été complété et si les champs ne sont pas vides
if ( isset($_POST) && (!empty($_POST['pseudo'])) && (!empty($_POST['password'])) )
{
//On met le résultat pseudo du formulaire dans $pseudo
$pseudo = addslashes($_POST["pseudo"]) ;

//On sélectionne dans la table 'utilisateurs' les pseudo qui sont les mêmes que le pseudo tapé dans le formulaire
$query = $bdd->query("SELECT pseudo FROM utilisateurs WHERE pseudo = '$pseudo'");

//On compte le nombre de réponse
$count = $query->rowCount();

//Dans le cas où il y a une réponse, qu'un pseudo dans la table correspont au pseudo tapé
if($count == 1)
{
// Pseudo déjà utilisé
echo 'Ce pseudo est déjà utilisé';
}

else
{
// Pseudo libre, on l'insère dans la table
mysql_query("INSERT INTO utilisateurs (pseudo) VALUE ('$pseudo')");
}
}

?>


</body>
</html>


Quelqu'un a-t-il une idée de l'erreur que j'ai faite ? Merci
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
26145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 août 2019
1764
2
Merci
Bonjour
tu as oublié d'inclure ta connexion à la bdd ..


Edit : l'include y est ... mais que contient il ?

.
Cordialement,
Jordane

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 59239 internautes nous ont dit merci ce mois-ci

Utilisateur anonyme -
Merci pour ta réponse ! La connexion à la bdd c'est cnx.php

<?php 	

// Connexion à la base de données
try
{
$cnx = new PDO('mysql:host=localhost;dbname=dunce;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}

?>
ReDLoG
Messages postés
245
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
10 mars 2019
50 -
Bonjour,
Si tu utilises PDO alors tu ne peux pas utiliser mysql_query()
else {
   // Pseudo libre, on l'insère dans la table
   mysql_query("INSERT INTO utilisateurs (pseudo) VALUE ('$pseudo')"); 
 }

D'autre part ce n'est pas :
catch(Exception $e)

mais :
catch(PDOException $e)

Cordialement.
Messages postés
26145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 août 2019
1764
0
Merci
Déjà, tu feras attention.. tu as encore un bout avec l'ancienne extension MYSQL
else 
 { 
  // Pseudo libre, on l'insère dans la table
  mysql_query("INSERT INTO utilisateurs (pseudo) VALUE ('$pseudo')"); 
 } 


Il faudra la passer en PDO également....

Ensuite... ta connexion à la BDD est mise dans $CNX .... hors toi.. tu as cherché à utiliser
$BDD .... ???!
 $query = $bdd->query("SELECT pseudo FROM utilisateurs WHERE pseudo = '$pseudo'"); 
 


Donc soit tu renommes ta variables dans le QUERY .. soit dans ta CONNEXION.

PS : Au passage... prends l'habitude de sortir la requête de son exécution... cela permet d'en faire un ECHO si besoin.

     $sql = "SELECT pseudo FROM utilisateurs WHERE pseudo = '$pseudo'"
     // echo $sql;  // si besoin pour boir ce qu'elle contient...
 $query = $cnx->query($sql); 
 

0
Merci
Merci pour vos conseils !

J'ai mis $cnx au lieu de $bdd

Quel est l'équivalent de
else {
// Pseudo libre, on l'insère dans la table
mysql_query("INSERT INTO utilisateurs (pseudo) VALUE ('$pseudo')");
}
avec PDO ? Merci
Messages postés
26145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 août 2019
1764
0
Merci
$sql ="INSERT INTO utilisateurs (pseudo) VALUE ('$pseudo')";
     // echo $sql;  // si besoin pour boir ce qu'elle contient...
 $query = $cnx->exec($sql);


Mais l'ideal serait de passer par les requête préparées pour limiter les risques d'injection SQL..
Par exemple :

 $sql ="INSERT INTO utilisateurs (pseudo) VALUE (:pseudo)";
 $params = array(":pseudo"=>$pseudo);
 $query = $cnx->prepare($sql);
 $result =  $query->execute($params);
Utilisateur anonyme -
Super j'essaye ça tout de suite, merci
jordane45
Messages postés
26145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 août 2019
1764 > Utilisateur anonyme -
Sachant que les requête préparées fonctionnent pour TOUS les types de requêtes ( INSERT / UPDATE / DELETE ..)
Perso je les utilises partout. ( et jamais ->query ).

Pour comprendre le PREPARE .. je t'invite à lire ceci :
http://php.net/manual/fr/pdo.prepare.php
Utilisateur anonyme -
J'ai du me trompé quelque part ^^ il n'y a plus de message d'erreur mais quand je test en tapant un pseudo déjà utilisé il me l'enregistre quand même :/
0
Merci
Voici mon nouveau code, merci beaucoup de m'aider :-)

<?php include ("cnx.php");
//démarrage de la session
session_start(); ?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
 </head>

 <body>
  <h2> Formulaire d'inscription : </h2>

  <form action="" method = "POST">
   <label for="pseudo"> pseudo : </label> </br>
   <input type="texte" name = "pseudo" /> </br>
 
   <label for="password"> Password : </label> </br>
   <input type="password" name = "password" /> </br>
 
   <input type="submit" value ="Inscription" />
  </form> 
 
<?php

// On vérifie que le formulaire à été complété et si les champs ne sont pas vides
if ( isset($_POST) && (!empty($_POST['pseudo'])) && (!empty($_POST['password'])) )
{
 //On met le résultat pseudo du formulaire dans $pseudo
 $pseudo = addslashes($_POST["pseudo"]) ;
 
 //On sélectionne dans la table 'utilisateurs' les pseudo qui sont les mêmes que le pseudo tapé dans le formulaire
 $query = $cnx->query("SELECT pseudo FROM utilisateurs WHERE pseudo = '$pseudo'"); 
 
 //On compte le nombre de réponse
 $count = $query->rowCount();
 
 //Dans le cas où il y a une réponse, qu'un pseudo dans la table correspont au pseudo tapé
 if($count == 1) 
 { 
  // Pseudo déjà utilisé 
  echo 'Ce pseudo est déjà utilisé'; 
 } 

 else 
 { 
  $sql ="INSERT INTO utilisateurs (pseudo) VALUE (:pseudo)";
   $params = array(":pseudo"=>$pseudo);
   $query = $cnx->prepare($sql);
   $result =  $query->execute($params); 
   echo 'Vous êtes enregistré !';
 } 
}

?>  
 
 
 </body>
</html>


EDIT : AJout du langage dans les balises de code
Messages postés
26145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 août 2019
1764
0
Merci
Ton souci est surement du à ta ligne
 $count = $query->rowCount();


Pour info (voici ce que dit la documentation) :

Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête.
Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.



Pour ma part je ferais un truc du genre :

 //On sélectionne dans la table 'utilisateurs' les pseudo qui sont les mêmes que le pseudo tapé dans le formulaire

//préparation de la requête 
$params = array(":pseudo"=>$pseudo);
$sql = "SELECT pseudo FROM utilisateurs 
         WHERE pseudo = :pseudo" ;


// execution de la requete 
$query = $cnx->prepare($sql);
$query->execute($params);

//Récupère tous les résultats dans un ARRAY
$result = $query->fetchAll();


$nbResult = count($result);

if($nbResult==1){

  //....




Utilisateur anonyme -
Super ça marche !! Merci beaucoup pour tous tes conseils !!