Formulaire de connexion jQuery - Ajax [Résolu]

-
Bonjour,
J'ai un petit souci qui me bloque dans mon code ajax. En effet, j'ai un formulaire de connexion dans une popup, j'aimerais quand je le valide qu'il me renvoie vers un autre formulaire sans recharger la page (étape suivante popup). Tout ça marche parfait mais mon problème c'est quand un utilisateur saisit une adresse mail qui n'est pas valide pour se connecter, j'aimerais rester sur la même popup et lui afficher le message d'erreur. Mais dès que je saisisse un émail invalide ça me renvoie vers l'autre popup et en plus m'affiche le message d'erreur.

Ci-dessous le code :


<div class="popup">
<div id="status1"></div>
// Formulaire connexion
<form method="post" action="action1.php" id="myform1">
<input type="text" name="email" id="email">
<input type="submit" value="Valider">
</form>

<div id="status2"></div>
// Formulaire
<form method="post" action="action2.php" id="myform2">
<input type="text" name="titre" id="titre">
<input type="submit" name="valider" value="Valider">
</form>
</div>


// Ajax : traitement formulaire connexion
$(document).ready(function() {
$('#myform1').on('submit', function(e) {
e.preventDefault();

var $this = $(this);
// on sécurise les données
var email = encodeURIComponent($('#email').val());

if(email === '') {
$('#status1').html('<p class="error">Champ invalide !</p>');
} else {
$.ajax({
url: 'action1.php',
type: 'post',
data: $this.serialize(),
dataType: 'json',
success: function(data){
var myVar = data.split(';')[0];

if (myVar !== '') {
$('#status2').html(myVar);
$('#myform2').show();
$('#myform1').hide();
}
}
});
return false;
}
});


// PHP
session_start();

header('Content: application/json', 1);

include('db.php');

// Traitement connexion
if (isset($_POST['valider'])) {
if (isset($_POST['email'])) {
$email = $_POST['email'];

$q = array('email'=>$email);
$sql = "SELECT count(*) AS nbr, email FROM users WHERE email = :email GROUP BY email";
$req = $db->prepare($sql);
$req->execute($q) or die(print_r($db->errorInfo()));
$data = $req->fetch(PDO::FETCH_ASSOC);

if($data['nbr'] == 1) {
$_SESSION['auth'] = 'ok';

$_SESSION['id'] = $data ['id'];

$_SESSION['email'] = $email;

echo '<p class="success">Vous avez été connecté avec succès.</p>;';

$returnVal = array('myVar', $_SESSION['id']);
echo json_encode($returnVal);
exit(0);
} else {
echo '<p class="error">Erreur lors de la connexion, veuillez vérifier votre adresse mail !</p>';
}
} else {
echo '<p class="error">Vous avez oublié de remplir le champ !</p>';
}
}


J'aimerais faire en sorte que quand je valide mon formulaire avec une fausse adresse mail d'afficher une message d'erreur et de rester sur la même popup de connexion. En cas de success avec une bonne adresse, passer directement au formulaire suivant et afficher le message de succès. J'ai regardé sur la FAQ et sur les autres forums mais R.A.S.

Merci par avance !
Afficher la suite 

Votre réponse

8 réponses

Messages postés
23563
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
0
Merci
Bonjour,


Mais dès que je saisisse un émail invalide ça me renvoie vers l'autre popup

En même temps... ton IF pour l'instant ne fait que vérifier que le champ email n'est pas vide...
 if(email === '') {


Pour vérifier si le format du mail est valide il te faut utiliser une regex.
Par exemple :
function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

Et pour l'utiliser (dans ton if..)
 if(email === '' || !validateEmail(email)) {

Commenter la réponse de jordane45
0
Merci
Bonjour @jordane45,

Merci d'avoir pris le temps de me répondre et merci des explications. En fait, mon problème n'est pas la validation du format de mail, mais plutôt la vérification de l'existence du mail dans la base de données. C'est pour empêcher la connexion d'utilisateur qui n'est pas inscrit sur le site. Mais ça je l'ai fait en php puisque j'ai un message d'erreur qui s'affiche en cas de saisie d'un mail qui n'existe pas. Ce que j'aimerais faire est que ce message s'affiche sur la popup de connexion sans qu'il y ait passage à la 2eme popup.

En cas de succès (validation mail existant) je passe directement à la popup suivante (2eme) et mon message de succès s'affiche là.

Est-ce que j'ai bien expliqué mon problème?

Cdlt,
Commenter la réponse de Utilisateur anonyme
Messages postés
1663
Date d'inscription
vendredi 9 mai 2008
Statut
Modérateur
Dernière intervention
3 novembre 2018
0
Merci
il faut gerer le retour ajax

sur cette tu ne fait que tester si myVar est vide

if (myVar !== '') {
                        $('#status2').html(myVar);
                        $('#myform2').show();
                        $('#myform1').hide();
                    }  


teste déjà le retour en mettant une alerte ou un console.log et après tu décidé de l'action en fonction de la réponse.

alert(myVar)

Commenter la réponse de @karamel
0
Merci
Re,

J'ai modifié mon code que j'ai mis ci-dessus. Ça marche quand je saisie une fausse adresse mail mais je n'arrive pas maintenant à afficher le message de succès sur la 2eme popup.

Au début j'ai une erreur de ce type : SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data.

L'origine de l'erreur vient du dataType: 'json'. Quand je l'enlève je n'ai plus l'erreur.

Merci !


// PHP
session_start();

header('Content: application/json', 1);

include('db.php');

// Traitement connexion
if (isset($_POST['valider'])) {
$retour['valid'] = 0;
if (isset($_POST['email'])) {
$email = $_POST['email'];

$q = array('email'=>$email);
$sql = "SELECT count(*) AS nbr, email FROM users WHERE email = :email GROUP BY email";
$req = $db->prepare($sql);
$req->execute($q) or die(print_r($db->errorInfo()));
$data = $req->fetch(PDO::FETCH_ASSOC);

if($data['nbr'] == 1) {
$_SESSION['auth'] = 'ok';
$_SESSION['id'] = $data ['id'];
$_SESSION['email'] = $email;

$retour["message"]= '<p class="success">Vous avez été connecté avec succès.</p>;';
$retour['valid'] = 1;
$retour['myVar']= $_SESSION['id'];
exit();
} else {
$retour["message"] = '<p class="error">Erreur lors de la connexion, veuillez vérifier votre adresse mail !</p>';
}
} else {
$retour["message"] = '<p class="error">Vous avez oublié de remplir le champ !</p>';
}
echo json_encode($retour);
}


// Ajax : traitement formulaire connexion
$(document).ready(function() {
$('#myform1').on('submit', function(e) {
e.preventDefault();

var $this = $(this);
// on sécurise les données
var email = encodeURIComponent($('#email').val());

if(email === '') {
$('#status1').html('<p class="error">Champ invalide !</p>');
} else {
$.ajax({
url: 'action1.php',
type: 'post',
data: $this.serialize(),
dataType: 'json',
success: function(data){
$resultat = $.parseJSON(data);
var myVar = $resultat['myVar'];

if ($resultat['valid']==1) {
$('#status2').html(myVar);
$('#myform2').show();
$('#myform1').hide();
}else{
$('#status1').html($resultat['message']);
}
}
});
return false;
}
});
});
Commenter la réponse de Utilisateur anonyme
Messages postés
23563
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
0
Merci
Bonjour,


Côté PHP :
<?php
// PHP
session_start();
 
include('db.php');
$retour = array(); //initialisation variable de retour


//Récupération PROPRE des variables AVANT de les utilser
$email = !empty($_POST['email']) ? $_POST['email'] : NULL;
$valider = !empty($_POST['valider']) ? $_POST['valider'] : NULL;


// Traitement connexion
if ($valider) {
 if ($email) {
        $sql = "SELECT count(*) AS nbr, email FROM users WHERE email = :email GROUP BY email";
  $q = array(':email'=>$email);
  
  try{
    $req = $db->prepare($sql);
    $req->execute($q);
    $data = $req->fetch(PDO::FETCH_ASSOC);
  }catch(Exception $e){
    //en cas d'erreur dans la requete
    $retour['valid'] = 0;
    $retour['message'] = $e->getMessage();
  }
  
        if($data['nbr'] == 1) {
          $_SESSION['auth'] = 'ok';
          $_SESSION['id'] = $data ['id'];
          $_SESSION['email'] = $email;
          $retour["message"]= '<p class="success">Vous avez été connecté avec succès.</p>;';
          $retour['valid'] = 1;
          $retour['myVar']= $_SESSION['id'];
        } else {
    $retour['valid'] = 0;
    $retour["message"] = '<p class="error">Erreur lors de la connexion, veuillez vérifier votre adresse mail !</p>';
        }
    } else {
      $retour['valid'] = 0;
      $retour["message"] = '<p class="error">Vous avez oublié de remplir le champ !</p>';
    }
}else{
 $retour['valid'] = 0;
 $retour['message'] = "<p class='error'>valider n'existe pas !</p>";
}

//on retourne le résultat
echo json_encode($retour);


Côté JS :
// Ajax : traitement formulaire connexion
$(document).ready(function() {
    $('#myform1').on('submit', function(e) {
        e.preventDefault();
 
        var $this = $(this); 
        // on sécurise les données
        var email = encodeURIComponent($('#email').val());
 
        if(email === '') {
            $('#status1').html('<p class="error">Champ invalide  !</p>');
        } else {
            $.ajax({
                url: 'action1.php',
                type: 'post',
                data: $this.serialize(),
                dataType: 'json',
                success: function(data){
      //pour debuguer au cas ou...
      // utilise la console de ton navigateur
      // et regarde ce que t'affiche l'instruction
      // console.log(data)
                   if (data.valid ==1) {
        var myVar = data.myVar;
                        $('#status2').html(myVar);
                        $('#myform2').show();
                        $('#myform1').hide();
                   }else{
                       $('#status1').html(data.message);
                   }
                },
      error: function (request, status, error) {
                   alert(request.responseText);
               }
            });
              return false;
        }
    });
});


Cordialement, 
Jordane                                                                 
Commenter la réponse de jordane45
0
Merci
Bonjour@jordane45,

Merci pour ces précisions. Je ferai le test demain et je reviendrai vers toi.

Bon dimanche !
Commenter la réponse de Utilisateur anonyme
0
Merci
Ça marche très bien. Seulement un petit souci au lien de m'afficher le message ce succès :

$retour["message"] = '<p class="success">Vous avez été connecté avec succès.</p>;';


Il m'affiche l'id de la session utilisateur. Comment masquer cet id et afficher mon message?

Merci !
jordane45
Messages postés
23563
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
-
Ben tu modifies la variable myvar dans le php ou tu changes le code côté javascript pour afficher message au lieu de myvar
Utilisateur anonyme > jordane45
Messages postés
23563
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
-
En fait, le problème ce ma requête n'arrive pas à me renvoyer en même temps le message de succès et l'id de la session. J'en ai besoin de l'id de session pour poursuivre sur la 2e popup. Mais il faut qu'il soit cacher juste le message de succès qui doit s'afficher.

Merci !
Commenter la réponse de Utilisateur anonyme
0
Merci
J'ai réglé le problème.
J'ai juste modifié cette ligne :

$retour["message"] = '<p class="success">Vous avez été connecté avec succès.</p>;';


Par

$retour["myVar"] = '<p class="success">Vous avez été connecté avec succès.</p>;';


Et je l'ai placé juste après cette ligne :
$retour['myVar']= $_SESSION['id'];


Merci beaucoup les gars et surtout @jordane45 pour votre aide !

A bientôt !
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.