Php mysql pdo espace membre pseudo déjà pris

Résolu/Fermé
Utilisateur anonyme - Modifié par ziczic1 le 10/05/2015 à 10:26
 Utilisateur anonyme - 10 mai 2015 à 12:53
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 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705
Modifié par jordane45 le 10/05/2015 à 11:17
Bonjour
tu as oublié d'inclure ta connexion à la bdd ..


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

.
Cordialement,
Jordane
2
Utilisateur anonyme
10 mai 2015 à 11:44
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 mardi 12 mars 2013 Statut Membre Dernière intervention 28 octobre 2021 57
10 mai 2015 à 12:02
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 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705
10 mai 2015 à 12:05
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
10 mai 2015 à 12:20
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 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705
10 mai 2015 à 12:24
$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
10 mai 2015 à 12:26
Super j'essaye ça tout de suite, merci
0
jordane45 Messages postés 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705 > Utilisateur anonyme
10 mai 2015 à 12:28
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
10 mai 2015 à 12:33
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
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 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705
10 mai 2015 à 12:43
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
10 mai 2015 à 12:53
Super ça marche !! Merci beaucoup pour tous tes conseils !!
0