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
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é
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
);
}
}