Passer du code dans une variable

Snheed
Invité n'ayant pas de compte PHPfrance

22 déc. 2006, 17:21

Bonjour à tous,

Je souhaite passer du code dans une variable sans qu'il soit interprété.

Par exemple :

Code : Tout sélectionner

<?php $i=1; $j=3; $test1="$i==1"; $test2="$j==3"; if ($test1 and $test2){ echo "ok"; } else { echo "pas ok"; } ?>
le problème ici c'est que le $i, malgré qu'il soit entre guillemet est interprété. Comment faire pour que le $i reste au format texte ($i reste $i) ?

Merci d'avance pour toutes vos réponses.

Snheed

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 déc. 2006, 17:26

Pour qu'une variable ne soit pas interprété, il faut la placer entre ' et non entre "
$a = "1";
echo "$a == 1"; //affiche "1 == 1"
echo '$a == 1'; //affiche "$a == 1"
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

snheed
Invité n'ayant pas de compte PHPfrance

22 déc. 2006, 18:00

Merci Zeus, je vais essayer ça :wink:

Snheed

Eléphant du PHP | 445 Messages

23 déc. 2006, 03:02

J'ajouterais également qu'en php, mettre un "and" dans une condition n'est pas correct, il faut utiliser &&

Idem pour "or" ==> ||
LLDC
Ulti

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

23 déc. 2006, 13:05

Objection votre honneur ! :)

Même si je préfére également utiliser les opérateurs && et || (surtout dans des cas simples comme celui-ci), on ne peut pas dire que "and" et "or" ne soient pas correct. Ce sont également des opérateurs logiques qui fonctionnent très bien.

En revanche, "&&" et "AND" n'ont pas la même priorité d'exécution (idem pour "||" et "OR") et peuvent donc avoir des comportement différents. A utiliser avec précaution donc, et dans le doute il vaut mieux effectivement s'en tenir aux && et || ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 445 Messages

24 déc. 2006, 23:45

Excusez mon ignorance grand maitre ^^

Merci pour ces précisions :)

Mais cela ne me fera pas plus utiliser les opérateurs AND et OR ^^'
LLDC
Ulti

Snheed
Invité n'ayant pas de compte PHPfrance

27 déc. 2006, 09:31

Bonjour à tous,

Merci pour toutes ces précisions intéressantes. J'ai donc remplacé les guillemets par des apostrophes et le "and" par un "&&" mais mon morceau de code ne fonctionne toujours pas.

Code : Tout sélectionner

<?php $i=1; $j=2; $test1='$i==1'; $test2='$j==3'; $test3= $test1." && ".$test2; //echo $test3; if ($test3){ echo "ok"; } else { echo "pas ok"; } ?>
$test3 est bien égale à "$i==1 && $j==3" mais semble ne pas être interprété correctement dans le "if"... Le résultat affiche toujours "ok" alors que j=2... :?

Merci encore pour votre aide.

Snheed

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2006, 09:41

Ah, ok, j'avais pas compris ce que tu cherchais à faire :?

Si tu veux executer plusieurs tests et comparer le résultats de tes tests plus tard, il ne faut pas les inihiber.

$i == 1 return TRUE si $i vaut 1, FALSE sinon
pareil pour $j == 3
$test1 = ($i == 1);
$test2 = ($j == 3);
$test1 va donc contenir TRUE ou FALSE

Si tu veux tester si les 2 tests ont été validé, il ne reste plus qu'a vérifier que test1 et test2 contiennent bien TRUE
if ($test1 && $test2) {
  //$test1 et $test2 contiennent TRUE
} else {
  // $test1 ou $test2 contient FALSE
}
Le principe d'un if, c'est que l'expression retourne TRUE ou FALSE et le if teste ce retour ;)
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

Petit nouveau ! | 3 Messages

27 déc. 2006, 11:42

Merci zeus, je comprends mieux.

Par contre, j'aurais dû être plus clair au départ car ce n'est pas encore tout à fait ce que je veux. J'ai simplifié au maximum en espérant pouvoir m'en sortir tout seul par la suite mais je n'y arrive pas. Je vais donc essayer d'être plus clair.

J'ai un tableau qui contient des informations (types de voiture, couleurs, options,...) et je souhaiterais afficher certaines lignes de ce tableau en fonction d'informations saisies dans un formulaire de recherche. Sachant que mon formulaire contient 10 critères de recherche et que l'utilisateur à la possibilité de faire une recherche sur qu'un seul critère, je ne vais pas imbriquer des "IF" pour avoir toutes les possibilités. C'est pourquoi, j'avais pensé tester la saisie des différents critères et créer une variable de condition qui une fois générée pourrait être appelée pour afficher le résultat.

J'ai simplifié mon code à 3 critères pour vous montrer :

Code : Tout sélectionner

<html> <body> <form method="POST"> <table> <tr> <td>voiture :</td> <td> <select name="voiture" size="1"> <option>&nbsp;</option> <option value="1">205</option> <option value="2">206</option> <option value="3">207</option> </select> </td> </tr> <tr> <td>couleur :</td> <td> <select name="couleur" size="1"> <option>&nbsp;</option> <option value="1">rouge</option> <option value="2">bleu</option> <option value="3">vert</option> </select> </td> </tr> <tr> <td>option :</td> <td> <select name="option" size="1"> <option>&nbsp;</option> <option value="1">vitres éléctriques</option> <option value="2">fermeture centralisée</option> <option value="3">ABS</option> </select> </td> </tr> </table> <input type="Submit" value="OK"> </form> <?php error_reporting(0); $tableau[0]=array(1,1,1); $tableau[1]=array(1,1,2); $tableau[2]=array(1,2,1); $tableau[3]=array(2,1,1); $tableau[4]=array(2,1,2); $tableau[5]=array(3,1,1); if ($_POST["voiture"]){$action= $action && ($_POST['voiture']==$tableau[$i][0]);} if ($_POST["couleur"]){$action= $action && ($_POST['couleur']==$tableau[$i][1]);} if ($_POST["option"]){$action= $action && ($_POST['option']==$tableau[$i][2]);} for ($i=0;$i<10;$i++){ if (eval($action)){ echo $tableau[$i][0]."-".$tableau[$i][1]."-".$tableau[$i][2]."<br>"; } } ?> </body> </html>
Vos premières réponses m'ont bien permis de comprendre comment imbriquer mes différents tests mais j'ai l'impression que la variable de condition finale n'est pas interprété correctement.

Peut être y'a t'il une solution plus simple d'aborder le problème...
Merci encore pour votre aide.

Snheed
Modifié en dernier par Snheed le 27 déc. 2006, 12:33, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2006, 11:50

Dans l'idée, je pense que tu es juste mais, d'après ce que je vois, tu va toujours ne rien afficher.

En effet, $condition ne pourra contenir que FALSE parce que tout tes test portent sur $_POST['voiture'] ;)
...&& ($_POST['voiture']==$tableau[$i][0]);}
...&& ($_POST['voiture']==$tableau[$i][1]);}
...&& ($_POST['voiture']==$tableau[$i][2]);} 
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

Petit nouveau ! | 3 Messages

27 déc. 2006, 12:35

Effectivement, il faut faire attention avec les copier/coller :D

Cela dit, ça ne change rien. Je viens de tomber sur la fonction eval(). C'est peut être une solution non ?

Snheed

Petit nouveau ! | 3 Messages

28 déc. 2006, 15:22

Bonjour à tous

Alors j'ai réussi à contourner le problème en utilisant les fonctions unset() et sort(). On peut donc considérer cette demande comme terminée.

Ayant posté en tant qu'invité, y'a t'il un modo qui peut mettre [résolu] dans le sujet ?

Merci à tous pour votre aide.

Snheed

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 déc. 2006, 15:34

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton [Mettre Résolu] qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié). ;)