Version complète: sur le forum Webmaster Hub : Failed opening sur une base existante
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
francoisch
Bonjour

La fonction messlecture.php, que je développe, appelle la fonction connexion.php, sans succcès :
Warning: main() [function.main]: open_basedir restriction in effect. File(../../connexion.php) is not within the allowed path(s): (/mnt/167/sda/f/b/fctestmad) in /mnt/167/sda/f/b/fctestmad/martinot/reserve/messlecture.php on line 15

Warning: main(../../connexion.php) [function.main]: failed to open stream: Operation not permitted in /mnt/167/sda/f/b/fctestmad/martinot/reserve/messlecture.php on line 15

Fatal error: main() [function.require]: Failed opening required '../../connexion.php' (include_path='/mnt/167/sda/f/b/fctestmad/include:.:/usr/php4/lib/php') in /mnt/167/sda/f/b/fctestmad/martinot/reserve/messlecture.php on line 15

Mais:
- la base existe
- cette base, et la même table, sont appelées par d’autres fonctions opérationnelles (installées dans le même répertoire que messlecture.php) en appellant de même la fonction connexion.php
- ces appels fonctionnent parfaitement à la même minute où l’appel ci-dessus plante

J’ai naturellement repris le code déjà utilisé par les autres fonctions :
CODE
require_once ("../../connexion.php");

Naturellement, avec un include, ça plante pareil.

Je sèche ; j’aurais loupé un truc gros comme une maison ?

Par avance merci de votre aide.

Francois
Occi
Salut,

tu as apparemment une erreur à la ligne 15 du fichier messlecture.php, il faudrait voir le code qui se trouve à cet endroit.

EDIT : oups en relisant je me dis que ça doit être l'erreur provoquée par un problème de chemin que tu as en faisant ton include(), à tu vérifiais que le chemin de ton require_once ("../../connexion.php"); est correct ?

Occi
francoisch
Oui, à la ligne 15, il y a le Require_once (Include fait pareil, sauf l'erreur fatale).

Oui, connexion.php est deux niveaux au dessus de messlecture.php.

Deux autres fonctions, installées dans le même répertoire que messlecture.php appellent le même connexion.php.

Oui, ça ressemble à une histoire de fou.

Merci de m'aider à trouver mon erreur.

Francois
Dan
C'est tout simplement parce que l'Open Basedir est actif. Tu ne peux donc pas ouvrir (require ou include) des fichiers qui ne sont pas dans le Path : /mnt/167/sda/f/b/fctestmad

Si ce fichier se trouve bien dans ce répertoire, essaie avec un require("connexion.php") , il devrait passer
francoisch
Merci de ta réponse Dan.

J'ai fait progresser mes tests mais j'en suis tjs au même point; j'ai simplifié à l'extrême mes fonctions.

La function test1.php appelle la function test2.php installée dans le répertoire reserve en dessous:
CODE
<?php
include ("reserve/test2.php");
?>

et ça fonctionne.

Cette fonction test2.php appelle la fonction test3.php installée deux répertoires au dessus :
CODE
<?php
include ("../../test3.php");
?>

et ça ne fonctionne pas :
CODE
Warning: main() [function.main]: open_basedir restriction in effect. File(../../test3.php) is not within the allowed path(s): (/mnt/167/sda/f/b/fctestmad) in /mnt/167/sda/f/b/fctestmad/martinot/reserve/test2.php on line 2

Warning: main(../../test3.php) [function.main]: failed to open stream: Operation not permitted in /mnt/167/sda/f/b/fctestmad/martinot/reserve/test2.php on line 2

Warning: main() [function.include]: Failed opening '../../test3.php' for inclusion (include_path='/mnt/167/sda/f/b/fctestmad/include:.:/usr/php4/lib/php') in /mnt/167/sda/f/b/fctestmad/martinot/reserve/test2.php on line 2


Pourtant :
- j’ai essayé avec require_once, require, include avec le même résultat
- j’ai déjà des fonctions qui s’appellent de manière identique et ça fonctionne toujours

Je sèche ; merci par avance de votre aide.

Francois
Dan
Le message d'erreur:
CITATION
Warning: main() [function.main]: open_basedir restriction in effect. File(../../test3.php) is not within the allowed path(s): (/mnt/167/sda/f/b/fctestmad) in /mnt/167/sda/f/b/fctestmad/martinot/reserve/test2.php on line 2

te donne la raison.

Comme je te le disais, la restriction open_basedir est active !
Il faut que tu mettes tes fichiers à inclure dans le répertoire /mnt/167/sda/f/b/fctestmad et n'utilises pas ../.. dans tes inclusions.

CITATION
La restriction spécifiée par open_basedir est en fait un préfixe et non un dossier. Cela signifie que "open_basedir = /dir/incl" donne accès au dossier "/dir/include" et aussi au dossier "/dir/incls" s'il existe. Lorsque vous souhaitez restreindre l'accès à un dossier spécifique, ajoutez un slash final. Par exemple : open_basedir = /dir/incl/.


Essaie en mettant le chemin complet vers ton fichier, par exemple /mnt/167/sda/f/b/fctestmad/test3.php
francoisch
Dan, merci pour ta réponse.

Le test, je l'ai fait et il fonctionne; néanmoins, je ne suis pas sûr que ce soit ni nécessaire, ni la solution simple.

Plusieurs raisons à ça:
- fctestmad est mon user de connexion, la racine (mon URL: http://fctestmad.free.fr)
- tous mes fichiers sont, soit dans cette racine, soit dans des répertoires qui en dépendent directement

Ils devraient donc être accessibles de l'un à l'autre, en descendant dans l'arborescence ou en remontant; OpenBaseDir ne devrait pas intervenir.

D'ailleurs, dans mes tests, l'accès a été réussi une fois ou deux (un pb d'hébergeur?).

Par exemple, la structure avec les 3 fichiers test:
- racine: test3
---- martinot: test1
------- reserve: test2

J'ai donc une structure très simple qui ne devrait pas poser de problème.

J'ai d'ailleurs d'autres fonctions qui s'appellent très bien avec la même structure que celle utilisée pour les fichiers test.

Je suis sec mais je cherche.

Merci de ton aide précieuse.

Francois
Dan
C'est à mon avis le ../.. qui coince wink.gif
francoisch
Ce que je ne m'explique pas est pourquoi il coince dans test2.php et pas dans la fonction messaction.php:
- installée dans le même répertoire que test2.php
- appelle le même connexion.php (alias test3.php) avec le même require_once("../../connexion.php");
- et ça marche

OpenBaseDir peut-il godiller parfois?

Je cherche.

Merci de ton aide.

Francois
-------------------------------------------------------
J'en viens à me dire qu'il y a peut-être un smolduc sur mes répertoires, un truc qui s'accroche sans qu'on le voit.

Je me demande si la solution ne serait pas d'effacer tout et de recréer.

Francois
francoisch
Solution trouvée: le fichier inclus "hérite" de la "hiérarchie" de niveau du fichier appelant.

En clair, dans mon cas:
- la fonction initiale est au niveau 2, et inclut le fichier suivant
- la fonction du Require est au niveau 3
- la fonction connexion.php est au niveau 1 (racine)

Le Require doit donc être fait sur un seul niveau (../).

Francois
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.