Bonjour,

Je viens vers vous car j'ai un pti problème. J'ai suivi le tutoriel sur la poo pour créer un site web et maintenant je souhaite y intégrer le tutoriel sur création d'un espace membres. Ce n'est pas très compliqué j'ai tout compris le seul hic c'est que je n'arrive pas a y intégrer ma function insert. Je voudrai le faire avec une requête prepare() qui est dans le function query() de la classe Table.

Voilà le code :

<?php $form = new \Core\Html\BootstrapForm($_POST);?>
<?php
$usersMembers = App::getInstance()->getTable('User');
  $errors = array();
/*
Regarde si le username est déjà pris
 */
    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
      $errors['username'] = "Invalid username";
    }else{
        $user = $usersMembers->query('SELECT id FROM users_members WHERE username=?', [$_POST['username']]);
        if($user){
          $errors['username'] = 'Username already done';
        }
    }
/*
Regarde si l'email est déjà pris
 */
    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
      $errors['email'] = "Invalid email";
    }else{
        $mail = $usersMembers->query('SELECT id FROM users_members WHERE email=?', [$_POST['email']]);
        if($user){
          $errors['email'] = 'Email already done for another account';
        }
    }
    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
      $errors['password'] = "Invalid password";
    }
    debug($errors);
/*
C'est ici que ça coince
 */
if(empty($errors)){
  $req = $usersMembers->query("INSERT INTO users_members SET username = ?, email =?, password = ?");
  debug($req);
=> message d'erreur (Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near '?, email =?, password = ?' at line 1 in
G:\Virtualhosts\Lolgiveaway\www\core\Database\MysqlDatabase.php on line 38)
}
 ?>
<h1>Register</h1>
<form  action="" method="POST">
              <?= $form ->input('username', 'Username');?>
              <br/>
              <?= $form ->input('email', 'Email', ['type' => 'email']) ; ?>
              <br/>
              <?= $form ->input('password', 'Password', ['type' => 'password']);?>
              <br/>
              <?= $form ->input('password_confirm', 'Repeat password', ['type' => 'password']);?>
<br/>
          <div class="form-group">
                <button type="submit" class="btn btn-primary">Register</button>
          </div>
</form>

MysqlDatabase :

<?php

namespace Core\Database;
use \PDO;

class  MysqlDatabase extends Database{

    private $db_host;
    private $db_name;
    private $db_user;
    private $db_pass;
    private $pdo;

    public function __construct($db_name, $db_user = '*******', $db_pass = '*********', $db_host = "localhost"){

        $this->db_name = $db_name;
        $this->db_user = $db_user;
        $this->db_pass = $db_pass;
        $this->db_host = $db_host;
    }

    private function getPDO(){
        if($this->pdo === null){
        $pdo = new PDO('mysql:dbname=********;host=localhost', '********','*******');
        $pdo->exec('SET CHARACTER SET utf8');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $this->pdo = $pdo;
    }
        return $this->pdo;

}

    public function query($statement, $class_name = null, $one = false){
        $req = $this->getPDO()->query($statement);
        if(
            strpos($statement, 'UPDATE') === 0 ||
            strpos($statement, 'INSERT') === 0 ||
            strpos($statement, 'DELETE') === 0
            ){
            return $req;
        }
       if($class_name === null){
            $req -> setFetchMode(PDO::FETCH_OBJ);
        }else{
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }

        if($one){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }
        return $datas;
    }

    public function prepare($statement, $options, $class_name = null, $one= false){
        $req = $this->getPDO()->prepare($statement);
        $res = $req->execute($options);
        if(
            strpos($statement, 'UPDATE') === 0 ||
            strpos($statement, 'INSERT') === 0 ||
            strpos($statement, 'DELETE') === 0
            ){
            return $res;
        }
        if($class_name === null){
            $req -> setFetchMode(PDO::FETCH_OBJ);
        }else{
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }
        if($one){
             $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }
        return $datas;
    }

/*
Permet de récupérer le dernier id ajouté
 */
    public function lastInsertId(){
        return $this->getPDO()->lastInsertId();
    }
}
?>

Merci d'avance

2 réponses


Manide
Auteur
Réponse acceptée

pb résolu avec :

if(empty($errors)){
  $password = password_hash($_POST['password'], PASSWORD_BCRYPT);

  $req = $usersMembers->query("INSERT INTO users_members SET username = ?, email =?, password = ?", [$_POST['username'], $password]);
  $req->execute();

Par contre quand j'essaye de m'inscrire j'ai cette erreur :

Fatal error: Call to a member function execute() on a non-object in G:\Virtualhosts\Lolgiveaway\www\pages\Register.php on line 43

ca qui correspond à la ligne $req->execute(); au dessus.

Et quand je vais dans la bdd l'utilisateur a bien été enregistré...

edit : erreur corrigée en enlevant $req->execute(); car déjà effectuée avant lol...trop bête désolé

Manide
Auteur

Ah et voici la function query de la classe Table :

/*
Permet de se connecter à la BDD
 */
  public function query($statement, $attributes = null, $one = false){
    if($attributes){
     return $this->db->prepare(
        $statement,
        $attributes,
        str_replace('Table', 'Entity', get_class($this)),
        $one
        );
    }else{
      return $this->db->query(
        $statement,
        str_replace('Table', 'Entity', get_class($this)),
        $one
        );
    }
}