problème chemin

Eléphant du PHP | 77 Messages

16 sept. 2009, 18:25

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

ViPHP
ViPHP | 4674 Messages

16 sept. 2009, 19:00

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 ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 77 Messages

16 sept. 2009, 19:06

qu'est ce qui serait plus propre??

Ok, c'est bon pour les simples quotes

Merci de ton aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 sept. 2009, 19:07

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é
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

ViPHP
ViPHP | 4674 Messages

16 sept. 2009, 19:09

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 ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 sept. 2009, 19:13

En fait, je pensais au film "le paris" en faisant mon code ;)
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

Eléphant du PHP | 77 Messages

16 sept. 2009, 19:19

mais alors comment je dois écrire mon chemin??

ViPHP
ViPHP | 4674 Messages

16 sept. 2009, 19:22

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 ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 77 Messages

16 sept. 2009, 19:25

non pas trop???

ViPHP
ViPHP | 4674 Messages

16 sept. 2009, 19:37

/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 :-) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 77 Messages

16 sept. 2009, 20:07

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

ViPHP
ViPHP | 4674 Messages

16 sept. 2009, 20:16

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) ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).