8792 sujets

Développement web côté serveur, CMS

Pages :
Bonjour, j'ai une page INDEX.PHP qui fait
require ('gallery.php');
$dir = '.';
liste_repertoire('$dir');

Dans ce gallery.php, ma fonction
function liste_repertoire($dir) { ... }

Pourtant, quand j'affiche INDEX.PHP; il me dit
Fatal error: Call to undefined function: liste_repertoire()

Mon gallery.php est bien inclus dans la page puisque si je le retire, il m'affiche une erreur.

Savez vous pourquoi cette erreur de fonction indéfinie ?
Merci !
Bonjour.

... ça ne devrait pas se produire.

J'imagine que gallery.php se trouve dans le même répertoire que INDEX.PHP.
(si ce n'est pas le cas, vérifier qu'il n'y a pas un autre gallery.php quelque part dans les chemins accessibles par require)

Si vous êtes sur de bien invoquer le bon gallery.php, c'est que le problème réside dans l'accès à la fonction liste_repertoire().

Par exemple, si votre fonction est définie dans le corps d'une condition, et que cette condition n'est pas remplie, la fonction n'est pas accessible.

exemple :


if (condition)
{
   function liste_repertoire()
   {
        ....
   }
}
Bonjour, merci pour la réponse !
Non, gallery n'est pas dans le même répertoire que index mais je suis sûr de mon chemin.
En ce qui concerne la fonction, il n'y a pas de condition :
<?php
error_reporting(E_ALL | E_STRICT);

define ("NBRE_COLONNES", 5);

$types_ok = array ('image/jpeg', 'image/gif', 'image/png');
$tabl_exclus = array ('.', '..', 'miniature');
$tabl_liens = array();

// Parcours le répertoire courant et tout ses sous-répertoires récursivement.
function liste_repertoire($dir) {
	if ($handle = opendir($dir)) {
		while (($file = readdir($handle)) !== false) {
			$chemin_fichier = $dir.'/'.$file;
			if (is_dir($chemin_fichier)) {
				if (!in_array($file, $GLOBALS['tabl_exclus'])) {
					liste_repertoire($dir.'/'.$file);
				}
			} else {
				if (est_image($chemin_fichier)) {
					$chemin_miniature = $dir.'/miniature/'.$file;
					if (!file_exists($chemin_miniature)) {
						genere_miniature($dir, $chemin_fichier, $chemin_miniature);
					}
					ajoute_lien($chemin_fichier, $chemin_miniature, $file);
				}
			}
		}
		closedir($handle);
	}
}
gordie a écrit :
Non, gallery n'est pas dans le même répertoire que index mais je suis sûr de mon chemin.

Donc le chemin que tu as indiqué dans ton post initial est faux ! Smiley ohwell
Modifié par Bison (09 Nov 2006 - 14:15)
Mystère...

A votre place, je "tracerais" l'include et la fonction en rajoutant
echo "<h1>dans gallery.php</h1>";

en tout début du script, et

echo "<h1>dans liste_repertoire</h1>";

en tout début de la fonction.

D'autre part, autre suggestion, n'y a t'il pas, avant la déclaration de fonction un "exit" en réponse à un traitement d'erreur éventuel ?
Bison a écrit :

Donc le chemin que tu as indiqué dans ton post initial est faux ! Smiley ohwell

Dans son code, il est juste. S'il avait été faux, le script aurait généré une erreur.
GeorgesM a écrit :

Dans son code, il est juste. S'il avait été faux, le script aurait généré une erreur.

Ca veut dire qu'il y a un gallery.php accessible grâce à l'include_path... Sinon y'aurait effectivement une erreur fatale
Une chaine entre ' est préférable à une chaine entre " Smiley ohwell
Donc, cette syntaxe :
echo '<h1>dans gallery.php</h1>';


Georges a écrit :
Dans son code, il est juste. S'il avait été faux, le script aurait généré une erreur.

J'ai pas dit ça, j'ai dit que le code qu'il donnait ne refletait pas la réalité.
C'est lui qui affirme que gallery n'est pas à la même hauteur que index.php
Modifié par Bison (09 Nov 2006 - 14:46)
a écrit :
Une chaine entre ' est préférable à une chaine entre " Smiley ohwell


Pourquoi ?
Modifié par GeorgesM (09 Nov 2006 - 14:45)
GeorgesM a écrit :
Une chaine entre ' est préférable à une chaine entre " Smiley ohwell


Pourquoi ?
Premature optimization Smiley lol Mais en pratique, avec les single-quotes PHP ne parse par la string à la recherche de variables.
FlorentG a écrit :

Ca veut dire qu'il y a un gallery.php accessible grâce à l'include_path... Sinon y'aurait effectivement une erreur fatale


Oui. Et pour lever le doute, il faudrait renommer temporairement le gallery.php pour le rendre inaccessible, et constater l'erreur ou pas. Pas d'erreur, alors un gallery.php qui se promène dans les path...

a écrit :
Premature optimization Smiley lol Mais en pratique, avec les single-quotes PHP ne parse par la string à la recherche de variables.

... Ce qui est bien ennuyeux...
Modifié par GeorgesM (09 Nov 2006 - 14:50)
FlorentG a écrit :
Premature optimization Smiley lol Mais en pratique, avec les single-quotes PHP ne parse par la string à la recherche de variables.

Pas seulement, ça évite lors de la génération de html d'avoir une horreur comme celle-ci :
<?php
echo "<input type=\"text\" name=\"truc\" value=\"chose\" class=\"pouet\" />";
?>

Modifié par Bison (09 Nov 2006 - 15:33)
GeorgesM a écrit :
Oui. Et pour lever le doute, il faudrait renommer temporairement le gallery.php pour le rendre inaccessible, et constater l'erreur ou pas. Pas d'erreur, alors un gallery.php qui se promène dans les path...

Je l'ai fait et il y avait une erreur quand le fichier était renommé; donc il appelle bien le bon.
En ce qui concerne le "traçage"; ça n'a pas marché car l'erreur d'appel de fonctions s'affichait avant.
Par contre, si je retire la fonction et que j'essaie le traçage ça marche.
Bison a écrit :

Pas seulement, ça évite lors de la génération de html d'avoir une horreur comme celle-ci :
<?php
echo "<input type=\"text\" name=\"truc\" value=\"chose\" class=\"pouet\" />";
?>


J'aurrais écrit ;


echo '<input type="text" name="truc" value="chose" class="pouet" />';


ou


echo "<input type='text' name='truc' value='chose' class='pouet' />"; (typo rajouté un " ' " à la fin de "pouet")

Modifié par GeorgesM (09 Nov 2006 - 15:49)
GeorgesM a écrit :
echo '<input type="text" name="truc" value="chose" class="pouet" />';

Tu écris une fois avec des ", l'autre fois avec des '
Pourquoi ce manque de cohérence entre tes deux lignes ?

GeorgesM a écrit :

echo "<input type='text' name='truc' value='chose' class='pouet />";

Pas bon !
Tu sais me dire pourquoi ?
Modifié par Bison (09 Nov 2006 - 15:47)
gordie a écrit :

Je l'ai fait et il y avait une erreur quand le fichier était renommé; donc il appelle bien le bon.
En ce qui concerne le "traçage"; ça n'a pas marché car l'erreur d'appel de fonctions s'affichait avant.
Par contre, si je retire la fonction et que j'essaie le traçage ça marche.


Mystère, mystère.

Bon. On est sur de :
- le fichier en include est le bon.

A votre place, je désactiverais temporairement le corps de la fonction, avec /* et */ en ne conservant que le traçage. Il faut bien, qu'elle se décide à répondre, cette fonction!
Bison a écrit :
Tu écris une fois avec des ", l'autre fois avec des '
Pourquoi ce manque de cohérence entre tes deux lignes ?

Pour vous montrer que les deux sont possibles, et dans ce cas, mieux que \"

Bison a écrit :

Pas bon !
Tu sais me dire pourquoi ?

Non.
Modifié par GeorgesM (09 Nov 2006 - 15:51)
GeorgesM a écrit :

Pour vous montrer que les deux sont possibles, et dans ce cas, mieux que \"


Non.

Je ne te parles pas de tes deux lignes là maintenant, je parles de ton manque de cohérence entre la ligne que tu as faites avec des " dans l'autre post et celle avec les ' que tu écrirais pour éviter d'avoir des \

Donc, dans un même script tu adopterais deux manières de faire, d'où manque de cohérence.
Pour ce qui est de la ligne avec les single quotes, la solu n'est pas la meilleure non plus car dans le cadre d'un passage via un htmlspecialchars, les quotes n'ont pas d'entités définies par défaut.
Bison a écrit :
Donc, dans un même script tu adopterais deux manières de faire, d'où manque de cohérence.
Pour ce qui est de la ligne avec les single quotes, la solu n'est pas la meilleure non plus car dans le cadre d'un passage via un htmlspecialchars, les quotes n'ont pas d'entités définies par défaut.
Mouarf, c'est de plus en plus capillo-tracté ici...

Pour ma part je privilégie aussi les quotes, mais je ne vois pas ce que ce débat vient faire ici (bientôt, tu vas te mettre à critiquer l'indentation du code, Bison).

Et puis pour htmlspecialchars, il peut très bien échapper les quotes si tu utilises le quote_style adéquat.
Bison a écrit :

Donc, dans un même script tu adopterais deux manières de faire, d'où manque de cohérence.
Pour ce qui est de la ligne avec les single quotes, la solu n'est pas la meilleure non plus car dans le cadre d'un passage via un htmlspecialchars, les quotes n'ont pas d'entités définies par défaut.


La maîtrise consiste à utiliser le bon outil au bon endroit. A mes yeux, l'utilisation de ' " ', " ' ", ou " ` ", ou avec l'échappement, ou des entités, dépend du contexte. Il m'arrive souvent de générer du php à partir d'autres langages, et eux-mêmes ont leur contraintes (entités, échappement...)

C'est vrai que si je lis du code, je ne m'arrête pas à ce genre de détail, car ils ne me gènent en aucune manière.

Je ne me sent pas moins rigoureux pour autant.
Pages :