2009-08-16 9 views
2

étrange problème avec php sur windows ... mon application charge un fichier 'core' qui charge un fichier de paramètres, enregistre les autoloads, fait l'initialisation etc en haut du fichier core j'ai include_once ("config.php "); Cela fonctionne bien pour n'importe quoi dans le répertoire courant, si j'inclue le fichier de noyau d'un répertoire séparé bien qu'il ignore silencieusement l'inclusion du fichier de configuration ... quelqu'un a-t-il déjà vu cela?require_once ignoré

/webroot/core.php

<?php 
    require_once "config.php"; 
    //register autoloads 
    //do some initialization... standard stuff 
?> 

/webroot/config.php

<?php 
    define("WEB_ROOT","/webroot"); 
    define("DB_USER","root"); 
    // ... more stuff... 
?> 

/webroot/admin/index.php

<?php 
    require_once("../dbconnect.php"); 
    echo WEB_ROOT; 
    // print string literal WEB_ROOT rather than value in config.php 
?> 

je crois comprendre que le fichier Les opérations sont relatives au répertoire du fichier qui fait la demande, le require_once ("config.php") ne doit pas sélectionner le fichier re Latif à core.php? Ce code fonctionne comme je le ferais sur un mac ou Linux mais pas du tout sous Windows, (si je change le require pour utiliser le chemin complet ou .., ça marche)

La vraie folie est que le require_once ("config.php") ne lance aucune erreur mais aucun code interne n'est exécuté!

+0

Quelqu'un at-il remarqué que le chargement index.php est dbconnect.php au lieu de config.php ou core.php? Vous devez aussi montrer le contenu de dbconnect.php ... –

Répondre

7

Si PHP ignorer silencieusement des erreurs, essayez de mettre en tête de fichier qui est demandé:

ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

Maintenant toutes les erreurs doivent être visibles.

Ensuite, la meilleure pratique (selon moi) est de dans le fichier qui est demandé (pas dans l'un des fichiers inclus) définir une constante avec le chemin complet du système de fichiers pour la racine de l'application. Donc, en index.php si racine de l'application est /webroot/admin:

define('APP_DIR', dirname(__FILE__)); 

Après que lorsque vous incluez quelque chose, utilisez cette constante. Si la structure du répertoire est:

/webroot/ 
    admin/ 
     index.php 
    config.php 
    core.php 

Et vous voulez inclure config.php dans index.php:

require_once APP_DIR . '/../config.php'; 

En core.php à inclure config.php serait:

require_once APP_DIR . '/../config.php'; 

Et ainsi de suite. L'utilisation de chemins de système de fichiers absolus permet d'éviter toute ambiguïté.

+0

en utilisant dirname (__ FILE__) est un excellent moyen de définir un chemin absolu! Malheureusement, l'application sur laquelle je travaille met cela à la main dans le fichier de configuration et l'utilise ensuite comme 'APP_DIR'. Je ne sais vraiment pas pourquoi! – Michael

1

Peut-être que vous utilisez la restriction open_basedir de PHP? Pour tenter d'empêcher certains scripts malveillants, PHP a un «mode sans échec» qui, entre autres choses, limite les endroits où les fichiers peuvent être chargés. Si xampp l'avait activé par défaut, vous pourriez l'avoir rencontré. Vous pouvez également consulter les journaux d'erreurs de votre serveur Web pour voir s'il y a des indications d'échec (et activer le signalement des erreurs, de préférence jusqu'à E_ALL, jusqu'à ce que le problème soit résolu).

+0

J'ai vérifié ini pour voir si safemode était activé, ce n'est pas le cas mais c'est une super suggestion! rapports d'erreur a été mis à simplement ignorer avis, mais avec un E_ALL de vanille Je viens obtenir ceci: Avis: L'utilisation de FILE_ROOT constante indéfinie - supposée « FILE_ROOT » dans C: \ webroot \ core.php en ligne 87 Pas même un avis est émis sur le fichier de configuration déchargé! – Michael

2

Si vous souhaitez inclure un fichier en utilisant un chemin relatif au fichier faisant l'inclusion, vous aurez à préfixer le chemin complet, comme celui-ci:

<?php 
require_once(dirname(__FILE__) . "/config.php"); 
?> 
+1

pas sur nixes ... c'est si étrange que PHP ignore silencieusement le besoin dans ce cas! – Michael

+0

Cette ligne est en fait à partir d'un script que j'ai développé spécifiquement sur Linux. Le peu d'ignorance silencieuse est en effet étrange et je ne peux pas vous aider avec cela que j'ai peur. Je viens de poster ce que j'ai adapté en tant que meilleure pratique il y a des années. – Thorarin

Questions connexes