Page 1 sur 1

Problème de variables indéfinies

Posté : 26 avr. 2007, 13:20
par domuxy
Bonjour à tous,

J'ai toujours un problème de variables indéfinies.
Voici une partie de mon code :

Code:

Code : Tout sélectionner

<?PHP $Num = 0; for ($Num=0;$Num<6;$Num++) { ?> <p class="Style4"><u>Syllabi GJ</u> </p> <p> <?PHP function explorer($chemin) { $repertoire[$Num]= openDir($chemin); while ($fichier[$Num] =readDir($repertoire[$Num])) { if (($fichier[$Num] != ".")&&($fichier[$Num] != "..")) { $L = strlen($fichier[$Num]); ?> <?PHP $langue[$Num] = substr($fichier[$Num], 11, 1); if ($langue[$Num] == "F") { $a = "_"; $b = " "; $supp[$Num] = ereg_replace($a, $b, $fichier[$Num]); ?> <span class="Style5"> <img src="images/pointblanc.png" /> <a href="051411_GJ/<?PHP echo $fichier[$Num]; ?>"><?PHP echo substr($supp[$Num], 0, $L-4); ?></a> </span> <br> <?PHP } } } closeDir($repertoire[$Num]); } $cheminRep = "0"; $cheminRep0 = "051411_GJ"; $cheminRep1 = "051442_GJ"; $cheminRep2 = "051443_GJ"; $cheminRep3 = "051444_GJ"; $cheminRep4 = "051445_GJ"; $cheminRep5 = "051446_GJ"; explorer(${"cheminRep".$Num}); ?> </p> <?PHP } ?>
Je prend un exemple : $repertoire[$Num]= dans le code, cela me donne toujours une erreur de variable indéfinie.
Les autres variables me posent le même problème.
Comment puis-je résolver mon problème?
Cette application me sert à afficher le contenu de plusieurs répertoires.

Merci d'avance,

Domi

Posté : 26 avr. 2007, 13:37
par Sékiltoyai
La portée des variables, la portée des variables !!!
http://fr.php.net/manual/fr/language.va ... .scope.php

Posté : 26 avr. 2007, 13:49
par Ryle
et l'indentation du code !! et l'indentatiooonnn !!! ;)

Posté : 26 avr. 2007, 14:01
par sadeq
Correction:
1. distinguer les fonctions du programme principal
2. Eviter trop d'incrustaions HTML/PHP (<?PHP et ?>)
3. Passer les paramètres à la fonction ou utiliser le mot "global"
<?php
//chemins à expolrer
$cheminRep = "0"; 
$cheminRep0 = "051411_GJ"; 
$cheminRep1 = "051442_GJ"; 
$cheminRep2 = "051443_GJ"; 
$cheminRep3 = "051444_GJ"; 
$cheminRep4 = "051445_GJ"; 
$cheminRep5 = "051446_GJ"; 

//boucle d'explorartion
for ($Num=0;$Num<6;$Num++) { 
?> 
<p class="Style4"><u>Syllabi GJ</u> </p> 
<p> 
<?PHP
explorer(${"cheminRep".$Num} , $Num); 
?> 
</p> 
<?PHP 
} //fin for

//Fonction d'exploration
function explorer($chemin, $Num) { 
	$repertoire[$Num]= openDir($chemin); 
	while ($fichier[$Num] =readDir($repertoire[$Num])) { 
		if (($fichier[$Num] != ".")&&($fichier[$Num] != "..")) { 
			$L = strlen($fichier[$Num]); 
			$langue[$Num] = substr($fichier[$Num], 11, 1); 
			if ($langue[$Num] == "F") { 
				$a = "_"; 
				$b = " "; 
				$supp[$Num] = ereg_replace($a, $b, $fichier[$Num]); 
?> 
<span class="Style5"> 
<img src="images/pointblanc.png" /> 
<a href="051411_GJ/<?PHP echo $fichier[$Num]; ?>"><?PHP echo substr($supp[$Num], 0, $L-4); ?></a> 
</span> 
<br> 
<?PHP 
			}//fin if 
		} //fin if
	} //fin while
	closeDir($repertoire[$Num]); 
} //Fin fonction
?>
Mais ce programme peut être simplifié. Par exemple, l
1. a fome tableau n'est pas utile pour les variables $repertoire[$Num], $fichier[$Num], $langue[$Num] et $supp[$Num] qui ne sont jamais réutilisées. Du coup le paramètre $Num n'est plus utile pour la fonction.

2. la forme ${"cheminRep".$Num} est une possibilité de PHP mais en aucun cas une forme standard, elle correspond en effet à la forme standard d'un tableau : Il est donc préférable de la remplacer par une forme comme : $chemins[$num] et de stocker les chemins dans le tableau (array) $chemins.
La boucle for peut être simplifiée en la remplaçant par l'énumérateur foreach, puisqu'on a plus besoin de la variable $Num.

Cette simplification donnerait un truc comme ça:
<?php
//chemins à expolrer
$chemins = array("0","051411_GJ", "051442_GJ", "051443_GJ", "051444_GJ", "051445_GJ", "051446_GJ"); 

//boucle d'explorartion
if ($chemins && is_array($chemins))
foreach ($chemins as $chemin) { 
?> 
<p class="Style4"><u>Syllabi GJ</u> </p> 
<p> 
<?PHP
explorer($chemin); 
?> 
</p> 
<?PHP 
} //fin for

//Fonction d'exploration
function explorer($chemin) { 
	$repertoire= openDir($chemin); 
	while ($fichier =readDir($repertoire)) { 
		if ($fichier != "." && $fichier != "..") { 
			$L = strlen($fichier); 
			$langue = substr($fichier, 11, 1); 
			if ($langue == "F") { 
				$supp = ereg_replace("_", " ", $fichier); 
?> 
<span class="Style5"> 
<img src="images/pointblanc.png" /> 
<a href="051411_GJ/<?PHP echo $fichier; ?>"><?PHP echo substr($supp, 0, $L-4); ?></a> 
</span> 
<br> 
<?PHP 
			}//fin if 
		} //fin if
	} //fin while
	closeDir($repertoire); 
} //Fin fonction
?>

Posté : 26 avr. 2007, 14:17
par Sékiltoyai
4. Utiliser des classes si besoin s'en fait sentir...

Merci

Posté : 26 avr. 2007, 14:28
par domuxy
Merci de vos réponses.
J'examine tous çà et vous dit quoi.

Encore merci.

Posté : 26 avr. 2007, 16:15
par domuxy
Je tiens à remercier spécialement sadeq qui m'a franchement aidé dans ma recherche.
Sa solution fonctionne parfaitement et je vois réellement plus clair maintenant.
Merci d'avoir pris de ton temps pour analyser et solutioner mon problème.

Profitez qu'en même du bon temps les gars!

A+