[RESOLU] formulaire de connexion avec choix email ou login

Eléphant du PHP | 63 Messages

10 oct. 2016, 15:37

bonjour,

je cherche à créer un formulaire de connexion avec choix de mettre login ou email en id.

si vous avez un tuto ou un site qui l'explique bien je suis preneur.

merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 oct. 2016, 15:44

salut,

c'est simple à faire
select les,infos from table utilisateur where pseudo = 'la saisie' or email = 'la saisie';
tu peux faire un peu mieux en validant l'entrée
<?php
$sql = 'select les,infos from table utilisateur where ';
if (!empty($_POST['login_value']) && filter_var($_POST['login_value'], FILTER_VALIDATE_EMAIL)) {
    $sql .= ' email=\''.$_POST['login_value'].'\'';
} else {
    $sql .= ' pseudo=\''.$_POST['login_value'].'\'';
}
// exec
c'est pas à utiliser telquel parce que c'est une belle faille xss.
tu as juste a adapter à ton mode de connexion au serveur sql ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 63 Messages

10 oct. 2016, 15:50

yes cool merci moogli tu es au top toi tu répond du tac-au-tac ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 oct. 2016, 17:20

de rien, la c'est facile pour le coup :=)~


après y a pleind 'autr epossibilités, tu peux te penser sur les sso avec les comptes fb, google et autres.
il existe aussi le projet openid http://openid.net/

mais ceci sort un peu de la question :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 63 Messages

11 oct. 2016, 14:36

la req que tu m'as donné plus haut fonctionne pour le même input?

Eléphant du PHP | 63 Messages

11 oct. 2016, 14:56

oui c'est tout bon j'ai compris le truc merci.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 oct. 2016, 15:09

de rien :)
Il en faut peu pour être heureux ......

Eléphant du PHP | 63 Messages

11 oct. 2016, 15:18

du coup j'ai fait comme ceci

Code : Tout sélectionner

<?php case "connexion": echo'<form method="POST" action="./connexion.php?action=co"> <table> <tr><td>Login:</td><td><input type="text" name="ident"></td></tr> <tr><td>Mot de passe:</td><td><input type="password" name="pwd"></td></tr> <tr><td>Se souvenir de moi ?</td><td><input type="checkbox" name="souvenir"></td></tr> </table> <input type="submit" value="ok"> </form>'; break; case "co": if (empty($_POST['ident']) || empty($_POST['pwd'])) { echo'<p>Vous devez remplir tous les champs</p>'; header ("Refresh: 1;URL=./connexion.php?action=connexion"); } else //On check le mot de passe { $query=$db->prepare('SELECT * FROM utilisateur WHERE login=:login OR email=:email'); $query->bindValue(':login',$_POST['ident'], PDO::PARAM_STR); $query->bindValue(':email',$_POST['ident'], PDO::PARAM_STR); $query->execute(); $data=$query->fetch(); if($data['rang']==2) { if ($data['pwd'] == md5($_POST['pwd'])) { $_SESSION['id'] = $data['id']; $_SESSION['login'] = $data['login']; $_SESSION['rang'] = $data['rang']; header ("Location:../participant/index.php"); if (isset($_POST['souvenir'])) { $expire = time() + 365*24*3600; setcookie('id', $_SESSION['id'], $expire); } } } else { if ($data['pwd'] == md5($_POST['pwd'])) { $_SESSION['id'] = $data['id']; $_SESSION['login'] = $data['login']; $_SESSION['rang'] = $data['rang']; header ("Location:../admin/index.php"); if (isset($_POST['souvenir'])) { $expire = time() + 365*24*3600; setcookie('id', $_SESSION['id'], $expire); } } } } break; ?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 oct. 2016, 16:00

il faut que tu penses que cela peut ne rien retourner (erreur pseu / email / mot de passe) et dans ce cas $data['rang'] n'existe pas :)
pour éviter cela test si $data === false => erreur sinon c'est que tu as des données et que donc tu peux tester les droits et autre.

tu peux aussi factoriser ton code la chose qui change c'est le header

un truc dans le genre
<?php
case "connexion":
echo'<form method="POST" action="./connexion.php?action=co">
<table>
<tr><td>Login:</td><td><input type="text" name="ident"></td></tr>
<tr><td>Mot de passe:</td><td><input type="password" name="pwd"></td></tr>
<tr><td>Se souvenir de moi ?</td><td><input type="checkbox" name="souvenir"></td></tr>
</table>
<input type="submit" value="ok">
</form>';
break;
case "co":
    if (empty($_POST['ident']) || empty($_POST['pwd']))
    {
        echo'<p>Vous devez remplir tous les champs</p>';
        header ("Refresh: 1;URL=./connexion.php?action=connexion");
    }
    else //On check le mot de passe
    {
        $query=$db->prepare('SELECT * FROM utilisateur WHERE login=:login OR email=:email');
        $query->bindValue(':login',$_POST['ident'], PDO::PARAM_STR);
        $query->bindValue(':email',$_POST['ident'], PDO::PARAM_STR);
        $query->execute();
        $data=$query->fetch();
        if($data !== false)
        {
           if ($data['pwd'] == md5($_POST['pwd']))
           {
               $_SESSION['id'] = $data['id'];
               $_SESSION['login'] = $data['login'];
               $_SESSION['rang'] = $data['rang'];

               if (isset($_POST['souvenir']))
               {
                   $expire = time() + 365*24*3600;
                   setcookie('id', $_SESSION['id'], $expire);
               }
               $url = '../participant/index.php';
               // bon la il vaut mieux tester le code rang pour admin :-)
               if($data['rang']!=2){
                   $url = '../admin/index.php'
               }
               header ('Location: '.$url);
           }
        }else {
            // Utilisateur ou mot de passe érronée (ne pas donner plus d'info)
        }
    }
break;
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 63 Messages

11 oct. 2016, 16:54

yep ça fonctionne bien comme ça aussi ;)
merci.