if

Eléphant du PHP | 83 Messages

20 nov. 2009, 09:05

Bonjour,

J'ai un souci et j'ai fait un petit script pour exprimer mon problème :
<?
$str="le vent souffle fort";
$fonction="eregi('biii', $str) or eregi('ibiii', $str)";

if ($fonction)

{
print "1";
}

?>
Je crois comprendre le problème : "if" me répond oui car il vérifie l'existence de la variable "$fonction" et non sa validité. Comment faire pour qu'il vérifie la validité de $fonction et non l'existence de la variable ?

Merci d'avance pour toute aide.
c'est pas mon site mais je soutiens : http://www.consommateurendanger.org/

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 nov. 2009, 12:26

Bonjour,

Quand tu écris
$fonction="eregi('biii', $str) or eregi('ibiii', $str)";
tu ne définis pas une fonction, tu ne fais que mettre une chaine dans une variable.
Donc, quand tu fais
îf($fonction)
PHP teste la variable, trouve une chaine non nulle, et considère donc que c'est vrai.

Si ton but premier était de mettre le résultat du test dans la variable, il faut écrire :
$fonction = (eregi('biii', $str) or eregi('ibiii', $str));
Et si ton but était de créer un fonction anonyme (une fonction déclarée à la volée, qui n'as pas de nom, et qui peut aussi être appelée lambda), il aurait fallu écrire :
$function = function($str) { return eregi('biii', $str) or eregi('ibiii', $str)  };

if( $function($str) )
{
   // ...
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 2937 Messages

20 nov. 2009, 12:40

Soit dit en passant, on peut améliorer l'écriture de ta variable $fonction, comme suit :
$fonction = preg_match ('#i?bi{3}#i', $str);
D'autant plus que les fonctions dont le nom commence par ereg ou eregi deviennent obsolètes en PHP 5.3 et peuvent être avantageusement remplacées par les expressions régulières compatibles Perl, ne serait-ce que pour une question de performance (un tuto est à ta disposition si tu ne connais pas ce type d'expressions régulières).

Eléphant du PHP | 83 Messages

20 nov. 2009, 16:17

Bonjour et vraiment merci de m'aider.

*****Zeus : super, c'est presque bon, mais j'ai encore un problème. Je ne connais pas à l'avance le nombre de termes à vérifier et mon petit bout de code ne fonctionne pas :

Code : Tout sélectionner

$str="le vent souffle fort"; $fonction = eregi('les', $str); $fonction .= " or " ; $fonction .= eregi('ibiii', $str); if ($fonction) { print "1"; }
Comment faire pour que "or" fonctionne comme un opérateur et non comme une simple chaîne de caractères ?

*****Victor : merci beaucoup du conseil, je vais regarder ça.
c'est pas mon site mais je soutiens : http://www.consommateurendanger.org/

Eléphant du PHP | 174 Messages

20 nov. 2009, 16:22

Comment faire pour que "or" fonctionne comme un opérateur et non comme une simple chaîne de caractères ?
Essai de ne pas écrire $fonction comme une chaîne de caractère :
if(eregi('les', $str) OR eregi('ibiii', $str)){
 print("1");
}
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphant du PHP | 83 Messages

20 nov. 2009, 16:29

Comment faire pour que "or" fonctionne comme un opérateur et non comme une simple chaîne de caractères ?
Essai de ne pas écrire $fonction comme une chaîne de caractère :
if(eregi('les', $str) OR eregi('ibiii', $str)){
 print("1");
}
J'ai pas le choix :( En fait je récupère les termes ('les', 'ibiii' etc. ) dans une base sql. Pour chacun j'ai besoin de dégager un

" OR eregi($terme,$str)"

C'est pour ça que je distinque le "if" d'un côté et "$fonction" de l'autre.
c'est pas mon site mais je soutiens : http://www.consommateurendanger.org/

Eléphant du PHP | 174 Messages

20 nov. 2009, 16:38

Dans ce cas tu peux gérer le tout avec des if et elseif : si tu n'as qu'un résultat tu fais un simple if, sinon tu rajoutes un elseif(eregi....).
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphant du PHP | 83 Messages

20 nov. 2009, 16:48

Dans ce cas tu peux gérer le tout avec des if et elseif : si tu n'as qu'un résultat tu fais un simple if, sinon tu rajoutes un elseif(eregi....).
Bonne idée ! Mais comment tu fais ? Voici mon script qui ne fonctionne pas :

Code : Tout sélectionner

$str="le vent souffle fort"; $fonction1 = if (eregi('les',$str)) { print 1; } $fonction1 .= elseif (eregi('ibiii',$str)) { print 1; } print $fonction1;
c'est pas mon site mais je soutiens : http://www.consommateurendanger.org/

Eléphant du PHP | 174 Messages

20 nov. 2009, 16:58

Tu te compliques la vie.

Tu m'as bien dit que les paramètres de ta fonction eregi() étaient récupérés dans la base de données ?

Le cas échéant tu peux traiter ton eregi() en traitant les résultats :
while($resultats = mysql_fetch_array($requete)){
  $param = $resultats($champ);
  if(eregi($param,$str)){
    die("1");//arrete le programme s'il trouve la solution
  }
}
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphant du PHP | 83 Messages

20 nov. 2009, 17:34

Super Animithra !! Ca marche super bien, c'est vrai que je me suis compliqué la vie pour rien.

Merci !!!
Tu te compliques la vie.

Tu m'as bien dit que les paramètres de ta fonction eregi() étaient récupérés dans la base de données ?

Le cas échéant tu peux traiter ton eregi() en traitant les résultats :
while($resultats = mysql_fetch_array($requete)){
  $param = $resultats($champ);
  if(eregi($param,$str)){
    die("1");//arrete le programme s'il trouve la solution
  }
}
c'est pas mon site mais je soutiens : http://www.consommateurendanger.org/

Eléphant du PHP | 174 Messages

20 nov. 2009, 17:34

Un petit tag "Résolu" l'ami !
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)