Page 1 sur 1

problème chemin

Posté : 16 sept. 2009, 18:25
par tipi
Bonjour,

Je suis en train de faire un site web, cependant j'ai un soucis avec les chemins.

Voici mon code:
function liste_images($repertoire=".")
	{
		$repertoire = "C:\Program Files\EasyPHP 3.0\www\toto\tata";
		
		$extension = array("jpg", "png", "jpeg", "gif");
		$tableau = array();
		
		echo $repertoire;
		if($handle = opendir($repertoire))
		{
			while(false !== ($fichier = readdir($handle)))
			{
				for($i = 0; $i < sizeof ($extension); $i++)
				{	
					if(strstr ($fichier, "." .$extension[$i]))
					{
						echo $fichier;
						$tableau[] = $fichier;
					}
				}
			}
			closedir($handle);
		}
		
		for ($j=0;$$tableau[$j] != false;$j++)
		{
			echo $tableau[$j].'<br>';
		}
		return($tableau);
	}
Voici mon erreur:
C:\Program Files\EasyPHP 3.0\www oto ata
Warning: opendir(C:\Program Files\EasyPHP 3.0\www\toto\tata) [function.opendir]: failed to open dir: No error in C:\Program Files\EasyPHP 3.0\www\toto\classe_boutique.php on line 1391

Je ne comprend pas pourquoi il ne prend pas en compte mes antislashs et me supprime une lettre.

Merci de votre aide

Re: problème chemin

Posté : 16 sept. 2009, 19:00
par Hywan
Hey :-),

La raison est simple : remplace les guillemets doubles par des guillets simples, i.e. préfère :
$repertoire = 'C:\Program Files\EasyPHP 3.0\www\toto\tata';
Pourquoi ? Car PHP interprète le contenu placé entre guillemets doubles, donc \t correspond à une tabulation, alors qu'il n'interprète pas le contenu placé entre guillemets simples. Tada :-).

Au passage, ce n'est pas très propre d'utiliser ce genre de chemin, mais c'est peut-être temporaire ?

Re: problème chemin

Posté : 16 sept. 2009, 19:06
par tipi
qu'est ce qui serait plus propre??

Ok, c'est bon pour les simples quotes

Merci de ton aide

Re: problème chemin

Posté : 16 sept. 2009, 19:07
par zeus
Tout simplement parce que toute chaine encadré par des doubles quotes (") est interprété, et que "\t" est le caractère représentant une tabulation.
Donc, au moment de l'affectation de la chaine ($repertoire = "C:\Program Files\EasyPHP 3.0\www\toto\tata";), les \t sont remplacés par des tabulations (d'ailleurs, si tu regardes la coloration de ton code dans le 1er post, tu verras que les \t sont mis en gras ;))

La solution, c'est de remplacer des doubles quotes (") par des simples quotes ('), puisque leur présence n'entraine aucune interprétation, et donc aucun remplacement.

Remplace donc simplement la ligne
$repertoire = "C:\Program Files\EasyPHP 3.0\www\toto\tata";
par
$repertoire = 'C:\Program Files\EasyPHP 3.0\www\toto\tata';
D'ailleurs, pour faire un petit apparté, une des bonnes pratiques du développement PHP est d'utiliser les simples quotes (') et de ne pas mettre de variables dans les chaines de caractères
$var = "toto"; // pas bien
$var = 'toto'; // bien
$var = 'toto';

echo "contenu de var : $var"; // affiche "contenu de var: toto", mais c'est pas bien
echo 'contenu de var : $var'; // affiche "contenu de var : $var", ce n'est donc pas bien
echo "contenu de var : ".$var; // affiche "contenu de var: toto", mais c'est pas bien
echo 'contenu de var : '.$var; // affiche "contenu de var : toto" et c'est une bonne pratique
edit : mouarf, grillé

Re: problème chemin

Posté : 16 sept. 2009, 19:09
par Hywan
Hehe, grillé Zeus, grillééé :mrgreen: !



Bien, sinon ce n'est pas que ce n'est pas bien d'utiliser des guillemets doubles, c'est juste que c'est plus lent. Mais côté optimisation, on connaît mieux (et oui, c'est moi qui dit ça :-)). Mais tu as utilisé le bon terme en disant : « bonne pratique » :-).

Sinon, pourquoi ce n'est pas propre d'utiliser des chemins C:\ ? Car ce n'est pas portable, voilà pourquoi. Quand tu vas mettre ton application sur ton serveur (sous Linux à 99%), tu vas avoir de belles surprises ;-).

Re: problème chemin

Posté : 16 sept. 2009, 19:13
par zeus
En fait, je pensais au film "le paris" en faisant mon code ;)

Re: problème chemin

Posté : 16 sept. 2009, 19:19
par tipi
mais alors comment je dois écrire mon chemin??

Re: problème chemin

Posté : 16 sept. 2009, 19:22
par Hywan
En fait, je pensais au film "le paris" en faisant mon code ;)
:-p
mais alors comment je dois écrire mon chemin??
En relatif peut-être ? Tu sais ce que ça veut dire ?

Re: problème chemin

Posté : 16 sept. 2009, 19:25
par tipi
non pas trop???

Re: problème chemin

Posté : 16 sept. 2009, 19:37
par Hywan
/Ceci/est/un/chemin/absolu
../ceci/est/un/chemin/relatif

Absolu ça signifie qu'on démarre depuis la racine (/ ou C:\ par exemple). Relatif, ça signifie qu'on définit un chemin depuis notre position courante.

Par exemple :

Code : Tout sélectionner

A/ Aa.php Ab.php B/ Ba.php Bz.php
Tu es dans Aa.php, tu veux atteindre Ba.php, soit tu fais /racine/vers/B/Ba.php, soit de façon plus intelligente : ../B/Ba.php. Avantage : c'est portable car peu importe où tu installes ton application, les chemins seront toujours valides (si tu restes dans ton application bien sûr). Inconvénient : aucun.
Compris :-) ?

Re: problème chemin

Posté : 16 sept. 2009, 20:07
par tipi
Yes.

J'ai un soucis:
$nom_collect = "images\ $nom_collect";
Pourquoi ça me donne images\ tata. Si tu ne mets pas d'espace entre le "\" et $nom_collect, $nom_collect n'est pas considéré comme une variable.

Merci de ton aide

Re: problème chemin

Posté : 16 sept. 2009, 20:16
par Hywan
On t'a dit que \ (backslash) sert à échapper des caractères. Dans ton cas, le $ (dollars) va être échappé. Écrit plutôt :
$nom_collect = 'images\\' . $nom_collect;
Déjà, on veut concaténer, c'est plus rapide : 'images' . $nom_collect.
Mais il manque notre marqueur de nœud, le backslash, donc 'images\' . $nom_collect.
Oui mais, le backslash va échapper notre guillemet simple de fermeture, donc on l'échappe lui aussi : 'images\\' . $nom_collect.

Oui les chemins sous Windows sont ultra chiants … C'est pourquoi Windows comprend les chemins avec des slashes maintenant. Autrement dit :
$nom_collect = 'images/' . $nom_collect;
est tout aussi valide (et conseillé pour la portabilité avec tous les autres OS) ;-).