Autoriser la connexion au site avec le pseudo ou adresse mai

Résolu
flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   -  
flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   -

bonjour a tous 

je souhaiterais savoir comment je pourrais modifier la connexion a mon site 

Afin que l'utilisateur puiisse entrer un pseudo ou alors son adresse email

Voici mon code avec lequel l'utilisateur peux se connecter avec son pseudo

<?php
session_start();
error_reporting(E_ALL);
ini_set("display_errors", true);
ini_set("display_startup_errors", true);

//on recupere le lien link pour la redirection vers les autres pages
$link = !empty($_GET["link"]) ? $_GET["link"] : null;

require_once "base.php";
if (!empty($_POST["pseudo"]) && !empty($_POST["password"])) {
    $pseudo = !empty($_POST["pseudo"]) ? $_POST["pseudo"] : null;
    $password = !empty($_POST["password"]) ? $_POST["password"] : null;

    //préparation de la requête et des variables
    $sql =
        "SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ?";
    $datas = [$pseudo];
    //Execution de la requete
    try {
        $requete = $bdd->prepare($sql);
        $requete->execute($datas);
    } catch (Exception $e) {
        // en cas d'erreur :
        echo " Erreur ! " . $e->getMessage();
        echo " Les datas : ";
        print_r($datas);
    }
    $data = $requete->fetch();
    $row = $requete->rowCount();
    $userexit = $requete->fetch();
    //si le peusdo est bien dans la base alors on continue sinon on sort

    if ($data["confirme"] != 1 and $row == 0) {
        //pseusdo pas bon
        header("Location: connexion-site.php?login_err=divers2");
        die();
    }
    //else if
    //($data['confirme'] !=0 and $row == 1)//psuedo bon
    //{header('Location: connexion-site.php?login_err=divers3');
    //      die();}

    if ($data["confirme"] != 0) {
        if ($row == 1) {
            //on verifie le pawword si il est ok on continue , sinon sortie
            if (password_verify($password, $data["password"])) {
                //on definit et on cree les variables sessions
                $_SESSION["user"] = [
                    "id" => $data["id"],
                    "pseudo" => $data["pseudo"],
                    "email" => $data["email"],
                    "confirmkey" => $data["confirmkey"],
                ];
                $_SESSION["id"] = $data["id"];
                $_SESSION["pseudo"] = $data["pseudo"];
                $_SESSION["email"] = $data["email"];
                $_SESSION["confirmkey"] = $data["confirmkey"];

                //on test la variable link si elle est vide  on va vers index
                if (empty($_SESSION["link"])) {
                    header("Location: index.php?pseudo=" . $_SESSION["pseudo"]);
                    //sinon on va faire la derniere page visitee
                } else {
                    header("location: " . $_SESSION["link"]);
                }
                die();
            } else {
                header("Location: connexion-site.php?login_err=password");
                die();
            }
        } else {
            header("Location: connexion-site.php?login_err=already");
            die();
        }
    } else {
        header("Location: connexion-site.php?login_err=divers");
        die();
    }
}
?>

4 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     

    Bonjour,

    dans mon formulaire de connexion 

    il n'y a que deux champs le premier qui acceuil le pseudo pour l'instant 

    Dans ce cas, tu n'as qu'une seule variable POST correspondant à ce champ du formulaire....

    On en revient donc à la réponse 2 de yg_be ...


    1
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       

      Sachant que dans ton code de départ, tu as d'autres soucis...

      Pour commencer.. la méthode rowCount ne doit pas s'utiliser sur une requête de type SELECT (comme c'est indiqué dans la documentation officielle de php ! )

      Et ta condition n'est pas bonne

      $data = $requete->fetch();
      $row = $requete->rowCount(); // Ne pas utiliser cette méhtode... 
      $userexit=$requete->fetch(); // tu as déjà fait le fetch sur la variable $data ...
      
      /*
      if ($data['confirme'] !=1 and $row == 0 )//pseusdo pas bon  {
      */
      
      //a corriger par :
      if ( empty($data) || $data['confirme'] != '1' ) {
        // si la requête n'a pas retourné de résultat OU qu'il n'est pas confirmé
      1
    2. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       

      Merci Jordane pour la correction 

      Une chance que tu sois la 

      voici donc mon code corrigé

      Mais lorsque je rentre un bon pseudo et un bon mot de passe il m'affiche l'erreur divers de la ligne 53

      pourtant le pseudo est bien confirme et il existe bien 

      <?php
      session_start();
      error_reporting(E_ALL);
      ini_set('display_errors', true);
      ini_set('display_startup_errors', true);
      
            
       
      //on recupere le lien link pour la redirection vers les autres pages
      $link = !empty($_GET['link']) ? $_GET['link'] : NULL;
      
      require_once 'base.php';
      if (!empty($_POST['pseudo']) && !empty($_POST['password']))
      {
          $pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
          $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
        $email = !empty($_POST['email']) ? $_POST['email'] : NULL;
        
        //test d'une variable de session
        $_SESSION['email'] =$_POST["email"];
      $_SESSION['pseudo'] =$_POST["pseudo"];
          //préparation de la requête et des variables
          //$sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ?';
          $sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ? OR email = ';
          
         // $datas = [$pseudo];
          $datas = array($pseudo,$pseudo);
          //Execution de la requete
          try
          {
              $requete = $bdd->prepare($sql);
              $requete->execute($datas);
          }
          catch(Exception $e)
          {
              // en cas d'erreur :
              echo " Erreur ! " . $e->getMessage();
              echo " Les datas : ";
              print_r($datas);
          }
          $data = $requete->fetch();
          //$row = $requete->rowCount();
      //$userexit=$requete->fetch();
      
          //si le peusdo est bien dans la base alors on continue sinon on sort
      /*
      if ($data['confirme'] !=1 and $row == 0 )//pseusdo pas bon 
        {header('Location: connexion-site.php?login_err=divers');
             die();}
      */
      
      if ( empty($data) || $data['confirme'] != '1' ) {
          header('Location: connexion-site.php?login_err=divers');
             die();
      }
        // si la requête n'a pas retourné de résultat OU qu'il n'est pas confirmé
      
          
      	 if ($data['confirme'] !=0)
          {
          if ($row == 1)
          {
              //on verifie le pawword si il est ok on continue , sinon sortie
              if (password_verify($password, $data['password']))
              {
                  //on definit et on cree les variables sessions
                  $_SESSION['user'] = array(
                      'id' => $data['id'],
                      'pseudo' => $data['pseudo'],
                      'email' => $data['email'],
                      'confirmkey' => $data['confirmkey']
                  );
                  $_SESSION['id'] = $data['id'];
                  $_SESSION['pseudo'] = $data['pseudo'];
                  $_SESSION['email'] = $data['email'];
                  $_SESSION['confirmkey'] = $data['confirmkey'];
               
                  
                  //on test la variable link si elle est vide  on va vers index
                  if (empty($_SESSION['link']))
                  {
                      header('Location: ./index.php?pseudo=' . $_SESSION['pseudo']);
                      //sinon on va faire la derniere page visitee
                      
                  }
                  else 
                  {
                      header('location: ' . $_SESSION['link']);
                  }
                  die();
              }
              else
              {
                  header('Location: connexion-site.php?login_err=password');
                  die();
              }
          }
          else
          {
              header('Location: connexion-site.php?login_err=already');
              die();
          }
      	}
          else
          {
              
              
               header('Location: connexion-site.php?login_err=divers');
              die();
            
              
              
              
          }
      }
      ?>
      
      
      1
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention  
       

      En ligne 52, tu testes deux conditions.  Teste les séparément, de façon à pouvoir déterminer laquelle provoque le message d'erreur.

      1
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention  
       

      Dans la requête, tu as deux points d'interrogation:

      WHERE pseudo = ? OR email = ?';
          

      Tu utilises ensuite "array($pseudo,$pseudo)" pour préciser quelles données doivent se substituer au point d'interrogation.

      1
  2. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     

    j'ai modifie ma requete de la sorte mais il refuse de prendre l'adresse email

        $sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ? OR email = ?';
        //$datas = [$pseudo];
        $datas = array($pseudo,$email);
        //Execution de la requete
        try
        {
            $requete = $bdd->prepare($sql);
            $requete->execute($datas);
        }
        catch(Exception $e)
        {
            // en cas d'erreur :
            echo " Erreur ! " . $e->getMessage();
            echo " Les datas : ";
            print_r($datas);
        }
        $data = $requete->fetch();
        $row = $requete->rowCount();
    $userexit=$requete->fetch();
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      bonjour,

      Que contient la variable $email?

      Tu ne nous montres pas le formulaire utilisé.

      Si l'utilisateur peut rentrer son email dans la zone pseudo, alors plutôt:

      $datas = array($pseudo,$pseudo);

      Fais attention alors à vérifier que personne n'utilise comme pseudo l'email d'un autre utilisateur (à l'inscription).

      1
      1. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Bonjour 

        Merci pour l'aide 

        voici ce que contient cette variable

          $email = !empty($_POST['email']) ? $_POST['email'] : NULL;

        Mais le code que tu me donnes ne serais pas 

        $datas = array($pseudo,$email);
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention  
         

        Ce serait plus propre alors de faire deux requêtes, une quand le pseudo est entré, l'autre quand l'email est entré.

        1
  3. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     

    Merci pour l'aide oui c'est ce a quoi j'avais pense

    cela pourrait etre ceci alors ?

    $sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ? OR email = ?';
        $datas = [$pseudo];
        //Execution de la requete
        try
        {
            $requete = $bdd->prepare($sql);
            $requete->execute($datas);
        }
        catch(Exception $e)
        {
            // en cas d'erreur :
            echo " Erreur ! " . $e->getMessage();
            echo " Les datas : ";
            print_r($datas);
        }
        $data = $requete->fetch();
        $row = $requete->rowCount();
    $userexit=$requete->fetch();
    
    if ($data['confirme'] !=1 and $row == 0 )//pseusdo pas bon  {
    echo "pseudo existe";
    } else {
    echo "pseudo n'existe pas";
    } 
    
    //requete 2 pour le mail
    $datasmail = [$email];
    //exécution de la requête
    try{
    $stmt = $bdd->prepare($sql);
    $stmt->execute($datasmail);
    $user = $stmt->fetch();
    }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ;
    print_r($datasmail);
    }
    if (!empty($user)) {
    echo "email existe";
    } else {
    echo "email n'existe pas";
    } 
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Plutôt tester si l'utilisateur a rentré son pseudo ou son email, et, ensuite, utiliser uniquement le pseudo ou uniquement l'email.

      0
    2. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       

      oui c'est exactement ce a quoi je pensais a l'instant 

      Mais au niveau des conditions je m'y perds un peu

      car si cela est une adresse email 

      je dois la tester et si elle est dans la base de donnee 

      je continue mes conditions

      Mais pareil pour le pseudo

      je dois voir si il est dans la base de donnee

      si oui je continue mes conditions 

      J'essaye de mettre cela sur papier ...

      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention  
       

      "tester si l'utilisateur a rentré son pseudo ou son email", cela signifie tester si l'utilisateur a rempli $_POST['pseudo'] ou bien si il a rempli $_POST['email'].  SI aucun des deux ou les deux, refuser.

      0
    4. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       

      oui c'est vrai que jn'y avait pas pense 

      mais j'ai un petit soucis 

      pour ma connexion j'ai deux pages la premiere pour la gestion du formulaire et des erreurs qui est donc le code ici plus haut soit connexion.php

      la deuxieme page pour afficher les erreurs connexion-site.php

      j'ai donc cree deux variable de session avec $_POST['email'] et $_POST['pseudo'] sur connexion.php

      ensuite je les appelles connexion-site.php  

      Lorsque je rentre une adresse email sur connexion.php et que je valide

      aussi bien les var_dump de email et de pseudo m'affiche l'adresse email

      ce qui est logique 

      Donc du coup comment je pourrais savoir celle qui a ete remplie lorsqu'il valide le formulaire

      0
    5. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190 > flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention  
       

      le seul moyen que j'ai trouve pour l'instant c'est comme tu l'avais suggere

      serait de realiser deux requetes completes suivant si cest email ou pseudo qui est remplit

      car j'ai fini par trouver comment les tester

      if (empty($_POST['email']))
      0
  4. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     

    je viens d'essayer ce code 

    $pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
        $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
      $email = !empty($_POST['email']) ? $_POST['email'] : NULL;
        //préparation de la requête et des variables
        //$sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ?';
        $sql = 'SELECT pseudo, email,id,confirme, password,confirmkey FROM utilisateurs WHERE pseudo = ? OR email = ?';
        $datas = [$pseudo];
        //$datas = array($pseudo,$email);
        //Execution de la requete
        try
        {
            $requete = $bdd->prepare($sql);
            $requete->execute($datas);
        }
        catch(Exception $e)
        {
            // en cas d'erreur :
            echo " Erreur ! " . $e->getMessage();
            echo " Les datas : ";
            print_r($datas);
        }
        $data = $requete->fetch();
        $row = $requete->rowCount();
    $userexit=$requete->fetch();
    
    
    
    
    
    if($data['confirme'] !=1 and filter_var($email, FILTER_VALIDATE_EMAIL) ){
    	$datasmail = [$email];
    //exécution de la requête
    try{
    $stmt = $pdo->prepare($sql);
    $stmt->execute($datas);
    $user = $stmt->fetch();
    }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ;
    print_r($datasmail);
    }
    if (empty($user)) {header('Location: connexion-site.php?login_err=divers3');
           die();}
    
    } 
    else  if ($data['confirme'] !=1 and $row == 0 )//pseusdo pas bon 
      {header('Location: connexion-site.php?login_err=divers2');
           die();}
    
    

    mais lorsque je rentre le bon pseudo et bon mot de passe j'ai l'erreur divers2

    idem si je rentre la bonne adresse emil avec le bon mot de passe

    0