× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum des Webmasters
 Verifier unicité du pseudo et mail dans formulaire
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
nico3009
  Posté le 29/09/2007 @ 15:24 
Aller en bas de la page 
Petit astucien

Bonjour,

je m'explique donc : je voudrais vérifier lors de la saisi des variables dans un formulaire que le pseudo utilisé n'est pas déjà pris dans ma table. J'ai déjà mis "unique" pour ces 2 champs dans la table mais j'ai quand même le message : votre inscription a été validée quand on prend un pseudo ou mail déjà pris (bien que ma table ne s'alimente pas dans ce cas).

J'ai un deuxième souci : je n'arrive pas à insérer le code correct qui fasse qu'à la validation du formulaire je sois redirigé vers une autre page de mon site.

Voici don mon script php :

<?php
$hostname = "sql.free.fr";
$user = "********";
$password = "******";
$nom_base_donnees = "********";
$nom= $_POST['nom'];
if(empty($nom))
{
print("<center>Le '<b>Nom</b>' doit être renseigné !</center>");
exit();
}
$prenom = $_POST['prenom'];
if(empty($prenom))
{
print("<center>Le '<b>Prénom</b>' doit être renseigné !</center>");
exit();
}
$pseudo = $_POST['pseudo'];
if(empty($pseudo))
{
print("<center>Le '<b>Pseudo</b>' doit être renseigné !</center>");
exit();
}
$email = $_POST['email'];
$point = strpos($email,".");
$aroba = strpos($email,"@");
if($point=='')
{
print("Votre Email doit comporter un <b>point</b>");
exit();
}
elseif($aroba=='')
{
print("Votre Email doit comporter un <b>'@'</b>");
exit();
}
if(empty($email))
{
print("<center>L' '<b>Email</b>' doit être renseigné !</center>");
exit();
}
$mdp = $_POST['mdp'];
if (strlen($mdp) < 6)
{
print("<center>Le '<b>Mot de Passe</b>' doit contenir au minimum 6 caractères !</center>");
exit();
}
if(empty($mdp))
{
print("<center>Le '<b>Mot de Passe</b>' doit être renseigné !</center>");
exit();
}
print("<center>Votre inscription a bien été validée</center>");
mysql_connect($hostname, $user, $password, $nom_base_donnees) or die(mysql_error());
mysql_select_db($nom_base_donnees);
mysql_query("INSERT INTO utilisateurs VALUES('', '". $nom ."', '". $prenom ."', '". $pseudo ."', '". $email . "', '".$mdp."')");
$result = mysql_query or die('Query failed');
mysql_close();
?>

Publicité
Malcolm
 Posté le 30/09/2007 à 10:17 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

alors c'est un défaut de conception...

Avec ton code $email = $_POST['email'];
$point = strpos($email,".");
$aroba = strpos($email,"@");

je peux mettre malcolm.@truc et ça marchera ... puisqu'il ne fait que détecter la présence d'un point et d'un email.

L'erreur vient du fait que tu vérifies partout que !empty et à la fin, tu affiches la phrase, or c'est faux : tu ne dois l'afficher que si l'insertion MySQL s'est bien déroulée ...

je te conseille plutôt de travailler comme ceci :

  1. <?php
  2. // d'abord on récupère les variables
  3. $nom = (isset($_POST['nom'])) ? $_POST['nom'] : '';
  4. $prenom = (isset($_POST['prenom'])) ? $_POST['prenom'] : '';
  5. $pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : '';
  6. $email = (isset($_POST['email'])) ? $_POST['email'] : '';
  7. $mdp = (isset($_POST['mdp'])) ? $_POST['mdp'] : '';
  8. // à ce point toutes les variables sont soit définies, soit vides
  9. // ensuite on vérifie l'email
  10. $pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$";
  11. $email = (eregi($pattern,$email)) ? $email : '';
  12. // à ce point, si l'email correspond bien au schéma-type fourni, la variable $email reste telle quelle, sinon la variable est vidée
  13. // maintenant on vérifie.
  14. $erreur = false; // aucune erreur pour le moment.
  15. if($nom == '')
  16. {
  17. echo '<center>Le <strong>Nom</strong> doit être renseigné !</center>';
  18. $erreur = true;// oui, erreur
  19. }
  20. if($prenom == '')
  21. {
  22. echo '<center>Le <strong>Prénom</strong> doit être renseigné !</center>';
  23. $erreur = true;// oui, erreur
  24. }
  25. if($pseudo == '')
  26. {
  27. echo '<center>Le <strong>Pseudo</strong> doit être renseigné !</center>';
  28. $erreur = true;// oui, erreur
  29. }
  30. if ($email == '')
  31. {
  32. echo "<center>Votre <strong>E-mail</strong> n'a pas été renseigné ou est incorrect.</center>";
  33. $erreur = true;// oui, erreur
  34. }
  35. if (strlen($mdp) < 6)
  36. {
  37. echo '<center>Votre <strong>Mot de Passe</strong> doit contenir au moins 6 caractères.</center>';
  38. $erreur = true;// oui, erreur
  39. }
  40. // Maintenant, insertion dans la base de données
  41. if (!$erreur) // s'il n'y a toujours pas d'erreur
  42. {
  43. // paramètres MySQL
  44. $hostname = "sql.free.fr";
  45. $user = "********";
  46. $password = "******";
  47. $nom_base_donnees = "********";
  48. mysql_connect($hostname, $user, $password) or die(mysql_error());
  49. mysql_select_db($nom_base_donnees);
  50. $req_ajout_utilisateur = "INSERT INTO utilisateurs VALUES('', '". addslashes($nom) ."', '". addslashes($prenom) ."', '". addslashes($pseudo) ."', '". addslashes($email) . "', '".md5($mdp)."');";
  51. if (mysql_query($req_ajout_utilisateur))
  52. {
  53. echo '<center>Votre inscription a bien été validée !</center>';
  54. }
  55. else
  56. {
  57. echo '<p>Il y a eu un souci avec la base de données, veuillez réessayer SVP.</p>';
  58. }
  59. }
  60. else // $erreur = true : il y a eu une erreur quelque part
  61. {
  62. echo '<center>Impossible de terminer votre inscription, vérifiez vos saisies et réessayez.</center>';
  63. };
  64. ?>



Les avantages :

1- toutes les variables sont récupérées au début

2- toutes les variables ont une valeur par défaut

3- l'email est mieux vérifié

4- on n'utilise les identifiants QUE s'il n'y a pas eu d'erreur

Remarques annexes :

1- ça ne sert à rien de faire mysql_query("INSERT INTO ...") puis ligne suivante $resultat = mysql_query : ça retournera une erreur (puisque mysql_query attent un paramètre : la requête SQL)

2- dans la requête j'ai mis des addslashes un peu partout, ça sert à éviter les problèmes d'apostrophe (puisque l'apostrophe sert à délimiter les champs mysql) cont un mot entré par le formulaire tel que "L'idée" sera retranscrit "L\\'idée" : il suffira de faire un stripslashes($nom) par exemple pour virer l'antislash en trop (s'il y a plus d'un antishash, c'est le forum qui en affiche trop ... Et sinon il suffit de faire stripslashes(stripslashes($nom)).).

3- mot de passe : j'ai mis md5($mdp) : cela permet de "crypter" (ce n'est pas *réelement* un cryptage, mais un hashage) le mot de passe. D'un mot de passe quelconque, me MD5 te ressortira une chaine d'une trentaine de caractères, afin de préserver le "secret" du mot de passe des inscrits.

4- en règle générale, on ne met pas les identifiants dans une page comme ça : si demain tu changes d'hébergeur, il faudra refaire toutes tes pages pour les remplacer... Il vaut mieux les mettre seuls dans une page (ainsi que mysql_connect et mysql_select_db) et faire require('nom_de_cette_page_d_identifiants.php');

De cette façon, tous les scripts incluant les mêmes identifiants, s'il y a besoin de les changer, ça ne sera à faire qu'une fois. L'autre avantage, c'est que ce fichier (nommé pour l'exemple nom_de_cette_page_d_identifiants.php) peut être mis seul dans un dossier avec les protections et restrictions nécessaires.

5- Attention, empty( n'est pas isset( : empty(0) retourne true... PHP étant faiblement typé, j'ai préféré passé par autre chose.

6- Apprends à identer le code source, et à le commenter : je ne sais pas si ce forum retranscrit l'indentation, mais si tu ne l'as pas fait ça peut être intéressant d'apprendre.

7- j'ajoute encore que rien ne sert de tester si le mot de passe est vide : s'il contient 0 caractères, il en contient forcément moins de 6 donc il ne sera apas correct.



Modifié par Malcolm le 30/09/2007 10:25
nico3009
 Posté le 01/10/2007 à 13:33 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Je te remercie Malcom, c'est vraiment du bonheur ce script. Comme tu as surement du le constater, je ne suis pas programmateur et il y a 1 mois de ça je ne connaissais rien à tout ça.

Donc, pour en revenir à ce script, c'est clair que la confidentialité du mdp est essentielle et çà, je n'y avais pas fait trop cas. La chronologie du script est aussi importante en fait et c'est vrai que tes explications sont plus qu'intéressantes.

Je voulais donc seulement savoir si tu sais comment rajouter un bouton "retour au formulaire" en cas d'erreur et créer une redirection automatique vers une autre page (qui se nommerait index2.html par exemple) de façon à voir : "Votre inscription a bien été validée !" pendant 2 secondes à peu près et retomber sur index2.html.

Un peu compliqué peut être, mais je n'arrive pas à trouver d'explications claires (pour moi) sur les forums.

Merci.

Malcolm
 Posté le 12/10/2007 à 19:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Hello, pour le bouton "retour au formulaire", c'est un peu plus complexe. (pas compliqué, mais complexe) Le formulaire, c'est une suite de champs en HTML donc si tu fais un simple lien vers la page qui l'affiche, tu ne verras que le formulair mais rien de ce que le visiteur a rempli ... Il faudrait donc repasser en paramètre (caché pourquoi pas) et, dans la page HTML, pour chaque champ <input> mettre value="<?php echo $variable; ?>" avec $variable qui vaut ce que le visiteur a coché. Ce que je fais à titre perso, c'est le traitement et l'affichage du formulaire sur une même page. Concrètement, une page d'extention .php se présente ainsi (telle que je la produis) : <?php if (isset($_POST['submit'])) { // ici le bouton submit a été validé ... on traite le formulaire $erreur = false; // par défaut pas d'erreur //[...] puis je récupère mes variables, j'analyse comme je veux, etc. Si une erreur est rencontrée, je fais passer $erreur à true. }; // fin du if (isset($_POST['submit'])) if ($erreur) { // il y a eu une erreur, qq part : afficher un texte explicatif [...] }; // fin du if ($erreur) // maintenant j'affiche le formulaire soit si $_POST['submit'] n'existe pas (donc formulaire pas encore soumis) soit si $erreur est TRUE (il y a eu une erreur qq part) if ((!isset($_POST['submit'])) || ($erreur)) { <form method="post" action=""> ... <input type="text" name="nom" value="<?php echo $nom; ?>"> </form> }; ?> bien entendu, j'ai mis ici name="nom" et echo $nom, ça dépend du nom des champs et du nom des valeurs ... Pour la redirection automatique, il n'y en a pas forcément besoin : à la fin du if (isset($_POST['submit'])) si $erreur est toujours false, tu peux très bien afficher un message de succès de l'inscription (s'il s'agit d'une inscription p.ex.) et faire une redirection javascript, sur l'URL de ton choix ... comme ceci (dans un code PHP) : echo '<script type="text/javascript">'; echo "window.setTimeout(\"location=('index.html');\",3000)"; echo '</script>'; le timeout 3000 est exprimé en millisecondes et il faut bien mettre des antislash (un seul) avant les guillemets doubles juste après setTimeout( et avant location= pour le premier et avant ,3000 pour le second.
cekica
 Posté le 13/10/2007 à 10:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Malcolm a écrit :

  1. <?php
  2. // d'abord on récupère les variables
  3. $nom = (isset($_POST['nom'])) ? $_POST['nom'] : '';
  4. $prenom = (isset($_POST['prenom'])) ? $_POST['prenom'] : '';
  5. $pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : '';
  6. $email = (isset($_POST['email'])) ? $_POST['email'] : '';
  7. $mdp = (isset($_POST['mdp'])) ? $_POST['mdp'] : '';
  8. // à ce point toutes les variables sont soit définies, soit vides

Très pratique, ca va me faire gagner des lignes de code

Mais juste une question, il se passe quelque chose dans ces lignes lors le champs retour une valeur nulle ?

Malcolm
 Posté le 13/10/2007 à 10:23 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

c'est une structure ternaire, qui équivaut à un "if" :

par exemple, écrire $prenom = (isset($_POST['prenom'])) ? $_POST['prenom'] : ''; équivaut à écrire :

if (isset($_POST['prenom']))
{
$prenom = $_POST['prenom'];
}
else
{
$prenom = '';
}



donc si ton champ n'a pas été rempli, le tableau $_POST n'a pas de clé nommée "prénom" => la variable $prenom sera déclarée en tant que chaîne vide. EDIT : je n'ai fait que récupérer les variables, dans cet exemple, mais il faudrait ajouter bien d'autres choses pour assurer leur sécurisation.

Modifié par Malcolm le 13/10/2007 10:24
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
15,99 €Lot de 50 masques chirurgicaux à 15,99 €
Valable jusqu'au 24 Septembre

Amazon propose le lot de 50 masques chirurgicaux à 15,99 €. La livraison est gratuite pour les membres Prime et gratuite à partir de 25 € pour les autres (si vous prenez 2 lots donc). Pour les moins pressés, vous pouvez les faire venir directement de Chine à 3,17 € le lot de 50 masques. Dans ce cas cela peut prendre plusieurs semaines à arriver.


> Voir l'offre
-10€ | -20€10 € dès 59 € d'achat, 20 € dès 149 € chez Rakuten
Valable jusqu'au 23 Septembre

Rakuten offre aujourd'hui 10 € de réduction dès 59 € d'achats sur son site avec le code RAKUTEN10 et 20 € de réduction dès 149 € d'achats avec le code RAKUTEN20. Sachant que des boutiques françaises comme Boulanger, Ubaldi ou encore Samsung vendent sur Rakuten aux mêmes conditions que dans leurs magasins, cela peut être intéressant.


> Voir l'offre
94,75 €SSD externe portable USB 3.1 SanDisk Extreme PRO 500 Go (1050 Mo/s) à 94,75 € livré
Valable jusqu'au 24 Septembre

Amazon Allemagne fait une promotion sur le SSD externe portable USB 3.1 SanDisk Extreme PRO 500 Go qui passe à 89,99 €. Comptez 4,76 € pour la livraison en France soit un total de 94,75 € livré alors qu'on trouve le SSD à 160 € ailleurs. Le disque SSD SanDisk Extreme Pro Portable 500 Go permet, grâce à sa connectique USB 3.1, des haute vitesse de transfert pouvant aller jusqu'à 1050 Mo/s grâce au disque NVMe qu'il contient. Sa coque robuste et certifiée IP55 (eau et poussière) protège vos données partout où vous allez. Vous ne craindrez pas de l'emporter partout avec vous grâce à sa conception robuste et résistante avec un coeur de SSD résistant aux chocs. Le logiciel SanDisk inclu SecureAccess peut crypter vos fichiers personnels. Garantie 3 ans. Interface : USB 3.1 Type A et C.

Vous pouvez utiliser votre compte Amazon France sur Amazon Allemagne et il n'y a pas de douane. Si vous êtes perdu en allemand, vous pouvez traduire le site en anglais.


> Voir l'offre

Sujets relatifs
Envoi checkbox par mail dans formulaire php
affichage adresse mail dans formulaire
Formulaire envoyer dans mon adresse MAIL
le formulaire n'arrive pas dans ma boîte e-mail !
Adresse e-mail fantôme dans GMail ?
Pas de mail recu avec formulaire html et php
Insérer un formulaire dans page " Contact"
formulaire mail php5
Formulaire & Pièce Jointe par Mail (HTML/Php)
recuperation formulaire dans les variables php
Plus de sujets relatifs à Verifier unicité du pseudo et mail dans formulaire
 > Tous les forums > Forum Forum des Webmasters