2009-07-13 7 views
0

Je souhaite séparer mes dossiers source en deux: les dossiers contenant le code que vous tapez dans la barre d'adresse et ceux qui constituent des parties de la page (tuiles) et d'autres codes (classes, etc). Ainsi, au début de chaque fichier php j'ai ajouté:Paramètre de session et de chemin d'accès php

<?php 
// index.php 
include("config.php"); 
include("session.php"); 
?> 

Config contient tout ce jusqu'à présent, mais me permet de développer si je besoin d'autres répertoires (journaux, etc.)

<?php 
// config.php 
$_PATHS["base"]  = dirname(dirname(__FILE__)) . "\\"; 
$_PATHS["includes"] = $_PATHS["base"] . "includes\\"; 
ini_set("include_path", "$_PATHS[includes]"); 
?> 

et session a entre autres choses, dans le constructeur, un appel à session_start. Il nécessite également d'autres classes qui sont incluses ailleurs - ce qui nécessite que la config soit listée avant l'inclusion de la session. Cependant, je reçois l'erreur

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started ... 

Si je passe includes autour de cette erreur particulière disparaît mais je dois commencer munging manuellement les liens vers les fichiers d'en-tête. Y at-il d'une manière ou d'une autre de définir les répertoires en premier et de pouvoir utiliser des sessions ou doit être la première chose qu'un fichier contient?

+0

BTW, pourquoi le double appel à dirname()? –

+0

J'ai vu plusieurs sites web (je peux en trouver deux maintenant), donc j'ai décidé que cela devait être "bonne pratique" et copié sans trop savoir pourquoi. J'apprends php4 (et avant que quelqu'un ne dise que php4 est mort, eh bien, pas sur mon serveur web ce n'est pas le cas!). –

Répondre

1

Je ne sais pas si vous avez déjà essayé, mais comme un moyen de test supprimer l'include config.php et collez le code de configuration là-dedans à la place.

donc ceci:

<?php 
// index.php 
include("config.php"); 
include("session.php"); 
?> 

devient ceci:

<?php 
// config 
$_PATHS["base"]  = dirname(dirname(__FILE__)) . "\\"; 
$_PATHS["includes"] = $_PATHS["base"] . "includes\\"; 
ini_set("include_path", "$_PATHS[includes]"); 
//index 
include("session.php"); 
?> 

Si cela fonctionne alors vous avez un problème avec votre fichier config.php * [voir ci-dessous], si elle ne le fait pas, l'erreur pointe-t-elle toujours vers la ligne ini_set? [En supposant de votre commentaire ci-dessus c'est là où l'erreur actuelle pointe]

* Je me souviens d'avoir lu une fois [il y a quelque temps j'admets] qu'un fichier en UTF-8 pourrait faire des bêtises. Essayer de trouver un lien

Ok J'ai trouvé quelqu'un qui a soumis un rapport de bogue concernant UTF-8 et session_start. Apparemment, ce n'est pas un bug - je n'ai pas cherché pourquoi - mais de toute façon ce n'est pas tout à fait le même problème. Un type d'encodage UTF-8 provoque des erreurs de session, mais pas l'erreur de cookie que vous obtenez. See here if you are interested - UTF-8 Error

+0

J'espère que ce n'est pas lié à l'UTF - la raison d'être de ce projet est d'internationaliser et d'améliorer ce qui s'est passé auparavant. –

+0

Cela fonctionne. Cependant, cela n'aide pas vraiment à séparer les composants.Cela dit, la config et la session seront utilisées sur chaque page immédiatement, donc c'est un compromis avec lequel je peux vivre. Comment puis-je vérifier le type de page dans Eclipse? –

+0

Trouvé que. Tout défini sur Cp1252. Il semble également qu'un fichier php vide (ou plutôt un fichier dont le code a été commenté) provoquera l'erreur avec session_start. –

3

Le reste de cette erreur est le bit exact qui vous dira où le problème est! Les chances sont que vous avez des espaces à la fin de config.php.

(Soit ça, ou session.php envoie une sortie avant votre appel à session_start(), mais je suis vraiment juste deviner maintenant :)

+0

Le reste de cette erreur est juste le chemin d'erreur - et je sais ce que c'est - le fichier de configuration. Je ne pensais pas que ini_set provoquerait la sortie du fichier - je pensais qu'il se produirait plus tard avec peut-être la balise doctype ou html. –