Bonjour,
Après avoir suivi, dans l'ordre:
Je suis bloquer quand j'essaie de me connecter, il me dit "Fatal error: Call to a member function execute() on array in C:\wamp\www\account\login.php on line 12" ..
Voici mon arborescence: https://prnt.sc/fbistx
login.php
<?php
include('../includes/head.php');
require_once '../includes/functions.php';
reconnect_from_cookie();
if (isset($_SESSION['auth'])) {
header('Location: index.php');
exit();
}
if (!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once '../includes/database.php';
$req = $pdo->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
$user = $req->fetch();
if (password_verify($_POST['password'], $user->password)) {
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
if ($_POST['remember']) {
$remember_token = str_random(250);
$pdo->prepare('UPDATE FROM users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'test'), time() + 60 * 60 * 24 * 7);
}
}else {
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
}
}
?>
database.php
<?php
class database{
private $host = 'localhost';
private $username = 'root';
private $password = '';
private $database = 'floris';
private $pdo;
public function __construct($host = null, $username = null, $password = null, $databse = null){
if ($host != null) {
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
}
try {
$this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ
));
} catch (PDOException $e) {
die();
}
}
public function query($sql, $data = array()){
$req = $this->pdo->prepare($sql);
$req->execute($data);
return $req->fetchAll(PDO::FETCH_OBJ);
}
}
head.php
<?php
require_once '_header.php';
?>
_header.php
<?php
require_once 'panier.class.php';
require_once 'database.php';
$pdo = new database();
$panier = new panier($pdo);
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
Quelqu'un aurait une solution?
Merci d'avance <3
Salut
Vers la ligne 11 de ton fichier login.php tu utilises $pdo comme pdo alors que $pdo correspond à database.
Remplace:
require_once '../includes/database.php';
$req = $pdo->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
par qqch du genre:
$users = $pdo->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $_POST['username']]);
Tu peux te passer du require_once de databe.php car il est déjà fait dans le fichier _header.php
Puis un petit die(var_dump($users)); pour tester le retour ;)
Merci G1.3 !
Le problème maintenant "Notice: Trying to get property of non-object in C:\wamp\www\account\login.php on line 12"
login.php
<?php
include('../includes/head.php');
require_once '../includes/functions.php';
reconnect_from_cookie();
if (isset($_SESSION['auth'])) {
header('Location: index.php');
exit();
}
if (!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
$user = $pdo->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $_POST['username']]);
var_dump($user);
if (password_verify($_POST['password'], $user->password)){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
if ($_POST['remember']) {
$remember_token = str_random(250);
$pdo->prepare('UPDATE FROM users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'test'), time() + 60 * 60 * 24 * 7);
}
}else {
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
}
}
?>
Dans le var_dump($user) tu devrais avoir un tableau de users avec 1 seul node.
Tu peux récupérer le premier item de tableau en faisant $user[0] ou current($user)
Le mieux serait de faire par exemple dans ta class database une option en 3em parametre te permettant de préciser que tu veux récupérer un seul et unique résultat. (ou une fonction dédiée aux requetes te retournant un seul résultat sinon). Qui remplacerait le fetchAll par fetch (de mémoire, j'utilise plus PDO directement depuis pas mal de temps)