Problème PHP : expression régulière

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 12:11

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 !

Mammouth du PHP | 693 Messages

29 juin 2007, 12:31

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

29 juin 2007, 12:52

Bonjour,

Regarde du côté de la fonction eregi() (et notamment l'exemple qui va avec la doc ;) ):
http://fr.php.net/eregi
Quand tout le reste a échoué, lisez le mode d'emploi...

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 14:06

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

ViPHP
ViPHP | 5924 Messages

29 juin 2007, 14:20

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...

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 14:34

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

ViPHP
ViPHP | 5924 Messages

29 juin 2007, 14:41

Non, pcre = expressions régulières compatibles PERL. Les expressions régulières PHP sont les REGEXP (ereg, eregi, ...)

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 14:43

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 !

Mammouth du PHP | 693 Messages

29 juin 2007, 14:45

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().

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 14:55

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 ^^

Mammouth du PHP | 693 Messages

29 juin 2007, 15:05

regarde preg_match(), avec les exemples...

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 16:23

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

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

29 juin 2007, 16:36

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 16:43

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:

VinS
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 16:47

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