OVH Cloud OVH Cloud

while a l'interieur d'un switch

12 réponses
Avatar
Tof
Bonjour,

J'ai besoin de faire un switch, mais je ne connais pas à l'avance les
"case" car ceux ci sont définis precedemment dans ce meme script php et
sont mis dans un tableau $tab.
J'ai bien tenté de faire un :

switch ($p) {
$i = 0;
while ($tab[$i] <> NULL) {
echo "case : ".$tab[$i];
echo "ce que ca doit faire";
echo "break;"
++$i;
}
default :
"ce que ca doit faire"
break;

Mais ca ne marche pas.
Auriez vous une idée de la facon de faire ceci differement de facon à ce
que la page puisse fonctionner ?

Merci d'avance.

--
Tof

10 réponses

1 2
Avatar
John GALLET
Bonjour,

J'ai besoin de faire un switch, mais je ne connais pas à l'avance les
"case" car ceux ci sont définis precedemment dans ce meme script php et
sont mis dans un tableau $tab.


Dans ce cas je ne vois pas comment tu vas savoir quelle fonction
appeler/quel code exécuter dans chaque case.

while ($tab[$i] <> NULL) {
echo "case : ".$tab[$i];
echo "ce que ca doit faire";
echo "break;"


1) echo renvoie des informations au naavigateur (plus généralement : à
l'appelant du programme principal, si on lance en ligne de commande, ce
sera à l'écran)

2) quand bien même tu construirais une string contenant le code dudit
switch pour l'appeler ensuite avec val() (attention, c'est dangereux) il
est évident (?) que ça ne peut fonctionner que si "ce qe ça doit faire"
est embarqué dans une structure informatique, sinon tu es en boucle
infinie (faire un switch qui détermine quel est le code à construire pour
fabriquer un swicth qui détermine...)

++$i;
Ah, les soit-disant habitudes du c++...


Auriez vous une idée de la facon de faire ceci differement de facon à ce
que la page puisse fonctionner ?


Apprendre l'algorithmique de base. Prends le temps d'écrire ce que tu veux
faire sur un papier, déroule le code manuellement, et ensuite "Nike".
Arrête la bidouille éclairée, écris des programmes.

a++;
JG

Avatar
dgo
j'aimerai bien voir ton code en entier si possible ;-)


Tof wrote:
Bonjour,

J'ai besoin de faire un switch, mais je ne connais pas à l'avance les
"case" car ceux ci sont définis precedemment dans ce meme script php et
sont mis dans un tableau $tab.
J'ai bien tenté de faire un :

switch ($p) {
$i = 0;
while ($tab[$i] <> NULL) {
echo "case : ".$tab[$i];
echo "ce que ca doit faire";
echo "break;"
++$i;
}
default :
"ce que ca doit faire"
break;

Mais ca ne marche pas.
Auriez vous une idée de la facon de faire ceci differement de facon à ce
que la page puisse fonctionner ?

Merci d'avance.



Avatar
Vincent Lascaux
switch ($p) {
$i = 0;
while ($tab[$i] <> NULL) {
echo "case : ".$tab[$i];
echo "ce que ca doit faire";
echo "break;"
++$i;
}
default :
"ce que ca doit faire"
break;


Il suffit de faire
echo "ce que ca doit faire"; (puisque tu fais dans tous les cas la même
chose ;))

Sinon tu peux faire
$flippedTab = array_flip($tab);
if(array_key_exists($flippedTab[$p]))
{
echo "ce que ca doit faire pour l'indice ".$flippedTab[$p];
} else {
echo "ce que ca doit faire dans default";
}

--
Vincent

Avatar
Guillaume Bouchard
Tof wrote:
Bonjour,


Bonjour,

J'ai besoin de faire un switch, mais je ne connais pas à l'avance les
"case" car ceux ci sont définis precedemment dans ce meme script php et
sont mis dans un tableau $tab.


Donc un switch n'est pas adapté.

switch ($p) {
$i = 0;
while ($tab[$i] <> NULL) {
echo "case : ".$tab[$i];
echo "ce que ca doit faire";
echo "break;"
++$i;


Koef Koef... 0 la limite à coup de eval() et encore, mais oublions,
c'est gore.


Donc le but de ton code c'est que si une pariable P est initialisé en
fonction d'une variable du tableau, cela execute un code ?

Déjà qu'elle est ce code ? Apparament dans ton script il ne verie pas.
Dans ce cas là

if( in_array($p,$tab)) {
//code
} else {
// default
}

Sinon, donnc plus de precisions.

--
Guillaume.

Avatar
Tof
Je vais essayer d'étre plus clair :

Je dois faire une page php qui va chercher tous les fichiers php qui se
trouvent un repertoire donné et qui affichent le nom de ces fichiers sur
une page web.
Ensuite, certains fichiers sont liées à des schéma et des images (si le
fichier s'appelle grille.php, alors le schéma correspondant s'appelle
schema_grille.gif), mais tous n'ont pas necessairement un schema
explicatif, il faut donc que je trouve quels fichiers sont liés a un
schema ou a une image. La fonction rajoute alors sur la page web, en
face du nom de fichier shema_thumb.gif pointant vers le schéma (le
schema s'ouvrant dans un autre div). (image_thumb.gif lorsque c'est une
image)
De plus, en cliquant sur le nom de fichier, apparait dans un autre div
(le meme que celui où s'affiche le schema), le code source de la page
avec la coloration syntaxique.
Le but de cette page PHP est de pouvoir faire en sorte que des personnes
puissent rajouter des fichiers et des schemas au site sans qu'il y ait
besoin de faire une mise a jour a la main de ce fichier php que je
cherche a faire.

Voila le code que je me suis efforcé de commenter de facon la plus
claire possible :

<body>
<?

//Declaration de la variable super globale

if(isset($HTTP_GET_VARS['page']))
{
$p = $HTTP_GET_VARS['page']; // la variable $p est attribuée
}
else
{
$p = 'monitor_schema';
}



?>


<div id="cadre-01">
<img src="../images/documentation/cadre_01.gif" width€0 height3
alt="">
</div>
<div id="cadre-02">
<img src="../images/documentation/cadre_02.gif" width7 heightS6
alt="">
</div>
<div id="cadre-04">
<img src="../images/documentation/cadre_04.gif" width4 heightS6
alt="">
</div>
<div id="cadre-05">
<img src="../images/documentation/cadre_05.gif" width€0 height1
alt="">
</div>

<div id="cadre-03">
<div id="doc-int-05">
<b><p class="titre">Diffusion</p></b>

<?
// Fonction listant dans un repertoire donné ($dir) les fichiers avec
l'extension $ext. La fonction retourne un tableau avec tous les fichiers


function listing ($dir,$ext) {
if ($handle = opendir($dir)) {

$count = 0;
while (false !== ($file = readdir($handle))) {
if(ereg("$ext", $file) == TRUE) {
$listing_files[$count] = $file;
$count = $count + 1;
}

}
closedir($handle);
}
return $listing_files;
}

// A partir d'un tableau avec des noms de fichiers .php par exemple,
elle retourne un tableau avec ces memes noms de fichiers mais sans leur
extension.


function switch_ext ($tab){
$i = 0;
while ($tab[$i] <> NULL) {
$pos_ext = strpos($tab[$i],".");
$name = substr ($tab[$i],0,$pos_ext);
$tab1[$i] = $name;
$i = $i+1;
}
return $tab1;
}

//Cette fonction fait apparaitre dans la page web le nom du fichier php
//En cliquant sur ce lien, on met $name dans la variable superglobal 'page'

function print_file ($name) {
echo "<a class="submenu"
href="doc_dev_diffusion.php?page=".$name."">".$name.".php </a>";
}

//Print_link permet a a partir d'un nom de fichier php et d'un tableau
avec les noms des images ou schéma presents sur le site, de verifier si
un schéma lié au fichier existe (les fichiers schemas et images
s'appellent image_nomdefichierlié.gif ou schema_nomdefichierlié.gif ).
// Dans notre cas, $link sera égal soit a "image" soit a "schema"


function print_link ($name,$listing_link,$link) {
$j = 0;
while ($listing_link[$j] <> NULL ) {
$name_img = $listing_link[$j];
$without_ext = $link."_".$name;
if ($name_img == $without_ext) {
echo "<a class="submenu"
href="doc_dev_diffusion.php?page=".$link."_".$name.""><img
src="../images/documentation/".$link."_thumb.gif" border="0"
height="16" width="16" alt="" align="absmiddle"/> </a>";
$table_link[$j] = 1;
}
else {
$table_link[$j] = 0;
}
$j = $j+1;
}
return $table_link;
}


$listing_files_ext = listing ('../diffusion/',".php");
$listing_files = switch_ext ($listing_files_ext);
$listing_schema_ext = listing ('../images/documentation/',"schema");
$listing_schema = switch_ext ($listing_schema_ext);
$listing_image_ext = listing ('../images/documentation/',"image");
$listing_image = switch_ext ($listing_image_ext);


// On affiche maintenant les noms des fichiers et on met en regard des
fichiers image_thumb.gif ou schema_thumb.gif, selon qu'il y est un
fichier php associé ou non.

$i = 0;
while ($listing_files[$i] <> NULL ) {
echo "<p class="inner">";
print_file ($listing_files[$i]);
$table_image = print_link ($listing_files[$i],$listing_image,"image");
$table_schema = print_link($listing_files[$i],$listing_schema,"schema");
echo "</p>";

$i = $i+1;
}

?>
</div>
<div id="doc-emplacement"><p class="inner">Ordi : <? echo
$dns_hebergement ?> </p><p class="inner"> Emplacement : <? echo
$home_hebergement."/".$path_hebergement ?></p></div>
</div>
<div id="cadre-double"><img
src="../images/documentation/cadre_double.gif" width( heightV4
alt=""></div>
<div id="Layer1" style="position:absolute; left:325px; top:30px;
width:445px; height:544px; z-index:1; visibility: visible; overflow:
auto;"><br>

<?

// Et maintenant, c'est de la que vient le probleme. $p peu prendre
plusieurs valeurs : soit nomdefichier (ils se trouvent dans le tableau
$listing_files)et applique la commande
highlight_file($listing_files[$k]) , soit "image_$nomdefichier" (les
fichiers liés a une image sont connus grace à $table_image) et on
affiche ladite image. Et de meme pour les schemas.



echo "<? switch($p)
{" ;
$k = 0;
$temp = $listing_files[$k];
while ($temp <> NULL) {
echo "case ".$temp." :
echo "highlight_file('../diffusion/".$temp.".php');";
echo "break;";
if ($table_image[$k] == 1) {
echo "case image_".$temp." :";
echo "<img src="../images/documentation/image_".$listing_image_ext.">";
echo "break;";
}
if ($table_schema[$k] == 1) {
echo "case schema_".$temp." :";
echo "<img src="../images/documentation/schema_".$listing_schema_ext.">";
echo "break;";
}
$k = $k+1;
$temp = $listing_files[$k];
}
echo "default :";
echo "<p>Page de la documentation</p>";
echo "break";
echo "} ?>";
?>


</div>

</body>
</html>


Voilou, merci d'etre arrivé jusque la.
Si vous avez une idée, n'hésitez pas, ca me depannerait bien.
Merci d'avance.
--
Tof
Avatar
Guillaume Bouchard
Tof wrote:
Je vais essayer d'étre plus clair :


Bonne chose.

Je dois faire une page php qui va chercher tous les fichiers php qui se
trouvent un repertoire donné et qui affichent le nom de ces fichiers sur
une page web.


Comme un explorateur de fichier en quelque sorte ?

Ensuite, certains fichiers sont liées à des schéma et des images (si le
fichier s'appelle grille.php, alors le schéma correspondant s'appelle
schema_grille.gif), mais tous n'ont pas necessairement un schema
explicatif, il faut donc que je trouve quels fichiers sont liés a un
schema ou a une image. La fonction rajoute alors sur la page web, en
face du nom de fichier shema_thumb.gif pointant vers le schéma (le
schema s'ouvrant dans un autre div). (image_thumb.gif lorsque c'est une
image)


Oki, file_exists() vas être ton amis.

De plus, en cliquant sur le nom de fichier, apparait dans un autre div
(le meme que celui où s'affiche le schema), le code source de la page
avec la coloration syntaxique.


Question comme cela, ton code source tu l'executes quand ?

Le but de cette page PHP est de pouvoir faire en sorte que des personnes
puissent rajouter des fichiers et des schemas au site sans qu'il y ait
besoin de faire une mise a jour a la main de ce fichier php que je
cherche a faire.


Ok.

//Declaration de la variable super globale

if(isset($HTTP_GET_VARS['page']))


Ça existe encore ça ? Utilise $_REQUEST.

{
$p = $HTTP_GET_VARS['page']; // la variable $p est attribuée
}
else
{
$p = 'monitor_schema';
}


Attention, détection de faille potentielle. Il ne faut JAMAIS faire
confiance aux variables externes.
[codehtml]



// Fonction listant dans un repertoire donné ($dir) les fichiers avec
l'extension $ext. La fonction retourne un tableau avec tous les fichiers

function listing ($dir,$ext) {
if ($handle = opendir($dir)) {

$count = 0;
while (false !== ($file = readdir($handle))) {


C'est vrai que si tu as un fichier qui s'appele '0' cela peux planter.
Mais bon, à la limite. Je me demande pourquoi false !== plutot que true
=== ? Pessimiste ?

while($file = readdir($handle)){

if(ereg("$ext", $file) == TRUE) {


1) On le repetera 100 fois, les regex ereg sont mauvaise, à remplacer
par les preg qui sont infiniement mieux implantée (enfin c'est la rumeur...)
2) $ext et non pas "$ext". C'est une variable
3) Pourquoi tu veux tester qu'un boolean est egal à un boolean ?
4) ton expression reguliere est fausse. Imagine que tu cherche
l'extension php, le fichier phptoto.py validera.

if(preg_match('`'.$ext.'$`,$file)){

$ indique la fin de chaine

5) L'expression régulière n'est pas necessaire dans ce cas, et surtout
dans ce cas.

Il ne faut JAMAIS utiliser des expressions regulière quand il y a une
autre solution basé sur les manipulations de chaines simples. C'est
comme ouvrir une boite de cassoulet avec une foreuse branché directement
sur une centrale nucléaire.

if(substr(strrchr($filename, "."), 1) == $ext){
// Il y a peux être mieux, pas cherché. le problème avec les fonctions
de chaines chez php c'est qu'il y en a telement, mais elles ont toutes
le même nom (strtr strstr stristr ...) ;o)

$listing_files[$count] = $file;


Tu pourais te passer de $count en faisant directement

$listing_files[] = $file;

// A partir d'un tableau avec des noms de fichiers .php par exemple,
elle retourne un tableau avec ces memes noms de fichiers mais sans leur
extension.


function switch_ext ($tab){
$i = 0;
while ($tab[$i] <> NULL) {
$pos_ext = strpos($tab[$i],".");
$name = substr ($tab[$i],0,$pos_ext);
$tab1[$i] = $name;
$i = $i+1;
}
return $tab1;
}


En theorie tu as l'extension que tu veux, non ? Alors faire comme ceci :

function switch_ext($tab,$ext){
foreach $tab as $key => $val {
$tab[$key] = basename($val,'.'.$ext);
}
return $tab;
}


//Cette fonction fait apparaitre dans la page web le nom du fichier php
//En cliquant sur ce lien, on met $name dans la variable superglobal 'page'

function print_file ($name) {
echo "<a class="submenu"
href="doc_dev_diffusion.php?page=".$name."">".$name.".php </a>";


Un petit truc qui sauve la vie, les simples quotes :

echo '<a class="submenu" href="..page='.$name.'">..</a>';

enplus c'est plus joli dans les éditeurs à colorations.


//Print_link permet a a partir d'un nom de fichier php et d'un tableau
avec les noms des images ou schéma presents sur le site, de verifier si
un schéma lié au fichier existe (les fichiers schemas et images
s'appellent image_nomdefichierlié.gif ou schema_nomdefichierlié.gif ).
// Dans notre cas, $link sera égal soit a "image" soit a "schema"


function print_link ($name,$listing_link,$link) {
[ Phaser nucléaire à propulsion sonique ]


Pourquoi se prendre la tete. Il te suffit de regarder avec la fonction
file_exists si ton 'image_'.$name_sans_ext.'.toto' existe.


$listing_schema_ext = listing ('../images/documentation/',"schema");


Je croyais que la fonction listing allait chercher les extension ? C'est
plus des extensions cela "schema"...

// Et maintenant, c'est de la que vient le probleme. $p peu prendre
plusieurs valeurs : soit nomdefichier (ils se trouvent dans le tableau
$listing_files)et applique la commande


Ba c'est une erreur !


echo "<? switch($p)


Bon, on t'as déjà repond à ce sujet.

Voilou, merci d'etre arrivé jusque la.


De rien.

Si vous avez une idée, n'hésitez pas, ca me depannerait bien.


Comme l'a dit John, pose toi, prend du temps, un café probablement et
reflechit à ce que tu veux faire.

Je reprend.

Tu as des fichiers php couplés avec des images que tu appeles shcema et
images, déjà cela me choque...
Quand executes-tu tes codes php ?

Je te laisse être un peu plus précit et esseyer de reflechir à ton
problème avec ce que je t'ai donné. Te donner une solution clef en main
ne servirais à rien d'autant plus que n'ayant pas parfaitement saisit le
problème, cela risquerais d'être incorect.

Bonne reflexion.

--
Guillaume.

Avatar
Sebastian 'CrashandDie' Lauwers
Guillaume Bouchard wrote:

[...]

C'est vrai que si tu as un fichier qui s'appele '0' cela peux planter.
Mais bon, à la limite. Je me demande pourquoi false !== plutot que true
=== ? Pessimiste ?
while($file = readdir($handle)){


Non, c'est comme ça dans la doc :p

<cit. http://fr.php.net/manual/en/function.readdir.php>
// Note that !== did not exist until 4.0.0-RC2

/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {

echo "$filen";

}

/* This is the WRONG way to loop over the directory. */
while ($file = readdir($handle)) {

echo "$filen";

}
</cit.>

Il ne faut JAMAIS utiliser des expressions regulière quand il y a une
autre solution basé sur les manipulations de chaines simples. C'est
comme ouvrir une boite de cassoulet avec une foreuse branché directement
sur une centrale nucléaire.

if(substr(strrchr($filename, "."), 1) == $ext){
// Il y a peux être mieux, pas cherché. le problème avec les fonctions
de chaines chez php c'est qu'il y en a telement, mais elles ont toutes
le même nom (strtr strstr stristr ...) ;o)


if (substr ($filename, strlen ($filename) - 3, strlen ($filename)) == $ext)

Je sais pas si c'est mieux, je pense pas en fait, c'est juste comme tu
le disais, le nombre de fonctions de chaînes en PHP est énorme.

[...]

Un petit truc qui sauve la vie, les simples quotes :

echo '<a class="submenu" href="..page='.$name.'">..</a>';

enplus c'est plus joli dans les éditeurs à colorations.


Ou encore

echo "<a class='submenu' href='..page=$name'>..</a>";

Même si je préfère la concaténation comme toi :).

[...]

Comme l'a dit John, pose toi, prend du temps, un café probablement et
reflechit à ce que tu veux faire.


En d'autres terme, une prise de recul permet souvent de mieux
comprendre. Lorsque je code un peu trop longtemps, et que j'en arrive au
point de ne plus comprendre ce que je fais, même si je sais ce que je
dois, tout du moins, j'en ai une idée, souvent se vider l'esprit
complètement est la meilleure façon de comprendre.

Je reprend.


Va plus en rester pour les autres...

Bonne reflexion.


Et bonne nuit,

Amicalement,
S.

Avatar
Tof

Je te laisse être un peu plus précit et esseyer de reflechir à ton
problème avec ce que je t'ai donné. Te donner une solution clef en main
ne servirais à rien d'autant plus que n'ayant pas parfaitement saisit le
problème, cela risquerais d'être incorect.


Merci pour tous ces conseils (notamment par rapport a la propreté du
code et la securité). Ayant débuté depuis quelques mois, il est vrai que
cela reste de "la programmation éclairée" comme dit dans un post
précedent. Mais vos commentaires m'ont permis de progresser.

Je pense avoir trouvé comment faire grace aux réponses des posts precedents.

Merci
--
Tof
www.christophe-berly.com
www.nxtelevision.com

Avatar
Vincent Lascaux
C'est vrai que si tu as un fichier qui s'appele '0' cela peux planter.
Mais bon, à la limite. Je me demande pourquoi false !== plutot que true
=== ? Pessimiste ?


false !== n'est pas la même chose que true === (bien venu dans le monde réel
:)).
Ca peut choquer, mais en fait c'est très simple : si tu compares à des
booléens, évidemment, ca fait la même chose, mais dès que tu compares à
quelques chose d'autre, les deux diffèrent. false !== "foo" est vrai, et
true === "foo" est faux.
readdir retourne soit une string soit false, jamais true. Donc true === sera
toujours faux

--
Vincent

Avatar
Guillaume Bouchard
Sebastian 'CrashandDie' Lauwers wrote:
while($file = readdir($handle)){


Non, c'est comme ça dans la doc :p


Cite:
Please note the fashion in which readdir()'s return value is checked in
the examples below. We are explicitly testing whether the return value
is identical to (equal to and of the same type as--see Comparison
Operators for more information) FALSE since otherwise, any directory
entry whose name evaluates to FALSE will stop the loop (e.g. a directory
named "0").

C'est ce que j'ai écrit. D'un autre coté.

1) Faut appeler ces répertoires 0 ou false, mais faut être motivé quand
même.

<joke>
cd ~/
ls
if then false while true 0 1
</joke>

Moi je fais interner tout de suite la personne qui fais ça ;o)

2) Ca n'empeche pas de faire while(true === ...) Soyons optimiste !
3) C'est vraiment la merde cette fonction de typage automatique... Vais
finir par forker un de ces jours. Des motivés ?

if (substr ($filename, strlen ($filename) - 3, strlen ($filename)) == $ext)


et les fichiers .py, .mpeg, .gz .toto .pyjama ?

if (substr ($filename, strlen ($filename) - strlen($ext), strlen
($filename)) == $ext) Devrait convenir.

Perso j'ai finit par me faire une fonction endswith($str,$end) qui
regarde que ça finit bien par.



Je sais pas si c'est mieux, je pense pas en fait, c'est juste comme tu
le disais, le nombre de fonctions de chaînes en PHP est énorme.


Le pire c'est que les 3/4 ne sont que des compositions des autres.

Je reprend.
Va plus en rester pour les autres...



Je suis gourmand.

Et bonne nuit,


Je crois qu'elle va être courte.

--
Guillaume.
Résolution 2 des vacances: se coucher avant minuit. Taux de reussite sur
11 jours, 0 %.


1 2