Array et Cie

Invité
Invité n'ayant pas de compte PHPfrance

17 avr. 2007, 10:23

Bonjour à vous tous,

J'aurai un petit problème à vous soumettre :

Je reprend un site de vente en ligne, développé par une autre personne.
A un moment donner sur ces scripts il y a ce code :

Code : Tout sélectionner

<? echo menu_right($d[0], $d[1], $d[2]); ?>
qui fait appel à une fonction (menu_right) qui traite les rubriques.
$d[0] est le nom de la rubrique (ex : Drap)
$d[1] est le nom de la sous-rubrique ( ex : Coton)
$d[2] est le nom du produit (ex : nuits calines) :o)

le problème c'est que au début, lorsque l'on ne clique sur aucune rubrique, les "array" $d[1] et $d[2] ne sont pas renseignés.. .ce qui donne une erreur du type :

Code : Tout sélectionner

Notice: Undefined offset: 1 in index.php on line 60
Alors j'ai pensé à faire un "isset" et de construire mon "echo" de la manière suivante :

Code : Tout sélectionner

$menu_droite= '<? echo menu_right('; // ici j'ouvre le marqueur PHP // rechercher les différentes valeurs if (isset($d[0])) { $menu_droite.='$d[0]'.", ";} // Si elle existe il l'inscrit if (isset($d[1])) { $menu_droite.='$d[1]'.", ";} // Si elle existe il l'inscrit if (isset($d[2])) { $menu_droite.='$d[2]'.", ";} // Si elle existe il l'inscrit $menu_droite=substr($menu_droite,0,-2); // ici j'enlève la virgule finale $menu_droite.= '); ?>'; // ici je ferme le marqueur PHP print_r ($menu_droite); // et la enfin je l'affiche
Au final c'est bien écrit, mais il semble ne pas l'interpreter !? (le fichier à bien l'extention ".php")
Dans le "code source" de la page la balise "<? ... ?>" et bien la mais comme en dur ?
J'ai essayé avec :

Code : Tout sélectionner

printf ($menu_droite); echo $menu_droite; ...
Mais rien à faire !?
Ou me suis-je trompé ?
Suis dans la bonne direction ?
Est ce réalisable ?

Merci de vos réponse.

Mammouth du PHP | 1353 Messages

17 avr. 2007, 13:42

Bonjour,

il y a un premier probleme dans
$menu_droite= '<? echo menu_right('; // ici j'ouvre le marqueur PHP 
Si tu ecris $menu_droite c'est que tu es deja en php non ? Aussi je te conseille d'utiliser <?php ?> a la place de <? ?> c'est plus sur...

Sinon pour en revenir a ton probleme il me parait beaucoup plus simple de n'appeler la fonction menu_right que si les variables sont définies et je crois que c est ce que tu voulais faire... Dans ce cas je ferai quelque chose du style :
<?php
if(isset($d[0]) && isset($d[1]) && isset($d[2])) {
echo menu_right($d[0], $d[1], $d[2]); 
}
?>
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 445 Messages

17 avr. 2007, 13:51

Il existe une fonction permettant d'exécuter le php situé dans une variable, je ne l'ai pas en tête, et n'ai pas le temps de chercher là, mais c'est peut-être cela que tu recherches non ?
LLDC
Ulti

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

17 avr. 2007, 14:14

Oui, guilt92 a raison, la solution la plus logique est :
<?php 
if(isset($d[0]) && isset($d[1]) && isset($d[2])) { 
echo menu_right($d[0], $d[1], $d[2]);  
} 
?>
d'autant plus que la fonction menu_right doit exiger les trois paramètes et dans l'ordre (ce que ton code ne respecte pas).

Enfin, si tu tiens à ta solution, c'est la fonction eval() qui permet d'exécuter du code php stocké dans une chaîne.
Enlève alors les <? et ?> de la chaîne $menu_droite et fait un eval($menu_droite)

Comme ça:
$menu_droite= "echo menu_right("; 
// rechercher les différentes valeurs 
if (isset($d[0])) { $menu_droite.="'$d[0]', ";} else $menu_droite.=" null, "; // Si elle existe il l'inscrit sinon vide
if (isset($d[1])) { $menu_droite.="'$d[1]', ";} else $menu_droite.=" null, "; // Si elle existe il l'inscrit  sinon vide
if (isset($d[2])) { $menu_droite.="'$d[2]', ";} else $menu_droite.=" null, "; // Si elle existe il l'inscrit sinon vide

$menu_droite=substr($menu_droite,0,-2); // ici j'enlève la virgule finale 
$menu_droite.="); "; 

eval ($menu_droite); // et la enfin je l'exécute
Mais ceci n'est vrai que si tous les paramètres de la fonction "menu_right" sont facultatifs
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

17 avr. 2007, 17:42

Merci !
A vous, effectivement guilt92 a raison...
Ca fonctionne à la perfection.
Encore merci à vous tous
Cordialement