Veuillez vous connecter ou créer un compte pour suivre ce topic
Ce topic est suivi par: quiqou55
Ce topic a été résolu
Auteur Sujet: Accéder à la base de données dans une classe

TheFlameflo

Messages: 303

Salut !
Depuis peu, je me suis lancé dans la POO et j'ai fait un système d'inscription en POO à la place de procédural.
Mais un problème se pose.
Dans mes test pour tester la validité d'un membre à l'inscription, je ne comprend pas comment je dois faire la connexion à la BDD sans avoir à réécrire le code à chaque fois.
Pouvez-vous m'aider ?
<?php
class User
{
   private $pseudo;
   private $mail;
   private $mdp;
   private $droit;
   private $argent;
   private $argentRoyal;
   private $vie;
   private $vieMax;
   private $atk;
   private $atkMax;
   public $erreur;
   public function __construct($pseudo, $mail, $mail2, $mdp, $mdp2)
   {
      $this->pseudo = $pseudo;
      $this->mail = $mail;
      $this->mail2 = $mail2;
      $this->mdp = $mdp;
      $this->mdp2 = $mdp2;
   }
   public function checkPseudo($pseudo)
   {
      $pseudolength = strlen($pseudo);
      $reqpseudo = $bdd->prepare('SELECT * FROM membres m, WHERE pseudo = ?');
      $reqpseudo->execute(array($pseudo));
      $pseudoexist = $reqpseudo->rowCount();
      
      if($pseudolength <= 28 && $pseudoexist == 0)
      {
         return TRUE;
      }
      else
      {
         $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>'
      }
   }
   public function checkMail($mail,$mail2)
   {
      $reqmail = $bdd->prepare('SELECT * FROM `u820264992_flame`.`espace_membre` WHERE mail = ?');
      $reqmail->execute(array($mail));
      $mailexist = $reqmail->rowCount();
      
      if(filter_var($mail, FILTER_VALIDATE_EMAIL))
            {
      
      }
      else
      {
         $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>'
      }
   }
}
?>

Merci d'avance !
Publicité

Nobodief

Messages: 73

Bonjour,  tu dois globaliser ta variable bdd si elle est externe à la classe pour faire cela tu rajoute dans tes fonctions :
global $bdd;
Pour ton code cela devrais donner cela :

<?php
class User
{
   private $pseudo;
   private $mail;
   private $mdp;
   private $droit;
   private $argent;
   private $argentRoyal;
   private $vie;
   private $vieMax;
   private $atk;
   private $atkMax;
   public $erreur;
   public function __construct($pseudo, $mail, $mail2, $mdp, $mdp2)
   {
      $this->pseudo = $pseudo;
      $this->mail = $mail;
      $this->mail2 = $mail2;
      $this->mdp = $mdp;
      $this->mdp2 = $mdp2;
   }
   public function checkPseudo($pseudo)
   {
      global $bdd;
      $pseudolength = strlen($pseudo);
      $reqpseudo = $bdd->prepare('SELECT * FROM membres m, WHERE pseudo = ?');
      $reqpseudo->execute(array($pseudo));
      $pseudoexist = $reqpseudo->rowCount();
      
      if($pseudolength <= 28 && $pseudoexist == 0)
      {
         return TRUE;
      }
      else
      {
         $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>'
      }
   }
   public function checkMail($mail,$mail2)
   {
      global $bdd;
      $reqmail = $bdd->prepare('SELECT * FROM `u820264992_flame`.`espace_membre` WHERE mail = ?');
      $reqmail->execute(array($mail));
      $mailexist = $reqmail->rowCount();
      
      if(filter_var($mail, FILTER_VALIDATE_EMAIL))
            {
      
      }
      else
      {
         $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>'
      }
   }
}
?>
Et bien-sur tu dois inclure ton fichier de base de données avant celui de tes classes 

quiqou55

Messages: 23

   

quiqou55

Messages: 23

Salut, ce qu'as dit @santar sa fonctionnera mais en programmation orienté objet tu peut utiliser l'injection de dépendance qui permet de passer des instance au niveau du __construct()  donc ta classe perso je la créerais plutot comme ceci : 
<?php
    class User
    {
        protected $bdd;
        public function __construct(PDO $bdd)
        {
            $this->bdd = $bdd;
        }
        public function checkPseudo($pseudo)
        {
            $bdd = $this->bdd;
            $pseudolength = strlen($pseudo);
            $reqpseudo = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?');
            $reqpseudo->execute(array($pseudo));
            $pseudoexist = $reqpseudo->rowCount();
            
            if($pseudolength <= 28 && $pseudoexist == 0)
            {
                return true;
            }
            else
            {
                return false; // gére plutot l'erreur dans l'autre fihcier
            }
        }
        public function checkMail($mail,$mail2)
        {
            $reqmail = $bdd->prepare('SELECT * FROM membres WHERE mail = ?');
            $reqmail->execute(array($mail));
            $mailexist = $reqmail->rowCount();
            
            if(filter_var($mail, FILTER_VALIDATE_EMAIL))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
   // A partir d'ici c'est la page ou tu fais les appels Sourire 
   $bdd = new PDO("...");
   $user = new User($bdd);
   if($user->checkPseudo("pseudo")){
      if($user->checkMail("mail", "mail2"){
         // code php
      } else {
         /* code d'erreur */
      }
   } else { 
      /* CODE D'ERREUR */
    }
?>

Pour en savoir plus sur l'injection de dépendance en poo : https://youtu.be/SDDJmEUaFFM

TheFlameflo

Messages: 303

Salut !
Merci beaucoup de votre aide !
J'ai testé la méthode de @quiqou55 , mais, ça m'affiche une erreur :
Page d'inscription :
<?php
$titre = "Inscription";
include ('inc/config.php');
include ('class/user.php');
if(isset($_POST['inscription'], $_POST['pseudo'], $_POST['mail'], $_POST['mail2'], $_POST['mdp'], $_POST['mdp2'])){
$pseudo = htmlspecialchars($_POST['pseudo']);
$mail = htmlspecialchars($_POST['mail']);
$mail2 = htmlspecialchars($_POST['mail2']);
$mdp = sha1($_POST['mdp']);
$mdp2 = sha1($_POST['mdp2']);
$inscription = new User($bdd);
if($inscription->checkPseudo($pseudo))
   {
      if($inscription->checkMail($mail, $mail2))
      {
         if($inscription->checkMdp($mdp, $mdp2))
         {
            $inscription->insertUser($pseudo, $mail, $mdp);
         }
            else{
               $erreur = '<p style="color=red">Les deux mots de passes ne sont pas identiques ou le mot de passe est trop long ou trop court.</p>';
            }
      } else {
         $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>';
      }
   } else { 
      $erreur = '<p style="color=red">Veuillez entrer un pseudo de moins de 28 caractères et/ou qui n\'existe pas.</p>';
    }
}
include ('view/inscription.view.php');
?>
Page de vue (inscription) :
<?php include('inc/header.php'); ?>
<h2>Inscription</h2>
         <br /><br />
         <form method="POST" action="">
                <input type="text" placeholder="Votre pseudo" id="pseudo" name="pseudo" value="<?php if(isset($_POST['pseudo'])) { echo $_POST['pseudo']; } ?>" /></br>
            <input type="email" placeholder="Votre mail" id="mail" name="mail" value="<?php if(isset($_POST['mail'])) { echo $_POST['mail']; } ?>" /> </br>         
        <input type="email" placeholder="Confirmez votre mail" id="mail2" name="mail2" value="<?php if(isset($_POST['mail2'])) { echo $_POST['mail2']; } ?>" /> </br>            
        <input type="password" placeholder="Votre mot de passe" id="mdp" name="mdp" /></br>      
        <input type="password" placeholder="Confirmez votre mdp" id="mdp2" name="mdp2" /></br>
            <input  type="submit" name="inscription" value="Je m'inscris" />
         </form>
         <?php
         if(isset($erreur))
         {
            echo '<font color="red">'.$erreur."</font>";
         }
         ?>
<?php include('inc/footer.php'); ?>
Ma classe : 
<?php
class User
{
   private $pseudo;
   private $mail;
   private $mdp;
   private $droit;
   private $argent;
   private $argentRoyal;
   private $vie;
   private $vieMax;
   private $atk;
   private $atkMax;
   protected $bdd;
   public function __construct($bdd)
   {
      $this->bdd = $bdd;
   }
   public function checkPseudo($pseudo)
   {
      $pseudolength = strlen($pseudo);
      $reqpseudo = $bdd->prepare('SELECT * FROM membres, WHERE pseudo = ?');
      $reqpseudo->execute(array($pseudo));
      $pseudoexist = $reqpseudo->rowCount();
      
      if($pseudolength <= 28 && $pseudoexist == 0)
      {
         return TRUE;
      }
      else
      {
         return FALSE;
      }
   }
   public function checkMail($mail,$mail2)
   {
      $reqmail = $bdd->prepare('SELECT * FROM membres WHERE mail = ?');
      $reqmail->execute(array($mail));
      $mailexist = $reqmail->rowCount();
      
      if(filter_var($mail, FILTER_VALIDATE_EMAIL) && $mailexist == 0)
      {
         return TRUE;
      }
      else
      {
         return FALSE;
      }
   }
   public function checkMdp($mdp, $mdp2)
   {
   $mdp = sha1($mdp);
   $mdp2 = sha1($mdp2);
   $mdpLength = strlen($mdp);
   $mdp2Length = strlen($mdp2);
      if($mdp == $mdp2 && $mdpLength == $mdp2Length && $mdpLength <= 28 && $mdpLength >= 4 )
      {
         return TRUE;
      }
      else
      {
         return FALSE;
      }
      
   }
   public function insertUser($pseudo, $mail, $mdp)
   {
       $insertmbr = $bdd->prepare('INSERT INTO membres(pseudo, mail, mdp) VALUES(?, ?, ?)');
      $insertmbr->execute(array($pseudo, $mail, $mdp));
   }
}
?>
Ma page de configuration :
<?php
try
{
   $bdd = new PDO('mysql:host=localhost;dbname=spme;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?>
Voilà !
Et l'erreur c'est :

Notice: Undefined variable: bdd in C:\wamp\www\TestJeuDeCombat\class\user.php on line 24

Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\TestJeuDeCombat\class\user.php on line 24
Voilà !
Merci pour tout !
Si vous avez des questions sur mon code, n'hésitez pas ! Sourire

quiqou55

Messages: 23

A la ligne 22 dans ta classe User tu utilise la variable $bdd mais c'est $this->bdd que tu doit utiliser Sourire

Et les variables private(sauf bdd) du haut ne sont pas utilisé, tu dédie alors de l'espace sur le serveur pour rien car les variables private ne peuvent pas être utilisé hors de la classe Clin d'oeil

TheFlameflo

Messages: 303

Merci beaucoup !
En fait, c'est que les autres variables je compte les utiliser plus tard, je vais les mettre en public ! :)

Je vais laisser le sujet en non-résolu, car il y a 2-3 erreurs qui ne veulent pas partir (les checks indiquent toujours faux, etc).
Du coup, je vais revenir si je réussis à tout faire marcher pour mettre en résolu ! ^^'

quiqou55

Messages: 23

Re,
Dans le code de CheckMdp() tu vérifie la taille de ce qui as été crypté, ce ne serait pas du mot de passe non crypté que tu devrait verifier la taille ?

TheFlameflo

Messages: 303

Ahhhh !
Merci, tout marche parfaitement !
Je sais pas ce que j'aurais fais sans toi et santar ! Sourire


Veuillez vous connecter ou créer un compte pour poster une réponse