Vérification format adresse email

Eléphanteau du PHP | 29 Messages

08 juil. 2009, 09:28

Bonjour tout le monde !

Alors j'ai 2 pages de code : la première en HTML principalement avec un petit formulaire d'inscription et la deuxième en PHP avec une récupération des données pour les enregistrer dans une BDD.

Mon problème c'est que je veux vérifier le format de mon adresse email. J'ai bien cette ligne code : if (preg_match('#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#',$_POST['email'])) { } mais je sais bien où la caser ... Je sais pas où faire la vérification en fait :?

Pourriez-vous m'aider ?

ViPHP
ViPHP | 1136 Messages

08 juil. 2009, 10:13

Salut ,

pour faire très simple et performant , je te conseille d'utiliser la fonction suivante filter_var():


Par exemple :
$retour = filter_var('[email protected]', FILTER_VALIDATE_EMAIL);

if($retour){
     echo "Adresse Valide ! ";
}
Tu as d'autres options ( FLAGS ) possibles , mais je te laisse lire la doc pour en savoir plus ..
Good luck

Ch .

Petit nouveau ! | 6 Messages

08 juil. 2009, 14:02

Si tu veux utiliser les Regex, j'en avais fais une assez simple :
<?php
function isEmail($email) {
	return preg_match("#^([a-z0-9-._]+)@{1}([a-z0-9-]{2,})(\.([a-z0-9]{2,4})){1,2}$#", $email);
}


if( isEmail('[email protected]') ) {
    # Traitement #
} else {
    echo 'L\'adresse e-mail fournie est invalide.';
}
?>
Ou sinon utilise l'astuce donné dans le post précédent qui tout aussi efficace ;) !

Eléphanteau du PHP | 29 Messages

09 juil. 2009, 10:51

Bon j'ai choisi la deuxième solution ( un peu au hasard :P :P ) . Je comprends le raisonnement mais je ne sais pas où la mettre dans mes 2 pages de code ... Ce qui fait qu'elle ne marche pas --' Vous pourriez m'aider encore un peu ?

HELP :?

ViPHP
ViPHP | 2291 Messages

10 juil. 2009, 16:02

Salut,
Peut-être nous montrer ton code :?:
C'est plus simple :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

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

10 juil. 2009, 18:10

Bon j'ai choisi la deuxième solution ( un peu au hasard :P :P ) . Je comprends le raisonnement mais je ne sais pas où la mettre dans mes 2 pages de code ... Ce qui fait qu'elle ne marche pas --' Vous pourriez m'aider encore un peu ?

HELP :?
La fonction d'Angély.dev prend en argument l'adresse mail que tu veux tester et retourne un booléen pour te dire si oui ou non, le format de celle-ci est correct.

Dans tes deux pages de code, il te faut donc trouver l'endroit où php récupère l'email de l'utilisateur (parce que tant que tu l'auras pas récupéré, tu pourras pas le tester ;)) et l'endroit où tu vas l'insulter parce qu'il a saisi n'importe quoi (parce que bon.. hein ?! :p)

Quand tu as répéré ces deux éléments dans ton code, bah tu n'as plus qu'à placer ton test entre les deux pour savoir si tu vas pouvoir l'envoyer promener ou pas. Quant à la position idéale, elle ne dépend que de ta logique. Il faut mettre le test là où il sera le plus pertinent, le plus facile à retrouver, le plus clair à comprendre... bref là où ce sera le plus simple à comprendre pour celui qui dans 6 mois voudra modifier ton code et devra le retrouver (et qui risque, dans 90% des cas, d'être toi ! ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 29 Messages

15 juil. 2009, 17:48

Voici ma page de code ( qui récupère les données, les enregistre et effectue les vérifications ; quant à mon formulaire en html il est dans une autre page ) :
<?php
session_start();
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >


<head>

<title>Formulaire d'inscription</title>

<link href="../style/style.css" rel="stylesheet" type="text/css" />
<link href="../style/layout.css" rel="stylesheet" type="text/css" />

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>


<body id="page1">
<div class="min_width">
<div id="site_center">
<div id="main">

	<!-- Contenu -->
	<div id="content">
    <div class="line_1"></div>
        <p align="center" class="sstitre">Formulaire d'inscription</p>
        <div class="line_1"></div>
        <div class="indent">
        <p align="center">&nbsp;</p>
        
<?php

if(isset($_POST['nom'])) { // Si on envoie le formulaire

// Connexion à la base de données "externalisation"
mysql_connect("localhost", "root");
mysql_select_db("externalisation");

// On récupère les $_POST et on en fait des variables
$_POST = array_map('mysql_real_escape_string', $_POST); // on applique mysql_real_escape_string sur tout le tableau $_POST
$nom = $_POST['nom'];
$mot_de_passe = $_POST['mot_de_passe'];
$email = $_POST['email'];
$datetime = date('Y-m-d') .' '. date('H:i:s');

//Vérification de l'email
function isEmail($email) { 
    return preg_match("#^([a-z0-9-._]+)@{1}([a-z0-9-]{2,})(\.([a-z0-9]{2,4})){1,2}$#", $email); 
} 


if( isEmail('[email protected]') ) { 
    # Traitement # 
} else { 
    echo 'L\'adresse e-mail fournie est invalide.'; 
} 


// On crypte le mot de passe
define('PREFIXE_SHA1', 'p8%B;Qdf78');

$mdp_sha1  = $_POST['mot_de_passe'];

$mdp_sha1 = sha1(PREFIXE_SHA1.$mdp_sha1);

// On part du principe que le nom d'utilisateur est unique, on doit vérifier qu'il n'existe pas déjà ans la table
$requete = "SELECT COUNT(*) AS nb FROM formulaire WHERE utilisateur = '". $nom ."'"; // On crée la requête
$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // On exécute la requête
$donnees = mysql_fetch_array($resultat); // On crée un tableau pour récupérer la valeur que renvoie la requête
$nombre = $donnees['nb']; // On crée une variable qui contiendra le nombre de résultats renvoyé par la requête

	if($nombre == 0) { // Si la variable renvoie 0 c'est que le nom d'utilisateur n'existe pas dans la table donc on peut l'enregistrer
	$requete = "INSERT INTO formulaire VALUES('". $nom ."', '". $mdp_sha1  ."', 1, '". $datetime ."', '". $email ."')";
	$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // on exécute la requête
	echo 'Enregistrement effectué. Vous êtes maintenant inscrit. Merci !<br />';
	
// On crée le message email
$msg1 = 'Merci pour votre inscription et bienvenue sur le site ! Votre identifiant est '. $nom .' et votre mot de passe est '. $mot_de_passe; //Message pour le nouveau membre 
$msg2 = 'Un nouveau membre s\'est inscrit: '. $nom;  //Message pour le webmaster

$recipient = '[email protected]'; //Adresse mail du webmaster
ini_set("sendmail_from",$recipient);
$subject = 'Formulaire d\'inscription'; //On met le sujet du mail

$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$header .= "From:  ". $email ."";


	$mail1 = mail($recipient, $subject, $msg2, $header); //Mail envoyé au webmaster 
	$mail2 = mail($email, $subject, $msg1, $header); //Mail envoyé au nouveau membre
		if($mail1 && $mail2 == true) {
		echo 'Vous allez recevoir un mail avec vos informations.';
		} else {
		echo 'Erreur dans l\'envoi du mail .';
		}
	} else { // Sinon ce nom existe déjà, on insert aucune donnée
	echo 'L\'utilisateur '. $nom .' existe déjà. Veuillez vous réinscrire sous un autre nom d\' utilisateur.';
	}

mysql_close(); // On ferme la connexion
}

?>	

		</div>

        
	<div id="Layer1" style="position:absolute; left:381px; top:26px; width:48px; height:37px; z-index:1"><a href="./../index.php"><img src="../images/retour.jpg" alt="" width="19" height="23" /></a></div>
	</div>
	
	<!-- footer -->
</div>	
</div>
</div>
</body>
</html>
J'ai mis ma vérification d'email après la récupération des variables mais sans succès ... :oops:

Eléphanteau du PHP | 29 Messages

16 juil. 2009, 21:03

Il y a quelqu'un qui pourrait m'éclairer s'il vous plaît ? :oops: :oops:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

17 juil. 2009, 08:57

if( isEmail('[email protected]') ) { 
    # Traitement # 
} else { 
    echo 'L\'adresse e-mail fournie est invalide.'; 
}
Tu as fait un copier/coller sans avoir compris apparemment. Là où tu vois #traitement#, il faut que tu mettes ton code de traitement lorsque le mail est valide.

ViPHP
AB
ViPHP | 5818 Messages

17 juil. 2009, 17:31

Bon j'ai choisi la deuxième solution ( un peu au hasard :P :P )
A mon avis le hasard ne fait pas toujours bien les choses.
Quand elle existe autant utiliser une fonction php donc celle que t'avais montré stopher .
Au fur et à mesure des versions cette fonction sera mise à jour en fonction des besoins, pas ton regex :wink:

Eléphanteau du PHP | 29 Messages

19 juil. 2009, 10:46

Ouais j'y avais pensé qu'au niveau de "traitement" il fallait mettre du code mais je savais pas quoi ... Je comprends un peu mieux maintenant .
Je vais essayer d'apporter le code correspondant et puis également essayer le code de stopher alors :D
Merci pour vos réponses !

EDIT : Pourriez-vous m'expliquer un peu comment fonctionne le code PHP de stopher s'il vous plaît ? Parce que j'ai bien compris où le mettre mais je vois pas où sont les critères pour un email dans ce code ? Le code ne dit pas qu'il doit y avoir un "@", etc . Ca m'échappe un peu ...

Mammouth du PHP | 991 Messages

19 juil. 2009, 11:56

C'est simple tout viens du flag : FILTER_VALIDATE_EMAIL

donc en simplifiant c'est une sorte de grosse fonction avec tout plein de regex, et le flag permet de selectionner le bon, et donc de savoir si la chaine est correct ou non.

c'est un peu le meme principe que ta fonction , hormis le fait que ce soit développer au sein de php , que c'est surement plus optimiser , et que les migrations prochaines seraient plus aisées ^^

J'ai répondu a a ta question ?
Bye Hawk
DevOps, Symfony4, Hoa

Eléphanteau du PHP | 29 Messages

19 juil. 2009, 14:26

Okkk d'accord merci 8-) Je pense que j'ai compris .
En gros le flag contient toutes les conditions qui font qu'un email est valide .
C'est bien ça ?

Et au niveau du code qu'on m'a proposé il est complet donc ? Ou alors je dois le remodifier, le completer ?

Mammouth du PHP | 991 Messages

19 juil. 2009, 14:36

en gros on peux généraliser en mon sens l'action du flag comme ceci :
function filter_var($string , $flag)
{
	switch ($flag)
	{
		case FILTER_VALIDATE_EMAIL:
			if (preg ........)
			return true
			else
			return false
			break;
		case 
		
		/*
			Etc
		
		*/
	
	}
}

C'est juste pour t'aider a te montrer comment je me le représente :) , la source doit être plus compliqué et surement pas en PHP :p

Ensuite au niveau de la source de stropher , je pense en effet qu'au niveau de la verification de la validité synataxique de la variable c'est correct.

Apres avant tout insertion dans une base de donnée il faudrait que chaque variable venant d'un formulaire (i.e toutes informations saisies par un utilisateur) , soit encadrer par la function mysql_escape_string();

Bye Hawk.
DevOps, Symfony4, Hoa

Eléphanteau du PHP | 29 Messages

19 juil. 2009, 14:56

Ok merci . Bon du coup j'ai inséré le code de stopher dans ma page de code ( je rappelle qu'à la base j 'ai une page en html avec mon formulaire et une autre page qui permet de traiter l'envoi dans la BDD, et c'est cette dernière page dont je parle ici ) et ça ne marche pas pour autant . Quant à la "function mysql_escape_string();" elle apparaît également dans mon code ...
Et finalement je ne comprends pas d'où vient mon erreur, malgrè le fait que j'ai à peu près compris tout ce que tu t'acharnes à m'expliquer depuis tout à l'heure :lol:

Voici mon code PHP, pourrais-tu y jeter un coup d'oeil s'il te plaît ? :oops:

<?php

if(isset($_POST['nom'])) { // Si on envoie le formulaire

// Connexion à la base de données "externalisation"
mysql_connect("localhost", "root");
mysql_select_db("externalisation");

// On récupère les $_POST et on en fait des variables
$_POST = array_map('mysql_real_escape_string', $_POST); // on applique mysql_real_escape_string sur tout le tableau $_POST
$nom = $_POST['nom'];
$mot_de_passe = $_POST['mot_de_passe'];
$email = $_POST['email'];
$datetime = date('Y-m-d') .' '. date('H:i:s');

//Vérification de l'email
$retour = filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 

if($retour){ 
     echo "Adresse Valide ! "; 
} 

// On crypte le mot de passe
define('PREFIXE_SHA1', 'p8%B;Qdf78');

$mdp_sha1  = $_POST['mot_de_passe'];

$mdp_sha1 = sha1(PREFIXE_SHA1.$mdp_sha1);

// On part du principe que le nom d'utilisateur est unique, on doit vérifier qu'il n'existe pas déjà ans la table
$requete = "SELECT COUNT(*) AS nb FROM formulaire WHERE utilisateur = '". $nom ."'"; // On crée la requête
$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // On exécute la requête
$donnees = mysql_fetch_array($resultat); // On crée un tableau pour récupérer la valeur que renvoie la requête
$nombre = $donnees['nb']; // On crée une variable qui contiendra le nombre de résultats renvoyé par la requête

	if($nombre == 0) { // Si la variable renvoie 0 c'est que le nom d'utilisateur n'existe pas dans la table donc on peut l'enregistrer
	$requete = "INSERT INTO formulaire VALUES('". $nom ."', '". $mdp_sha1  ."', 1, '". $datetime ."', '". $email ."')";
	$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // on exécute la requête
	echo 'Enregistrement effectué. Vous êtes maintenant inscrit. Merci !<br />';
	
// On crée le message email
$msg1 = 'Merci pour votre inscription et bienvenue sur le site ! Votre identifiant est '. $nom .' et votre mot de passe est '. $mot_de_passe; //Message pour le nouveau membre 
$msg2 = 'Un nouveau membre s\'est inscrit: '. $nom;  //Message pour le webmaster

$recipient = '[email protected]'; //Adresse mail du webmaster
ini_set("sendmail_from",$recipient);
$subject = 'Formulaire d\'inscription'; //On met le sujet du mail

$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$header .= "From:  ". $email ."";


	$mail1 = mail($recipient, $subject, $msg2, $header); //Mail envoyé au webmaster 
	$mail2 = mail($email, $subject, $msg1, $header); //Mail envoyé au nouveau membre
		if($mail1 && $mail2 == true) {
		echo 'Vous allez recevoir un mail avec vos informations.';
		} else {
		echo 'Erreur dans l\'envoi du mail .';
		}
	} else { // Sinon ce nom existe déjà, on insert aucune donnée
	echo 'L\'utilisateur '. $nom .' existe déjà. Veuillez vous réinscrire sous un autre nom d\' utilisateur.';
	}

mysql_close(); // On ferme la connexion
}

?>