Accéder à la base de données dans une classe

Ce topic a été résolu
TheFlameflo

TheFlameflo Le 1 avril 2016 à 03:42 (Édité le 25 janvier 2019 à 17:50)

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 !
Nobodief

Nobodief Le 1 avril 2016 à 13:04 (Édité le 1 avril 2016 à 13:07)

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

quiqou55 Le 1 avril 2016 à 18:29 (Édité le 1 avril 2016 à 18:31)

   
quiqou55

quiqou55 Le 1 avril 2016 à 18:29 (Édité le 1 avril 2016 à 18:36)

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 😀 
   $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

TheFlameflo Le 2 avril 2016 à 15:23

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 ! 😀
quiqou55

quiqou55 Le 2 avril 2016 à 17:07 (Édité le 2 avril 2016 à 17:11)

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

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 😉
TheFlameflo

TheFlameflo Le 2 avril 2016 à 17:39

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

quiqou55 Le 2 avril 2016 à 20:53

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

TheFlameflo Le 2 avril 2016 à 23:37

Ahhhh !
Merci, tout marche parfaitement !
Je sais pas ce que j'aurais fais sans toi et santar ! 😀
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte