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.

5 réponses


Lartak
Réponse acceptée

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']]);
Devdeb22
Auteur

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]
     // and $_POST['subscribed']=1
         and $_POST['subscribed']==1 

@plus

Pierre