Bonjour,
Je rencontre unpetit problème avec ce bout de code
Je veux faire une page de connexion liée à la base de données

Mais lorsque je rentre le bon ou mauvais identifiant ou mot de passe la ne réagis pas, elle ne m'affiche aucun message et me redirige sur la page de connexion. Voici mon code :

<?php
require_once 'inc/db.php';

if(isset($_POST['client'])){
$username = $_POST['username'];
$password = $_POST['password'];
$q = 'SELECT id from users WHERE username =? AND password = ?';
$req = $pdo ->prepare($q);
$req->execute([$username,$password]);
$results = $req->fetchAll();
if(count($results)==0){
$_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
} else {
session_start();
$_SESSION['username'] = $username;
// header('location: index.php');
}
} else if (isset($_POST['button_mod'])) {

$username =$_POST['username'];
$password = $_POST['password'];
$q = 'SELECT id from moderateur WHERE username =? AND password = ?';
$req = $pdo ->prepare($q);
$req->execute([$username,$password]);
$results = $req->fetchAll();
if(count($results)==0){
$_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
} else {
session_start();
$_SESSION['username'] = $username;
// header('location: index.php');
}
}
?>
<?php require 'inc/header.php'; ?>

<div class="block-center col align-self-center" style="padding-bottom: 5%">

<div class=" text-center form p-3">

  <form action="#" class="justify-content-center" method="post"  name="page_connexion" >
     <h1 class="text-center section-title" style="padding: 4%">Connexion</h1>
     <div class="custom-control custom-radio custom-control-inline">
       <input type="radio" id="customRadioInline1" name="client" class="custom-control-input">
       <label class="custom-control-label" for="customRadioInline1">Client</label>
     </div>
     <div class="custom-control custom-radio custom-control-inline">
       <input type="radio" id="customRadioInline2" name="button_mod" class="custom-control-input">
       <label class="custom-control-label" for="customRadioInline2">Modérateur</label>
     </div>

      <div class="  form p-3 col-md-8">
        <label class="control-label" >Identifiant : </label>
        <input class="form-control"type="text" name="username"  placeholder="Email ou pseudo">
      </div>
      <div class=" form p-3 col-md-8">
        <label class="control-label">Mot de passe : </label>
        <input class="form-control"  type="password" name="password"  placeholder="Mot de passe">
        <a href="forget.php">(J'ai oublié mon mot de passe ?)</a>

      </div>

      <div class="form-submit mt-5">
          <form action = "login_process.php" methode ="post">
          <button name="form_connexion" class="btn btn-outline-success color-00E676" type="submit"> Connexion</button>
          </form>
          <form action ="modérateur/register_admin.php" method ="post">
          <p>Tu veux être modérateur ?
          <button class="btn btn-outline-success color-00E676" type="submit">Clique ici </button></p>
          </form>
      </div>
  </form>

</div>

</div>
<?php include('inc/footer.php'); ?>
</body>
</html>

14 réponses


Bonjour.
active l'affichage des erreurs pdo ( cf la documentation)
ensuite pas de htmlspecialchar sur les données entrée en bdd
enfin mets les redirections en commentaire le temps du test car sinon, tu ne verras pas les messages d'erreurs

Bonjour,
J'ai déjà activer les erreurs pdo
Et j'ai mit mes redirection en commentaire mais rienn'a changé

Salut
une bonne mise en page et tu comprend vite ;)

<?php
    require_once 'inc/db.php';
    if(isset($_POST['client'])){       // <------------************************************************************i 
        $username = htmlspecialchars($_POST['username']);
        $password = $_POST['password'];
        $q = 'SELECT id from users WHERE username =? AND password = ?';
        $req = $pdo ->prepare($q);
        $req->execute([$username,$password]);
        $results = $req->fetchAll();
        if(count($results)==0){
            $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
        } else {
            session_start();
            $_SESSION['username'] = $username;
            header('location: index.php');
        }
    } else if (isset($_POST['client'])) { // <------------************************************************************
        $username = htmlspecialchars($_POST['username']);
        $password = $_POST['password'];
        $q = 'SELECT id from moderateur WHERE username =? AND password = ?';
        $req = $pdo ->prepare($q);
        $req->execute([$username,$password]);
        $results = $req->fetchAll();
        if(count($results)==0){
            $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
        } else {
            session_start();
            $_SESSION['username'] = $username;
            header('location: index.php');
        }
    }
?>

si 1=1
instruction1
sinon si = 1=1
instruction2

instruction2 n'est jamais executer

y a comme un problème de logique ;)
Bon courage

@plu

Pierre

bas les redirections ne sont pas commentés et je vois toujours les htmlspecialchar
du coup je doute pour les

@Carouge10 , y a avant tout un problème de logique ;)
@plus
Pierre

@Pierrot01, oui effectivement !
J'ai changé ma deuxième instruction en else if (isset($_POST['button_mod']))

Mais je n'ai toujours pas eu de changement :/

l'idéale, ce serait de poster le bon code, la dernière version ;)
et avec une bonne mise en page ;)
@plus

<?php
require_once 'inc/db.php';

if(isset($_POST['client'])){
  $username = $_POST['username'];
  $password = $_POST['password'];
  $q = 'SELECT id from users WHERE username =? AND password = ?';
  $req = $pdo ->prepare($q);
  $req->execute([$username,$password]);
  $results = $req->fetchAll();
    if(count($results)==0){
       $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
    } else {
      session_start();
      $_SESSION['username'] = $username;
      //header('location: index.php');
    }
 } else if (isset($_POST['button_mod'])) {

   $username = $_POST['username'];
   $password = $_POST['password'];
   $q = 'SELECT id from moderateur WHERE username =? AND password = ?';
   $req = $pdo ->prepare($q);
   $req->execute([$username,$password]);
   $results = $req->fetchAll();
   if(count($results)==0){
      $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
   } else {
     session_start();
     $_SESSION['username'] = $username;
    // header('location: index.php');
   }
 }
  ?>
<?php require 'inc/header.php'; ?>

<div class="block-center col align-self-center" style="padding-bottom: 5%">

   <div class=" text-center form p-3">

      <form action="#" class="justify-content-center" method="post"  name="page_connexion" >
         <h1 class="text-center section-title" style="padding: 4%">Connexion</h1>
         <div class="custom-control custom-radio custom-control-inline">
           <input type="radio" id="customRadioInline1" name="client" class="custom-control-input">
           <label class="custom-control-label" for="customRadioInline1">Client</label>
         </div>
         <div class="custom-control custom-radio custom-control-inline">
           <input type="radio" id="customRadioInline2" name="button_mod" class="custom-control-input">
           <label class="custom-control-label" for="customRadioInline2">Modérateur</label>
         </div>

          <div class="  form p-3 col-md-8">
            <label class="control-label" >Identifiant : </label>
            <input class="form-control"type="text" name="username"  placeholder="Email ou pseudo">
          </div>
          <div class=" form p-3 col-md-8">
            <label class="control-label">Mot de passe : </label>
            <input class="form-control"  type="password" name="password"  placeholder="Mot de passe">
            <a href="forget.php">(J'ai oublié mon mot de passe ?)</a>

          </div>

          <div class="form-submit mt-5">
              <form action = "login_process.php" methode ="post">
              <button name="form_connexion" class="btn btn-outline-success color-00E676" type="submit"> Connexion</button>
              </form>
              <form action ="modérateur/register_admin.php" method ="post">
              <p>Tu veux être modérateur ?
              <button class="btn btn-outline-success color-00E676" type="submit">Clique ici </button></p>
              </form>
          </div>
      </form>

    </div>
  </div>
  <?php include('inc/footer.php'); ?>
</body>
</html>

balise "form" imbriqué ;)

on ne peut pas imbriquer des formulaires ;)
https://xhtml.developpez.com/faq/?page=formulaire-elements#FORMULAIRE_imbrique

https://developer.mozilla.org/fr/docs/Web/Guide/HTML/Formulaires/Comment_structurer_un_formulaire_HTML

extrait du site mozilla.org :
Note : Il est strictement interdit d'imbriquer un formulaire dans un autre formulaire. L'imbrication peut conduire à des comportements imprévisibles selon le navigateur utilisé.

@plus

Pierre


<?php require 'inc/header.php'; ?>
<?php
require_once('inc/db.php');

if(isset($_POST['client'])){
  $username = $_POST['username'];
  $password = $_POST['password'];
  $q = 'SELECT id from users WHERE username =? AND password = ?';
  $req = $pdo ->prepare($q);
  $req->execute([$username,$password]);
  $results = $req->fetchAll();
    if(count($results)==0){
       $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
       header('location: login.php');
       exit();
    } else {
      session_start();
      $_SESSION['username'] = $username;
      header('location: account.php');
      exit();
    }
 } else if (isset($_POST['button_mod'])) {

   $username = $_POST['username'];
   $password = $_POST['password'];
   $q = 'SELECT id from moderateur WHERE username =? AND password = ?';
   $req = $pdo ->prepare($q);
   $req->execute([$username,$password]);
   $results = $req->fetchAll();
   if(count($results)==0){
      $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
      header('location: login.php');
   } else {
     session_start();
     $_SESSION['username'] = $username;
    header('location: moderateur/account_mod.php');
    exit();
   }
 }
  ?>

<div class="block-center col align-self-center" style="padding-bottom: 5%">

   <div class=" text-center form p-3">

      <form action="" class="justify-content-center" method="post"  name="page_connexion" >
         <h1 class="text-center section-title" style="padding: 4%">Connexion</h1>
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="inlineRadioOptions" id="client"= value="option1">
          <label class="form-check-label" for="inlineRadio1" >Client</label>
        </div>
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="inlineRadioOptions" id="button_mod" value="option2">
          <label class="form-check-label" for="inlineRadio2">Modérateur</label>
        </div>

          <div class="  form p-3 col-md-8">
            <label class="control-label" >Identifiant : </label>
            <input class="form-control"type="text" name="username"  placeholder="Email ou pseudo">
          </div>
          <div class=" form p-3 col-md-8">
            <label class="control-label">Mot de passe : </label>
            <input class="form-control"  type="password" name="password"  placeholder="Mot de passe">
            <a href="forget.php">(J'ai oublié mon mot de passe ?)</a><br>
            <button name="form_connexion" class="btn btn-outline-success color-00E676" type="submit"> Connexion</button>
          </div>
          <div class="form-submit mt-5">
              <p>Tu veux être modérateur ?
              <button class="btn btn-outline-success color-00E676" type="submit"><a
                href="moderateur/register_admin.php"></a>Clique ici </button></p>
          </div>
      </form>
    </div>
  </div>
  <?php include('inc/footer.php'); ?>
</body>
</html>

Voici mes modifications mais le problème persiste... :/

$_POST['client'] et $_POST['button_mod'] ne peuvent exister
tu n'as aucun objet nommer ainsi

@plus

Pierre

Oui ça y est MERCI INFINIMENT @Pierrot1 !!! :D

Je rencontre un autre petit problème c'est que il me mets que le message "Identifiant ou mot de passe incorrecte" alors que j'entre les bons mot de passe et identifiants

<?php require 'inc/header.php'; ?>
<?php
require_once('inc/db.php');

if(isset($_POST['client'])){
  $username = $_POST['username'];
  $password = $_POST['password'];
  $q = 'SELECT id from users WHERE username =? AND password = ?';
  $req = $pdo ->prepare($q);
  $req->execute([$username,$password]);
  $results = $req->fetchAll();
    if(count($results)==0){
       $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
       header('location: login.php');
       exit();
    } else {
      session_start();
      $_SESSION['username'] = $username;
      header('location: account.php');
      exit();
    }
 } else if (isset($_POST['button_mod'])) {

   $username = $_POST['username'];
   $password = $_POST['password'];
   $q = 'SELECT id from moderateur WHERE username =? AND password = ?';
   $req = $pdo ->prepare($q);
   $req->execute([$username,$password]);
   $results = $req->fetchAll();
   if(count($results)==0){
      $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
      header('location: login.php');
   } else {
     session_start();
     $_SESSION['username'] = $username;
    header('location: moderateur/account_mod.php');
    exit();
   }
 }
  ?>

<div class="block-center col align-self-center" style="padding-bottom: 5%">

   <div class=" text-center form p-3">

      <form action="" class="justify-content-center" method="post"  name="page_connexion" >
         <h1 class="text-center section-title" style="padding: 4%">Connexion</h1>
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="client"= value="option1">
          <label class="form-check-label" for="inlineRadio1" >Client</label>
        </div>
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="button_mod" value="option2">
          <label class="form-check-label" for="inlineRadio2">Modérateur</label>
        </div>

          <div class="  form p-3 col-md-8">
            <label class="control-label" >Identifiant : </label>
            <input class="form-control"type="text" name="username"  placeholder="Email ou pseudo">
          </div>
          <div class=" form p-3 col-md-8">
            <label class="control-label">Mot de passe : </label>
            <input class="form-control"  type="password" name="password"  placeholder="Mot de passe">
            <a href="forget.php">(J'ai oublié mon mot de passe ?)</a><br>
            <button name="form_connexion" class="btn btn-outline-success color-00E676" type="submit"> Connexion</button>
          </div>
          <div class="form-submit mt-5">
              <p>Tu veux être modérateur ?
              <button class="btn btn-outline-success color-00E676" type="submit"><a
                href="moderateur/register_admin.php"></a>Clique ici </button></p>
          </div>
      </form>
    </div>
  </div>
  <?php include('inc/footer.php'); ?>
</body>
</html

Bonjour.
Il y a beaucoup de problèmes dans ton code, mais pas que, tu as aussi un problème d'organisation et de réflexion.
Déjà, inutile de créer deux tables (users et moderateur), dans la première (users) tu ajoutes un champ, par exemple (is_mod) de type boolean et tu lui donnes pour valeur par défaut 0.
Si l'utilisateur est modérateur, il te suffira de faire basculer la valeur du champ de 0 à 1.
Ensuite, un mot de passe doit toujours être hashé en base de données, ne jamais enregistrer de mot de passe avec sa valeur brut.
Si lors du traitement du formulaire d'inscription tu as prit ce point là en compte, il te faut également le prendre en compte lors de la connexion, tu ne dois d'ailleurs pas faire ta condition SQL avec le mot de passe, tu le fais seulement sur le nom d'utilisateur et si tu récupères bien un enregistrement correspondant, tu fais la vérification en comparant la valeur de la base de données et celle retranscrite lors du traitement du formulaire.
De plus qu'il est inutile de récupérer tous les enregistrements de la table, mais un seul, donc le premier trouvé, tu dois donc lorsque tu crées la table des utilisateurs, définir l'unicité de la valeur du champ username.
Autre chose, tu devrais avoir un problème avec la session, car tu ne l'initialises que dans le cas où tu récupéres un enregistrement mais pas dans l'autre cas alors que tu y utilises quand même la session.
Pour terminer, ce n'est pas à l'utilisateur de choisir s'i est modérateur ou non lors de la connexion, c'est au niveau du traitement du formulaire et après avoir récupéré un enregistrement que tu devrais vérifier s'il est modérateur ou non.
Donc pour résumer, tu devrais plutôt avoir quelque chose comme ceci :

<?php
session_start();

if (!empty($_POST)) {

    require_once('inc/db.php');

    $login = $_POST['login'];
    $req = $pdo->prepare('SELECT id, username, password, is_mod FROM users WHERE pseudo = :login OR email = :login');
    $req->execute(compact('login'));
    $user = $req->fetch();

    if (!$user || !password_verify($_POST['password'], $user['password'])) {
        /** Aucun utilisateur ne correspond au login ou à l'adresse email saisie par l'utilisateur ou mot de passe incorrect **/
        $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrecte";
        $redir = 'login';
    } else {
        /** Tout est bon **/
        $_SESSION['id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        $redir = ($user['is_mod'] == 1) ? 'moderateur/account_mod' : 'account';
    }

    header("Location: {$redir}.php");
    exit;
}
require 'inc/header.php'; ?>
        <div class="block-center col align-self-center" style="padding-bottom: 5%">
            <div class="text-center form p-3">
                <form class="justify-content-center" method="post">
                    <h1 class="text-center section-title" style="padding: 4%">Connexion</h1>
                    <div class="form p-3 col-md-8">
                        <label class="control-label" for="login">Identifiant :</label>
                        <input class="form-control" type="text" id="login" name="login" placeholder="Email ou pseudo">
                  </div>
                  <div class="form p-3 col-md-8">
                      <label class="control-label" for="password">Mot de passe : </label>
                      <input class="form-control" type="password" name="password" placeholder="Mot de passe" id="password">
                      <a href="forget.php">(J'ai oublié mon mot de passe ?)</a><br>
                      <button class="btn btn-outline-success color-00E676" type="submit">Connexion</button>
                  </div>
                </form>
            </div>
        </div>
        <?php include('inc/footer.php'); ?>
    </body>
</html>