Discussion:
Message d'erreur bizarre
(trop ancien pour répondre)
Pascale
2008-12-26 21:10:14 UTC
Permalink
Bonjour à tous, et meilleurs vœux, tout ça (-:

Fatal error, qu'il dit... Je teste mes programmes (PHP5) et je me retrouve
de temps en temps avec le message d'erreur suivant :

Fatal error: Cannot redeclare add_url() (previously declared in
/home/lgv/www/valinfotest/func.php:4) in /home/lgv/www/valinfotest/func.php
on line 7

Explication : func.php est un programme qui contient toutes les fonctions
utiles au fonctionnement du site. On l'appelle systématiquement par un
include en début de programme, qu'on ait besoin ou non des fonctions en
question.
add_url() est tout bêtement la première fonction de la liste. Si on
l'enlève, c'est la deuxième qui ressort dans le message d'erreur.

Le truc bizarre, c'est que ce problème se produit... de temps en temps,
sans que je sache pourquoi ni comment, et qu'il disparaît de même ! Quand
il se produit, tous les programmes qui appellent func.php se plantent. J'ai
essayé de remplacer l'include par un require, cela ne change rien. Changer
de navigateur n'avance à rien non plus.

Quelqu'un pour éclaircir se mystère ?
--
Pascale
Denis Beauregard
2008-12-26 21:28:18 UTC
Permalink
Post by Pascale
Fatal error, qu'il dit... Je teste mes programmes (PHP5) et je me retrouve
Fatal error: Cannot redeclare add_url() (previously declared in
/home/lgv/www/valinfotest/func.php:4) in /home/lgv/www/valinfotest/func.php
on line 7
Il doit y avoir 2 include dans le code de temps en temps.

Il faut faire include_once


Denis
Olivier Miakinen
2008-12-26 21:28:18 UTC
Permalink
Bonjour,
Post by Pascale
Fatal error, qu'il dit... Je teste mes programmes (PHP5) et je me retrouve
Fatal error: Cannot redeclare add_url() (previously declared in
/home/lgv/www/valinfotest/func.php:4) in /home/lgv/www/valinfotest/func.php
on line 7
Explication : func.php est un programme qui contient toutes les fonctions
utiles au fonctionnement du site. On l'appelle systématiquement par un
include en début de programme, qu'on ait besoin ou non des fonctions en
question. [...]
Le truc bizarre, c'est que ce problème se produit... de temps en temps,
sans que je sache pourquoi ni comment, et qu'il disparaît de même ! Quand
il se produit, tous les programmes qui appellent func.php se plantent.
Malheureusement, le Père-Noël ne m'a pas apporté de nouvelle boule
de cristal, alors je ne peux que supposer... Parmi toutes les chaînes
d'inclusion de fichiers PHP, il n'y a pas un cas qui ferait que func.php
serait inclus deux fois ? Par exemple un truc de ce genre :

A.php -> include(B.php)
B.php -> if (test) include(C.php)
C.php -> include(func.php)
xxx.php -> include(func.php) ; include(A.php)

(ou plus simple, ou plus complexe)
Post by Pascale
J'ai essayé de remplacer l'include par un require, cela ne change rien.
Tu as déjà entendu parler de include_once() et require_once() ?
Post by Pascale
Changer de navigateur n'avance à rien non plus.
Euh... le fait que tu te sois posé la question montre que tu n'es pas
encore au clair entre ce qui se passe sur le serveur et ce qui se passe
dans le navigateur. :-(
Post by Pascale
Quelqu'un pour éclaircir ce mystère ?
Non, mais pour le résoudre oui : include_once().
Pascale
2008-12-26 22:55:43 UTC
Permalink
Post by Olivier Miakinen
Euh... le fait que tu te sois posé la question montre que tu n'es pas
encore au clair entre ce qui se passe sur le serveur et ce qui se passe
dans le navigateur. :-(
Si, mais je préfère toujours vérifier. Je sais aussi que le cache des
navigateurs produit parfois des trucs curieux (on peut le vider, mais je
suis une feignasse).
Post by Olivier Miakinen
Non, mais pour le résoudre oui : include_once().
Exact, include_once ou require_once résolvent le problème. Néanmoins, je ne
m'explique pas que ce problème soit apparu de manière aléatoire sur
certains programmes (inchangés depuis des semaines, testés et retestés,
et où, j'ai vérifié, mon fameux func.php n'est pourtant appelé qu'une
fois).
Merci à Denis et à toi.
--
Pascale
Olivier Miakinen
2008-12-27 01:22:19 UTC
Permalink
[...] je ne
m'explique pas que ce problème soit apparu de manière aléatoire sur
certains programmes (inchangés depuis des semaines, testés et retestés,
et où, j'ai vérifié, mon fameux func.php n'est pourtant appelé qu'une
fois).
Juste pour savoir...

Tu as un fichier, mettons xxx.php, qui inclut func.php.
1) xxx.php n'inclut aucun autre fichier que func.php ?
2) xxx.php n'est inclus dans aucun autre fichier ?
3) l'inclusion de func.php n'a pas lieu dans une fonction ?
Pascale
2008-12-27 20:34:14 UTC
Permalink
Post by Olivier Miakinen
Tu as un fichier, mettons xxx.php, qui inclut func.php.
1) xxx.php n'inclut aucun autre fichier que func.php ?
Non (mais j'ai vérifié que func.php n'était appelé qu'une fois par 1
programme).
Post by Olivier Miakinen
2) xxx.php n'est inclus dans aucun autre fichier ?
Si, ça peut.
Post by Olivier Miakinen
3) l'inclusion de func.php n'a pas lieu dans une fonction ?
A y est, mes 2 neurones sont pétés, je comprends pas cette question.
--
Pascale
Olivier Miakinen
2008-12-27 21:16:08 UTC
Permalink
Post by Pascale
Post by Olivier Miakinen
Tu as un fichier, mettons xxx.php, qui inclut func.php.
1) xxx.php n'inclut aucun autre fichier que func.php ?
Non (mais j'ai vérifié que func.php n'était appelé qu'une fois par 1
programme).
En disant ça, tu distingues les « programmes » (pages appelables
directement via une URL) des autres fichiers PHP, lesquels peuvent
être inclus dans des « programmes » ?
Post by Pascale
Post by Olivier Miakinen
2) xxx.php n'est inclus dans aucun autre fichier ?
Si, ça peut.
Ah. Donc cela contredit ce que je pensais ci-dessus. Mais bon, je
suppose que tu as vérifié que dans toutes les chaînes d'inclusion il
n'y en avait aucune incluant deux fois func.php.

Pour être sûr de ça... ça veut dire que si xxx.php inclut yyy.php et
zzz.php, alors parmi ces trois fichiers (xxx.php, yyy.php et zzz.php)
il y en a *au plus un* qui inclut directement func.php. Et ceci s'étend
pour tout ensemble de N fichiers s'incluant les uns les autres.
Post by Pascale
Post by Olivier Miakinen
3) l'inclusion de func.php n'a pas lieu dans une fonction ?
A y est, mes 2 neurones sont pétés, je comprends pas cette question.
<?php
function truc()
{
include("func.php");
}

...

if (n >= 3) { truc(); chose(); }
if (n <= 3) { truc(); bidule(); }
?>
Pascale
2008-12-28 10:29:16 UTC
Permalink
Post by Olivier Miakinen
En disant ça, tu distingues les « programmes » (pages appelables
directement via une URL) des autres fichiers PHP, lesquels peuvent
être inclus dans des « programmes » ?
Oui : la plupart des fichiers inclus sont des .inc (d'accord, ce n'est pas
le cas de func.php)...
Post by Olivier Miakinen
Post by Pascale
Post by Olivier Miakinen
2) xxx.php n'est inclus dans aucun autre fichier ?
Si, ça peut.
Ah. Donc cela contredit ce que je pensais ci-dessus. Mais bon, je
suppose que tu as vérifié que dans toutes les chaînes d'inclusion il
n'y en avait aucune incluant deux fois func.php.
Oui.
Post by Olivier Miakinen
Pour être sûr de ça... ça veut dire que si xxx.php inclut yyy.php et
zzz.php, alors parmi ces trois fichiers (xxx.php, yyy.php et zzz.php)
il y en a *au plus un* qui inclut directement func.php. Et ceci s'étend
pour tout ensemble de N fichiers s'incluant les uns les autres.
C'est bien comme ça que je le comprends.
L'erreur pourrait-elle se produire, si, auparavant, j'ai chargé une autre
page aaaa.php incluant yyyy.inc (disons que c'est lui qui appelle func.php)
et un ou plusieurs autres fichiers quelquechose.inc (je suis une feignasse,
j'utilise pas mal include pour appeler des morceaux de code réutilisés dans
plusieurs programmes.)
Post by Olivier Miakinen
Post by Pascale
Post by Olivier Miakinen
3) l'inclusion de func.php n'a pas lieu dans une fonction ?
<?php
function truc()
{
include("func.php");
}
if (n >= 3) { truc(); chose(); }
if (n <= 3) { truc(); bidule(); }
?>
Donc la réponse est non.
--
Pascale
slambert
2008-12-28 23:33:05 UTC
Permalink
Oui : la plupart des fichiers inclus sont des .inc
Attention

Les .inc ne sont generalement pas interprétés, ce qui veut dire qu'en cas
d'appel direct, ton code sera visible.

Si c'est effectivement le cas, il est fortement conseillé de les renommer en
.php .

S.L.
Pascale
2008-12-30 12:38:34 UTC
Permalink
Post by slambert
Les .inc ne sont generalement pas interprétés, ce qui veut dire qu'en
cas d'appel direct, ton code sera visible.
Effectivement, mais bof, il n'y a rien de bien confidentiel dans ce code.
--
Pascale
www.valinfo.org - Calendrier et annuaire de la vie associative locale
slambert
2008-12-30 15:39:51 UTC
Permalink
Post by Pascale
Post by slambert
Les .inc ne sont generalement pas interprétés, ce qui veut dire qu'en
cas d'appel direct, ton code sera visible.
Effectivement, mais bof, il n'y a rien de bien confidentiel dans ce code.
Tu n'en sais rien.

Il y a ta manière de programmer.

Le nom de tes variables.

Ta facon d'envisager la sécurité.

Si ca te trouve, il est meme possible, en passant les bon paramètres, de
provoquer quelques dégats.

Dans le doute, il vaut mieux que le code reste non visible. Dans le meilleur
des monde, un script pourrait meme n'etre appelé que via un controlleur
(central ou particulier) qui se chargerait de toutes les vérifications
d'usages avant de lancer ou non l'exécution du programme.

Stef
Denis Beauregard
2008-12-31 01:48:46 UTC
Permalink
Post by Pascale
Post by slambert
Les .inc ne sont generalement pas interprétés, ce qui veut dire qu'en
cas d'appel direct, ton code sera visible.
Effectivement, mais bof, il n'y a rien de bien confidentiel dans ce code.
Il suffit que tu places le mot de passe d'une base de données
dans un .inc appelé maladroitement motdepasse.inc ou password.inc
et tu viens d'ouvrir ton site à tout le monde. De même, si tu laisses
un fichier doc.txt avec tous les paramètres de connexion, quelqu'un
peut tomber dessus par hasard. Quand je regarde mon log, je vois de
temps en temps des noms de fichiers que je n'ai jamais eus.


Denis
Pascale
2009-01-03 20:49:42 UTC
Permalink
Post by Denis Beauregard
Il suffit que tu places le mot de passe d'une base de données
dans un .inc appelé maladroitement motdepasse.inc ou password.inc
et tu viens d'ouvrir ton site à tout le monde.
Merci à slambert et à toi pour les explications. Je n'ai pas de .inc aussi
dangereux, mais je vais quand même les remplacer par des .php, par
sécurité.
Il me semble que dans des versions anciennes de PHP on ne pouvait pas faire
d'include xxxxxx.php mais seulement xxxxxx.inc. Non ?
--
Pascale
Pascal PONCET
2009-01-04 17:45:34 UTC
Permalink
Post by Pascale
Je n'ai pas de .inc aussi
dangereux, mais je vais quand même les remplacer par des .php, par
sécurité.
Il me semble que dans des versions anciennes de PHP on ne pouvait pas faire
d'include xxxxxx.php mais seulement xxxxxx.inc. Non ?
Bonjour,

Peut-être avant la version 3, mais je n'ai jamais vu.

Sinon, il est possible de nommer les fichiers à inclure "xxx.inc.php",
comme les classes "xxx.class.php", pour éventuellement plus de clarté.
C'est une notation assez fréquente, même si elle est héritée d'autres
langages.
La sécurité sera toujours assurée puisque, pour le serveur, c'est la
dernière extension qui compte.

Cordialement,
Pascal
Mickael Wolff
2009-01-06 07:21:35 UTC
Permalink
Post by Pascale
Merci à slambert et à toi pour les explications. Je n'ai pas de .inc aussi
dangereux, mais je vais quand même les remplacer par des .php, par
sécurité.
Attention, le remède peut être pire que le mal. Si en .inc ils sont
lisibles en clair, en .php ils sont exécutables. Et si tu n'as pas mis
de garde fous, le comportement peut être indéterminé.

Le mieux, c'est de reléguer les fichiers inclus dans un répertoire
inaccessible via HTTP, mais tout de même accessibles par le script PHP.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
slambert
2009-01-07 01:03:49 UTC
Permalink
Post by Mickael Wolff
Le mieux, c'est de reléguer les fichiers inclus dans un répertoire
inaccessible via HTTP, mais tout de même accessibles par le script PHP.
Absolument.

Généralement, seul mon controlleur est accessible en http. Les autres
fichiers sont en dehors du www, un cran plus bas. Par contre, il ne faut pas
etre en mutualisé, ca complique.....

S.L.
Pascale
2009-01-10 22:01:18 UTC
Permalink
Post by slambert
Par contre, il ne faut pas
etre en mutualisé, ca complique.....
Et nous y sommes, précisément...
M'enfin, mes programmes appelés par include (que j'ai passés maintenant
en .php) ne sont pas plus dangereux que le reste des programmes...
--
Pascale
mpg
2008-12-27 21:16:08 UTC
Permalink
Post by Pascale
Post by Olivier Miakinen
3) l'inclusion de func.php n'a pas lieu dans une fonction ?
A y est, mes 2 neurones sont pétés, je comprends pas cette question.
Je comprends la question comme ça : n'y a-t-il pas dans ton code


function blabla() {
include "func.php";
// des trucs
}

et la fonction blabla n'est-elle pas appelée une fois ou plus, selon les
fois ? Ce qui expliquerait la caractère fluctuant de l'erreur...

Manuel.
Loading...