Bonjour,
J'ai un mini code Php où il y une erreur interne mais que je n'arrive pas à identifier.
Voici mon code :
<?php
require_once 'inc/functions.php';
reconnect_from_cookie();
if(isset($_SESSION['auth'])){
header('Location: account.php');
exit();
}
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']],['subscribed' => $_POST['subscribed']]);
$user = $req->fetch();
if(password_verify($_POST['password'], $user->password) and $_POST['subscribed']=1 ){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
header('Location: account.php');
exit();
}
if(password_verify($_POST['password'], $user->password) and $_POST['subscribed']=0 ){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
header('Location: account2.php');
exit();
}
else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
}
}
?>
Dans ce code je commence par appeler une fichier qui contient toutes les fonction.
Puis je vérifie si l'utilisateur est connecté (depuis les cookies).
Si il n'est pas logué, dans ce cas il doit saisir son identifiant et mp dans un formulaire.
Je vérifie que le champs password et username sont non-vide.
Si oui, alors j'appel la base de données
Je fais une requette préparé où je prends
Le "username"
Le "subscribed"
Puis ensuite je verifie si le password, correspond et subscrebed =1
si oui alors je dirige l'utilisateur vers une page qui s'appel account1.php
si subscrebed =0
Je dirige l'utilisateur vers une page qui s'appel account2.php
Sinon je lui affiche un message d'erreur.
J'obtient une erreur 500
Je n'arrive pas à identifier mon erreur.
Bonjour.
Pourquoi est-ce que tu envoies subscribed en tant que paramêtre dans ta requête SQL alors que tu n'utilises que l'index de username ?
Il te faut donc supprimer le second paramêtre, soit :
$req->execute(['username' => $_POST['username']);
Ensuite, comme te le conseilles brièvement Pierrot01, utilises plutôt le double = au lieu du simple pour vérifier une égalité, car le simple = sert principalement à définir une variable par exemple.
Sinon, il y a un autre problème dans ton code, tu fais des vérifications sur des champs d'une table, sans avoir au préalable vérifié si tu récupérais bien un enregistrement.
Tu devrais donc faire quelque chose comme :
if (!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])) {
require_once 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']);
$user = $req->fetch();
if ($user && password_verify($_POST['password'], $user->password)) {
$location = 'account';
if ($_POST['subscribed'] == '1') {
$location = 'account2';
}
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
header("Location: {$location}.php");
exit();
}
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
}
De cette manière en plus tu évites certaines répétitions de code qui sont inutiles.
Bonsoir,
Tu as un double tableau alors qu'il n'y devrait en avoir qu'un :
$req->execute(['username' => $_POST['username']],['subscribed' => $_POST['subscribed']]);
Merci Carouge.
J'ai essayé de mettre les deux tableaux dans un seul tableau, mais ça ne fonctionne pas.
Comment je fais dans ce cas là pour récupérer les deux champs ?
il n'y a qu'un seul tableau à faire
['username' => $username, 'blabla_bla' => $blabla_bla]