Php mysql pdo espace membre pseudo déjà pris

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
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
A voir également:

6 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour
tu as oublié d'inclure ta connexion à la bdd ..


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

.
Cordialement,
Jordane
2
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());
}

?>
0
ReDLoG Messages postés 243 Date d'inscription   Statut Membre Dernière intervention   57
 
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.
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Utilisateur anonyme
 
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
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
$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);
0
Utilisateur anonyme
 
Super j'essaye ça tout de suite, merci
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > 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 :
https://www.php.net/manual/fr/pdo.prepare.php
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
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
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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){

  //....




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