Bonjour,
je recontre une erreur lorsque j'ajoute plus d'une requete SQL, je recontre l'erreur:
Lorsque je met une seule requete préparé cela fonctionne, et lorsque j'en met plus d'une... L'erreur se produit.
UsersController.php
<?php
namespace App\Controller;
use \Core\Auth\DBAuth;
use \Core\HTML\Form;
use \App;
class UsersController extends AppController{
public function login(){
$errors = false;
if(!empty($_POST)){
$auth = new DBAuth(App::getInstance()->getDb());
if($auth->login($_POST['username'], $_POST['password'])){
$_SESSION['logged'] = true;
header('Location:index.php?page=admin.posts.index');
}else{
$errors = true;
}
}
$form = new Form($_POST);
$this->render('users.login', compact('form', 'errors'));
}
public function register(){
$errors = false;
if(!empty($_POST)){
$auth = new DBAuth(App::getInstance()->getDb());
//TEST PASS == PASSREP et user pas utilisé et email pas utilisé
$user = $auth->register($_POST['username'], $_POST['email'], $_POST['password'], $_POST['passwordrepeat']);
if($user){
header('Location:index.php?page=admin.posts.index');
}else{
$errors = var_dump($user);
}
}
$form = new Form($_POST);
$this->render('users.register', compact('form', 'errors'));
}
public function logout(){
session_destroy();
header("Location:?page=posts.index");
exit();
}
}
DBauth.php
<?php
namespace Core\Auth;
use Core\Database\Database;
use Core\Database\MysqlDatabase;
class DBAuth{
private $db;
public function __construct(Database $db){
$this->db = $db;
}
public function getUserId(){
if($this->logged()){
return $_SESSION['auth'];
}
return false;
}
/**
* @param $username
* @param $password
* @return true
*/
public function login($username, $password){
$user = $this->db->prepare('SELECT * FROM users WHERE username = ?', [$username], null, true);
if($user){
if($user->password === sha1($password)){
$_SESSION['auth'] = $user->id;
return true;
}
return false;
}
}
public function register($username, $email, $password, $passwordrepeat){
$user = $this->inspect($username, $email);
if($user){
return false;
}else{
if($password === $passwordrepeat){
$pass = sha1($password);
$insertion = $this->db->prepare("INSERT INTO users SET (username, email, password) VALUES '?, ?, ?)", [$username, $email, $pass], null, true);
$id = $this->getIdRegister();
$_SESSION['auth'] = $id;
}
}
return true;
}
public function getIdRegister($username){
$user = $this->db->query("SELECT * FROM users WHERE username = {$username}");
$id = $user->id;
$user->closeCursor();
return $id;
}
public function inspect($username, $email){
$match = $this->db->prepare("SELECT * FROM users WHERE username = ? AND email = ?", [$username, $email], null, true);
$result = $match;
$match = null;
return $result;
}
public function logged(){
return isset($_SESSION['auth']);
}
}
MysqlDatabase.php
<?php
namespace Core\Database;
use \PDO;
class MysqlDatabase extends Database{
private $dbName;
private $dbUser;
private $dbPass;
private $dbHost;
private $pdo;
public function __construct($dbName, $dbUser = 'root', $dbPass = 'pass', $dbHost = 'localhost'){
$this->dbName = $dbName;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
$this->dbHost = $dbHost;
}
private function getPDO(){
if($this->pdo === null){
$pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $this->pdo = $pdo;
}else{
return $this->pdo = $pdo;
}
}
public function query($statement, $className = null, $one = false){
$req = $this->getPDO()->query($statement);
if(
strpos($statement, 'UPDATE') === 0 ||
strpos($statement, 'INSERT') === 0 ||
strpos($statement, 'DELETE') === 0
){
return $req;
}
if($className === null){
$req->setFetchMode(PDO::FETCH_OBJ);
}else{
$req->setFetchMode(PDO::FETCH_CLASS, $className);
}
if($one){
$datas = $req->fetch();
}else{
$datas = $req->fetchAll();
}
return $datas;
}
public function prepare($statement, $attributes, $className = null, $one = false){
$req = $this->getPDO()->prepare($statement);
$res = $req->execute($attributes);
if(strpos($statement, 'UPDATE') === 0 ||
strpos($statement, 'INSERT') === 0 ||
strpos($statement, 'DELETE') === 0
){
return $res;
}
if($className === null){
$req->setFetchMode(PDO::FETCH_OBJ);
}else{
$req->setFetchMode(PDO::FETCH_CLASS, $className);
}
if($one){
$datas = $req->fetch();
}else{
$datas = $req->fetchAll();
}
return $datas;
}
}
register.php
<?php if($errors): ?>
<p>Identifiants Incorrect</p>
<?php endif; ?>
<form method='post'>
<?= $form->input('username', 'Pseudo', ['type' => 'text']); ?>
<?= $form->input('email', 'Email', ['type' => 'email']); ?>
<?= $form->input('password', 'Password', ['type' => 'password']);?>
<?= $form->input('passwordrepeat', 'Confirmation Password', ['type' => 'password']);?>
<button style="width:100%; height:30px">Register</button>
</form>
En vous remerciant d'avance ! <3
Bonsoir.
Ton problème vient de ta fonction getPDO
.
private function getPDO() {
if ($this->pdo === null) {
$pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $this->pdo = $pdo;
} else {
return $this->pdo = $pdo;
}
}
Tu commences par vérifier si la propriété pdo
est définie, la première fois elle ne l'est pas tu la définie donc via une variable nommée pdo
, jusque là pas de problème, par contre la seconde fois la propriété est définie, sauf que tu la redéfinie via la variable pdo
qui n'est pas définie, du coup lorsque tu retournes la propriété pdo
elle n'est plus définie.
C'est d'ailleurs ce que te dit le message d'erreur :
Undefined variable pdo in ...MysqlDatabase.php on line 30
Je te recommenderais donc plutôt de remplacer le code de la fonction par ce qui suit :
if ($this->pdo === null) {
$pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
}
return $this->pdo;