Création espace membres combiné à poo

Par Manide, il y a 10 ans


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, il y a 10 ans

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 ); } }
Manide, il y a 10 ans

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é