tester l'adresse email

Eléphant du PHP | 101 Messages

03 août 2005, 13:43

bonjour, je vous écrits en désespoire de cause car (étant débutant), je viens de passer 3 heures à essayer de créer ma première fonction pour vérifier l'exactitude de la saisie d'un email dans un formulaire..

J'ai tout d'abord utilisé explode :

Code : Tout sélectionner

$email_array=explode('@', $email); $dom_array=explode('.', $email_array[1]);
j'ai donc :

Code : Tout sélectionner

/* $email_array[0]; //le nickname $dom_array[0]; //le nom de domaine sans .com, .fr,.... $dom_array[1]; // le .fr ou .com, etc... */
j'ai donc créé ma première fonction simple qui est la suivante :

Code : Tout sélectionner

function testmail() { if ( (empty($email_array[0])) or (empty($dom_array[0])) or (empty($dom_array[1])) ) {echo 'email pas bien!<BR />';} }
Jusqu'à là, c'est bon? nan?

le problème est que quand je rappèle ma fonction, je n'ai pour ainsi dire jamais le résultat escompté, c'est à dire qu'il m'affiche sistématiquement "email pas bien" meme quand j'ai compilé correctement mon formulaire...

j'ai meme insérer les lignes suivantes, juste avant de rappeler ma fonction testmail (); pour vérifier les valeurs :

Code : Tout sélectionner

<?php echo 'nickname : '.$email_array[0].'<BR />'; echo 'nom de domaine : '.$dom_array[0].'<BR />'; echo 'extension domaine : '.$dom_array[1].'<BR />'; echo empty($email_array[0]).'<BR />'; echo empty($dom_array[0]).'<BR />'; echo empty($dom_array[1]).'<BR />'; testmail (); ?>
et je n'y comprends rien car sur le serveur j'ai toujours la réponse "email pas bien"... meme quand $email_array[0] (le nickname), dom_array[0] (le nom de domaine sans .com, .fr,....) et dom_array[1](le .fr ou .com, etc...) sont non nulle...

La fonction semble marcher pourtant puisque l'interprétateur php revoit la page...

à l'aide! je ne sais plus quoi faire... et dire que ce n'est que le début...ne rigolez pas trop please :mrgreen:

Merci d'avance pour votre aide...
nan!

Mammouth du PHP | 543 Messages

03 août 2005, 13:59

Tu devrai faire ca avec un ereg plutot qu'avec des explodes :)

Eléphanteau du PHP | 24 Messages

03 août 2005, 14:12

Essaie plutôt une REGEX :
<!-- Ton formulaire (parti HTML)-->

Code : Tout sélectionner

<html> <form action="tapage.php" method="POST"> <input type="text" name="email" /> <input type="submit" /> </form> </html>
/* tapage.php */
<?php
// la Regex mis dans une variable
$verifmail="!^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";
// la condition
if (!preg_match($verifmail,$_POST["email"]))
{
echo "Vous devez entrer un email valide";
}
else
{
echo "OK !";
}
Voilà :D

Eléphant du PHP | 101 Messages

03 août 2005, 15:11

salut à tous et merci beaucoup pour votre réponse. :D

Ceci étant dit, je suis vraiment débutant est loin de là le fait que vos solutions ne m'intéressent pas, je souhaiterais avant tout comprendre pourquoi la mienne ne fonctionne pas ? j'ai essayé des 10ènes de variantes, mais rien n'y fait...

si vous avez une idée... :-k

A+
nan!

Invité
Invité n'ayant pas de compte PHPfrance

03 août 2005, 16:12

Tes variables ne sont pas visibles depuis ta fonction.

Rajoute un global $var1 , $var2 ... etc ... au début de ta fonction pour résoudre et comprendre ton probleme. $var1 etc ... seront alors visibles depuis ta fonction.

Ensuite abandonne ton idee car ce n'est pas du tout la bonne méthode et tu dois en effet te tourner vers les expressions regulieres pour tester la validité de l'email rentré !

Il y a deux mécanismes d'expressions regulieres en PHP : les REGEX POSIX et les REGEX PCRE. Je te conseille de ne pas vraiment t'interresser aux POSIX mais plutot aux PCRE car ces dernieres sont ien plus puissantes et plus rapides que les POSIX a difficulté d'apprentissage egale.

Eléphant du PHP | 101 Messages

08 août 2005, 17:07

Merci à tous pour votre aide,
Excusez moi si j'ai mis un peu de temps à vous répondre mais j'ai du passer un peu de temps sur la notion de Regex (En fait, c'est le chapitre après explode () dans mon livre :D) et je commence seulement à comprendre la notion (je dois encore bucher!!!)...

A+
nan!

Eléphant du PHP | 101 Messages

09 août 2005, 10:19

bon, je récrit juste un petit message pour dire que maintenant, çà y est, je comprends :

Code : Tout sélectionner

"!^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-zA-Z]{2,4}$!"
Je voudrai juste savoir s'il est possible de mettre le code de David96 sous forme d'une fonction que je n'aurai qu'à rappeler si nécéssaire (sans les problèmes de variable globale mentionnés par invité ?

A+
nan!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 août 2005, 10:24

Je voudrai juste savoir s'il est possible de mettre le code de David96 sous forme d'une fonction que je n'aurai qu'à rappeler si nécéssaire (sans les problèmes de variable globale mentionnés par invité ?
oui, et ce serait même une bonne idée
pour le problème de l'accessibilité des variables, il suffit des les passer en paramètre

Eléphant du PHP | 101 Messages

09 août 2005, 11:07

çà donnerait quelque chose comme çà la fonction :

Code : Tout sélectionner

<?php Function testmail ($verifmail, $_POST["email"]) { // la Regex mis dans une variable $verifmail="!^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-zA-Z]{2,4}$!"; // la condition if (!preg_match($verifmail,$_POST["email"])) { echo "Vous devez entrer un email valide"; } else { echo "OK !"; } }
C'est çà? :)
nan!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 août 2005, 11:27

- pourquoi passer $verifMail en paramètre ? c'est une variable locale de ta fonction, que tu définies par la suite
- le paramètre "adresse email" n'est pas $_POST["email"] : tu donnes le nom de la variable que tu va utiliser par la suite, et c'est dans l'appel que tu décides de la variable qui contient l'adrese à vérifier. Elle peut être POST ou non
- il est préférable de faire un retour de fonction à VRAI ou FAUX plutôt que d'afficher directement le résultat, tu n'auras peut-être pas tjrs envie d'afficher ça :)

voici comment je verrais la chose d'après ton code :
<?php
Function testmail ($email) {
	// la Regex mis dans une variable
	$verifmail="!^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";
	
	// la condition
	if (!preg_match($verifmail, $email))
	{
		return false;
	} 
	else
	{
		return true;
	}
}


if (!testmail($_POST["email"]))
{
	echo "Vous devez entrer un email valide";
}
else
{
	echo "OK !";
}
?>

Eléphant du PHP | 101 Messages

09 août 2005, 12:18

salut ouckileou et grand merci pour ton aide,

J'ai fait :
$email=$HTTP_POST_VARS['email'];

function testmail($email)
 {
 $verifmail="!^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";
   if (!preg_match($verifmail, $email))
    {
        echo '<SPAN class=fwhite2>email non correcte<BR /></SPAN>';
    }
    else
    {
        echo '<SPAN class=fwhite2>email valide<BR /></SPAN>';
    } 
  }
et ensuite je rappèle (quand j'en ai besoin :) ) testmail($email); et après quelques tests, tout semble fonctionnait comme je le souhaite ...

Il y a une chose que je ne comprends pas, $_POST["email"], $HTTP_POST_VARS['email']; et $email ne sont-ils pas au bout du compte la meme chose avec des nomenclatures différentes (style abrégé, medium, long)??? J'ai un peu de mal à comprendre pourquoi dans ton exemple tu utilise la variable $email pour la fonction testmail et dans ta structure conditionnelle, tu utilises testmail avec $_POST["email"]... :?
Modifié en dernier par troudball le 09 août 2005, 12:35, modifié 1 fois.
nan!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 août 2005, 12:34

Il y a une chose que je ne comprends pas, $_POST["email"], $HTTP_POST_VARS['email']; et $email ne sont-ils pas au bout du compte la meme chose avec des nomenclatures différentes (style abrégé, medium, long)???
- $HTTP_POST_VARS['variable'] est l'ancienne écriture de $_POST['variable'], que l'on n'utilise plus. Elles symbolisent toutes les deux une variable envoyée par POST (par un formulaire le plus souvent)
- $email représente une variable quelconque.
J'ai un peu de mal à comprendre pourquoi dans ton exemple tu utilise la variable $email pour la fonction testmail et dans ta structure conditionnelle, tu utilises testmail avec $_POST["email"]... :?
dans la déclaration de la fonction, au niveau des paramètres, tu définis simplement le nom du paramètre au niveau local.
en faisant ça :
function testEmail($adresseEmail) { }
je pourrais utiliser dans ma fonction la variable $adresseEmail, qui n'existera que dans celle-ci et dont la valeur sera fournie à l'appel de cette fonction

quand je l'appelle :
$valide = testEmail($_POST['email']);
je donne à mon paramètre $adresseEmail la valeur de $_POST'email'], mais je pourrais lui donner la valeur d'une autre variable, par exemple une adresse récupérée en base de données

donc mettre $_POST['email'] directement dans la déclaration de la fonction n'a pas vraiment de sens ;)

est-ce que c'est plus clair ? :)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 août 2005, 12:43

pour ce qui est du retour de fonction aussi :

pour l'instant tu affiches directement un message d'erreur si ton adrese est fausse

mais un jour tu auras peut-être envie de valider un forum, avec une adresse email mais aussi d'autres champs.
Et tu voudras n'afficher qu'un seul message global, quelque soit le problème (sur l'adresse email ou sur un autre champ)

en utilisant un retour booléen dans ta fonction, tu pourras la réutiliser, car c'est en récupérant ce retour que tu pourras choisir quoi faire

bon ok cette fonction se modifiera rapidement, mais si elle était plus longue et que tu affichais beaucoup de messages, ce serait plus embêtant ;)

Eléphant du PHP | 101 Messages

09 août 2005, 12:48

OK, la confusion était venu du fait que dans le livre que j'utilise par apprendre le php, on déclare systématiquement les variables :
$X=$HTTP_POST_VARS['X']
pour s'assurer une plus grande polyvalence sur les serveurs (au cas ou un server ne reconnaisse pas le style medium ou abbrégé) et pour utiliser des variable à nom court... Et j' avais justement déclaré $email=$HTTP_POST_VARS['email'], c'est pour çà que je ne comprennais pas tu l'utilisais pour la fonction testmail() :lol: , maintenant, tout est clair!!! Merci encore pour ton aide :wink:

Dis moi juste en retournant une valeur booléenne comme tu dit, on peut aussi créer d'autres fonctions utilisant l'autre fonction ? un exmple est peut-etre meilleur pour me faire comprendre :

J'ai essayé (çà semble fonctionner :-" !!!) :
function erreurmail ($X)
{

 if (!testmail($X))
{
    echo '<SPAN class=fwhite2>email invalido<BR /></SPAN>';
}

    }
il y a de l'idée ou je part sur une fauss route?
Modifié en dernier par troudball le 09 août 2005, 12:56, modifié 1 fois.
nan!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 août 2005, 12:54

pour s'assurer une plus grande polyvalence sur les serveurs (au cas ou un server ne reconnaisse pas le style medium ou abbrégé) et pour utiliser des variable à nom court...
ce n'est pas qu'une question de nom :
Cette variable est une 'superglobal', ou globale automatique. Cela signifie qu'elle est simplement disponible dans tous les contextes d'exécution (fonctions ou méthodes). Vous n'avez pas besoin de faire global $_POST; pour y accéder, comme vous le faisiez avec $HTTP_POST_VARS.

$HTTP_POST_VARS contient les mêmes informations, mais n'est pas autoglobale. (Notez que $HTTP_POST_VARS et $_POST sont des variables différentes et que PHP les traite comme tel)
tu as donc tout intérêt maintenant à utiliser $_POST, et les autres nouvelles écritures ;)
Modifié en dernier par ouckileou le 09 août 2005, 13:28, modifié 1 fois.