Je m'explique concrètement : j'ai un formulaire d'inscription sur un site internet que j'ai essayé de rendre assez dynamique :
- dans un premier temps on demande au client comment il s'appelle (nom, prénom, civilité),
- on vérifie avec les informations données s'il n'existe pas déjà dans la base de données,
- puis si oui, on lui demande un email, de saisir un identifiant et un mot de passe.
Des messages d'erreurs ont été prévus également, mais le problème est que l'insertion se passe en double : en effet tout se passe bien sauf au niveau de l'insertion.
Ne pouvant être plus précise sur mon problème je vous montre mon code :
Mon premier formulaire envoyé avec de l'ajax :
<form id="veriform" action="functions/verif.php" method="POST">
<h2 class="hInscriptionCenter animated bounceInLeft phase1">Pour commencer...</h2>
<h3 class="hInscriptionCenter animated bounceIn phase1"><span class="titleInscription">①</span><div class="titleInscription"></div></h3>
<h4 class="hInscriptionCenter animated fadeIn phase1">Qui êtes-vous ?</h4>
<div class="form-group phase1"><select name="civilite" id="civilite" required><option disabled selected>Civilité</option><option value="mlle">Mlle</option><option value="mme">Mme</option><option value="mr">Mr</option></select></div>
<div class="form-group phase1"><label for="nom">Nom de famille</label><input type="text" class="form-control underlined" name="finame" id="finame" placeholder="Votre nom" required></div>
<div class="form-group phase1"><label for="prenom">Prénom</label><input type="text" class="form-control underlined" name="fifname" id="fifname" placeholder="Votre prénom" required></div>
<div id="diverif"></div>
<button id="verifInscri" class="btn btn-primary">Continuer <i class="fa fa-chevron-right"></i> </button>
</form>
$('#veriform').submit(function(event){
var formUrl = $(this).attr("action");
var formdatas = $(this).serialize();
$.ajax(
{
url : formUrl,
type: "POST",
data: formdatas,
success:function(data, textStatus, jqXHR)
{
$('#diverif').html(data);
if($('#diverif .card .card-header .header-block p').hasClass('good')){
$('.phase1').hide(100);
$('#verifInscri').hide();
$('#formInscri').show();
}
}
});
event.preventDefault();
});
$('#verifInscri').click(function(){
$('#civil').val($('select#civilite option:selected').val());
$('#name').val($('#finame').val());
$('#fname').val($('#fifname').val());
$('#veriform').submit();
});
La vérification :
<?php
$lien = mysqli_connect('localhost','root','root','ls_bdd');
mysqli_query($lien,"SET NAMES UTF8");
if((isset($_POST['civilite']) && $_POST['civilite'] !== "") && (isset($_POST['finame']) && $_POST['finame'] !== "") && (isset($_POST['fifname']) && $_POST['fifname'] !== "")){
$req = "SELECT * FROM ls_membres WHERE name='".$_POST['finame']."' AND firstName='".$_POST['fifname']."';";
$res = mysqli_query($lien,$req);
if (!$res) {
echo "Erreur SQL : $req <br>".mysqli_error($lien);
}
else
{
$correct = mysqli_num_rows($res);
if ($correct==1) {
echo "<div class=\"card card-warning animated rubberBand\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"title\"><i class=\"fa fa-times-circle\"></i>Oups ! Une personne au même nom et prénom est déjà connue par notre système. <br/> <span class=\"asterix\"><b>Conseil :</b> Si le problème persiste, vous pouvez toujours saisir votre surnom.</span></p>
</div>
</div>
</div>";
}
else{
echo "<div class=\"card card-success\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"good title\"><i class=\"fa fa-check-circle\"></i>À première vue, notre système ne vous connaît pas.</p>
</div>
</div>
</div>";
}
}
}
else{
echo "<div class=\"card card-warning animated rubberBand\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"title\"><i class=\"fa fa-times-circle\"></i>Un des champs n'a pas été saisi correctement ! Veuillez réessayer.</p>
</div>
</div>
</div>";
}
?>
Puis le deuxième formulaire :
<form id="formInscri" method="post" action="functions/traitement.php" style="display:none">
<h2 class="hInscriptionCenter animated bounceInLeft phase2">Maintenant...</h2>
<h3 class="hInscriptionCenter animated bounceIn phase2"><span class="titleInscription">②</span><div class="titleInscription"></div></h3>
<h4 class="hInscriptionCenter animated fadeIn phase2">Veuillez définir vos éléments de connexion !</h4>
<div class="form-group phase2"><label for="email">Email</label><input type="text" class="form-control underlined" id="fiemail" placeholder="Votre adresse email" required></div>
<div class="form-group phase2"><label for="ident">Choisir un identifiant</label><input type="text" class="form-control underlined" id="fiident" placeholder="Veuillez saisir un identifiant" required></div>
<div class="form-group phase2"><label for="mdp">Choisir un mot de passe</label><input type="password" class="form-control underlined" id="fimdp" placeholder="Veuillez taper un mot de passe" required></div>
<input type="hidden" name="civilite" id="civil" value=""/>
<input type="hidden" name="name" id="name" value=""/>
<input type="hidden" name="fname" id="fname" value=""/>
<input type="hidden" name="email" id="email" value=""/>
<input type="hidden" name="ident" id="ident" value=""/>
<input type="hidden" name="mdp" id="pswd" value=""/>
<div id="divresult"></div>
<button id="traitementDonnees" class="btn btn-primary"><i class="fa fa-check-circle"></i> S'inscrire </button>
</form>
Son envoi en ajax :
<script>
$('#formInscri').submit(function(event){
var formUrl = $(this).attr("action");
var formdatas = $(this).serialize();
$.ajax(
{
url : formUrl,
type: "POST",
data: formdatas,
success:function(data, textStatus, jqXHR)
{
$('#divresult').html(data);
if($('#divresult .card .card-header .header-block p').hasClass('good')){
$('.phase2').hide(100);
$('#diverif').hide();
$('#traitementDonnees').hide();
}
}
});
event.preventDefault();
});
$('#traitementDonnees').click(function(){
$('#civil').val($('select#civilite option:selected').val());
$('#name').val($('#finame').val());
$('#fname').val($('#fifname').val());
$('#email').val($('#fiemail').val());
$('#ident').val($('#fiident').val());
$('#pswd').val($('#fimdp').val());
$('#formInscri').submit();
});
</script>
Et son traitement en PHP :
$lien = mysqli_connect('localhost','root','root','ls_bdd');
mysqli_query($lien,"SET NAMES UTF8");
if((isset($_POST['civilite']) && $_POST['civilite'] !== "") && (isset($_POST['name']) && $_POST['name'] !== "") && (isset($_POST['fname']) && $_POST['fname'] !== "") && (isset($_POST['email']) && $_POST['email'] !== "") && (isset($_POST['ident']) && $_POST['ident'] !== "") && (isset($_POST['mdp']) && $_POST['mdp'] !== "")){
if(preg_match('#^(?=.*[a-z]).{6,}$#', $_POST['mdp'])) {
$civilite = $_POST['civilite'];
if($civilite == "mr"){$sexe = "m";}else{$sexe = "f";}
$date_i = date("Y-m-d");
if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$_SESSION['civiliteInscription'] = $civilite;
$_SESSION['nameInscription'] = $_POST['name'];
$_SESSION['fnameInscription'] = $_POST['fname'];
$_SESSION['identInscription'] = $_POST['ident'];
$_SESSION['emailInscription'] = $_POST['email'];
$_SESSION['mdpInscription'] = md5($_POST['mdp']);
$_SESSION['date_inscription'] = $date_i;
$_SESSION['sexe'] = $sexe;
}
else{
echo "<div class=\"card card-warning animated rubberBand\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"title\"><i class=\"fa fa-times-circle\"></i> Le format de l'adresse email n'est pas adapté !</p>
</div>
</div>
</div>";
}
}
else{
echo "<div class=\"card card-warning animated rubberBand\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"title\"><i class=\"fa fa-times-circle\"></i> Veuillez choisir un mot de passe à au moins 6 caractères (lettres et chiffres) !</p>
</div>
</div>
</div>";
}
}
else{
echo "<div class=\"card card-warning animated rubberBand\">
<div class=\"card-header\">
<div class=\"header-block\">
<p class=\"title\"><i class=\"fa fa-times-circle\"></i> Aïe ! Certains champs n'ont pas été saisis correctement !</p>
</div>
</div>
</div>";
}
$req = "INSERT INTO ls_membres(id, civilite, name, firstName, identifiant, email, pwd, groupe, photo) VALUES (NULL,\"".$_SESSION['civiliteInscription']."\",\"".$_SESSION['nameInscription']."\",\"".$_SESSION['fnameInscription']."\",\"".$_SESSION['identInscription']."\",\"".$_SESSION['emailInscription']."\",\"".$_SESSION['mdpInscription']."\",'membre','../img/ss_pdp.png');";
$res = mysqli_query($lien,$req);
if (!$res) {
echo "Erreur SQL : $req <br>".mysqli_error($lien);
}
NB : si j'ai mis des sessions c'est juste pour pouvoir les réutiliser ailleurs dans le code, croyant que la requête était répétée, mais j'ai essayé un simple INSERT INTO VALUES (valeurs) ailleurs dans traitement.php et la requête est toujours exécutée deux fois.
Petite précision, j'ai déjà essayer d'utiliser IGNORE...
Comment faire s'il vous plaît ?