Page 1 sur 2

Problème PHP : expression régulière

Posté : 29 juin 2007, 12:11
par VinS
Bonjour,

Comment interdire les personnes s'inscrivant à une newsletter de s'enregister dans ma base quand il utilise un e-mail contenant le mot "pouet"
ou s'étant déja inscrit dans ma base ?

Mon code (qui ne marche pas : à chaque enregistrement, "l'email est périmé" !) :
//Dans la page d'avant, l'utilisateur entre son email dans le champ email2

include ("conndb.inc.php");
loginDB();
$result = mysql_query ("SELECT email FROM newsletter");
While ($req = mysql_fetch_array($result))
{
$emailx=$_GET['email2'];
$emaily='pouet';
}
if(($req=$emailx) || ($emailx=$emaily)) {
echo "<center>Erreur : E-mail périmé ou déjà existant</center>";
}
else{
blabla
}
Merci d'avance !

Posté : 29 juin 2007, 12:31
par orgerix
Plusieurs choses ne vont pas...

tout d'bord, la condition.

Tu utilise l'opérateur = qui est un opérateur d'association et non de comparaison. Donc ta condition est toujours vrai. Utlise à la place l'opérateur ==

Ensuite la boucle while.

Elle ne fait que définir les variable $emailx et $emaily, avec à chaque fois la même chose, ce qui est strictement inutile.

Enfin, l'extraction des données.

mysql_fetch_array() retourne comme son nom l'indique un tableau avec les champs d'une ligne retourné par la requete, avec un index numérique et un index avec les noms de colonnes. Or tu compare un tableau à une chaine de caractère, ce qui sera toujours faux. IL faut donc utiliser $req['email'] ou $req[0].

A ce propos, je te conseille d'utiliser mysql_fetch_assoc() qui retourne un tableau avec uniquement comme index le nom des colonnes, ca ne sert à rien d'avoir les informations en double.

Par contre, je ne vois pas trop le rapport avec les expressions réqulières, tel que le code est écrit.

Posté : 29 juin 2007, 12:52
par @rthur
Bonjour,

Regarde du côté de la fonction eregi() (et notamment l'exemple qui va avec la doc ;) ):
http://fr.php.net/eregi

Posté : 29 juin 2007, 14:06
par VinS
Merci de vos réponses !

J'ai essayé les 2 manières :

$result = mysql_query ("SELECT email FROM newsletter");
While ($req = mysql_fetch_assoc($result))
{
$emailx=$_GET['email2'];
$emaily='pouet';
}
if(($req['email']==$emailx) || ($emailx==$emaily)) {
echo "<center>Erreur : E-mail périmé ou déjà existant</center>";
}


OU

$result = mysql_query ("SELECT email FROM newsletter");
While ($req = mysql_fetch_assoc($result))
{
$emailx=$_GET['email2'];
}
if(($req['email']==$emailx) || (eregi('pouet', $emailx))) {
echo "<center>Erreur : E-mail périmé ou déjà existant</center>";
}


Mais ça ne marche toujours pas.

Orgerix -> je dois définir emailx la, car le $_get sera toujours différent (je le GET à partir d'un formulaire) et je ne fais que modifier un code déja existant, donc je préfère le définir ici pour pas détruire le boulot de l'ancien webmaster ! lol

Posté : 29 juin 2007, 14:20
par Sékiltoyai
Regarde du côté de la fonction eregi() (et notamment l'exemple qui va avec la doc ;) ):
http://fr.php.net/eregi
Je t'arrête, ereg est obsolète, il faut utiliser les PCRE maintenant...

Posté : 29 juin 2007, 14:34
par VinS
Par contre, je ne vois pas trop le rapport avec les expressions réqulières, tel que le code est écrit.
PCRE : expressions régulières
:D

Posté : 29 juin 2007, 14:41
par Sékiltoyai
Non, pcre = expressions régulières compatibles PERL. Les expressions régulières PHP sont les REGEXP (ereg, eregi, ...)

Posté : 29 juin 2007, 14:43
par VinS
Non, pcre = expressions régulières compatibles PERL. Les expressions régulières PHP sont les REGEXP (ereg, eregi, ...)
:(
lol

je suis un php noob, désolé lol

merci de votre aide en tout cas :lol:

encore un peu de souffrance et on aura la solution !

Posté : 29 juin 2007, 14:45
par orgerix
Ta variable $_GET['mail2'] ne change pas au cours de ton traitement PHP... elle est redéfini uniquement en cas d'un appel de la page.

Ton problème est (en parti) un problème d'accolade. De plus, tu extrait toutes les adresses pour voir si l'adresse est dans la base de donnée, ce qui est un gaspillage de ressource inutile.

Une simple clause WHERE email = $_GET['email2'] fait tout le travail et plus rapidement.

Ensuite, au lien de faire une boucle, tu peux seulement tester si elle retourne, ce qui donne un script
$emailx=$_GET['email2']; 
$result = mysql_query ("SELECT email FROM newsletter WHERE email='".mysql_real_escape_string($emailx)."'"); 
if ($req = mysql_fetch_assoc($result) ||  eregi('pouet', $emailx) ) 
{ echo "<center>Erreur : E-mail périmé ou déjà existant</center>"; 
}




Par contre, je ne suis pas du tout au point sur les expressions régulières donc je ne pourrais pas t'aider.

EDIT : en fait, regarde du coté de preg_match().

Posté : 29 juin 2007, 14:55
par VinS
Merci de ta réponse !

Mais je pense que eregi() ne fonctionne pas, car 'pouet' est quand même accepté.

S'il qq'un peut transformer un eregi (ou ereg) en ex. régulière, ça serait perfect !!

merci ^^

Posté : 29 juin 2007, 15:05
par orgerix
regarde preg_match(), avec les exemples...

Posté : 29 juin 2007, 16:23
par VinS
preg_match() et tous ses petits copains ne fonctionnent pas.
J'ai l'impression qu'une suite de caractère est plutôt difficile à localiser dans un ensemble de caractères.
Un z ou un 1 est simple mais 'pouet', ça parait plus compliqué ^^

Mais qq'un a déja du faire ce genre de codage ?
Merci a lui lol

Posté : 29 juin 2007, 16:36
par Ryle
Je dirais que dans la mesure ou tu n'as à priori pas de else ni de clause pour interrompre le traitement, le fait que "pouet" soit trouvé ne déclenche que l'affichage du message, le reste du code continuera à s'exécuter normalement, pouet ou pas pouet ;)

Quant à la recherche d'une chaine exacte de caractère, c'est pourtant ce qu'il y a de plus simple, que ce soit avec ereg() et preg_*() ... tu peux même utiliser strpos() si tu ne veux pas t'encombrer d'expressions régulières :)

Posté : 29 juin 2007, 16:43
par VinS
Je dirais que dans la mesure ou tu n'as à priori pas de else ni de clause pour interrompre le traitement
Hum.... relis le tout 1er message ^^
j'allais pas remettre le else 25 fois
:wink:

Posté : 29 juin 2007, 16:47
par VinS
tu peux même utiliser strpos() si tu ne veux pas t'encombrer d'expressions régulières :)
Alors si je reprend le code et que je change eregi :

Code : Tout sélectionner

$emailx=$_GET['email2']; $result = mysql_query ("SELECT email FROM newsletter WHERE email='".mysql_real_escape_string($emailx)."'"); if ($req = mysql_fetch_assoc($result) || eregi('pouet', $emailx) ) { echo "<center>Erreur : E-mail périmé ou déjà existant</center>"; }
Ben ça marche pas !
looooooool