2009-07-20 7 views
0

Je suis nouveau sur MVC et je refais beaucoup de mon code.require_once problème avec le template

J'ai master.php (index) qui a:

<?php require_once("header.php"); ?> 

Les deux master.php et header.php sont dans le même dossier mais j'obtiens l'erreur suivante:

Warning: require_once(1) [function.require-once]: failed to open stream: No such file or directory in /Users/MyName/Sites/MySite/Views/master.php on line 15

Fatal error: require_once() [function.require]: Failed opening required '1' (include_path='.:') in /Users/MyName/Sites/MySite/Views/master.php on line 15

Cela n'a pas eu lieu avant. (Les fichiers étaient tous dans le dossier racine). Je ne vois pas quel est le problème, car ils sont dans le même dossier - je n'ai pas besoin de retourner '../' ou de référencer d'autres dossiers. Qu'est-ce que j'oublie ici?

Merci.

+1

De l'erreur, il ne ressemble à son essayer d'exiger "header.php" il ressemble à son essayer d'exiger "1". Est-ce que la ligne que vous montrez vraiment à la ligne 15? Il peut être utile de poster un peu plus de code – Cfreak

+0

Oui, c'est le code exact à la ligne 15: asdfasdfasdfasdf

Répondre

5

Dans votre commentaire, vous dites que votre code est:

<?php require_once("header.php") or die; ?> 

s'il vous plaît essayer de laisser le " ou die "-> ist n'est pas nécessaire, car require_once déclenchera une erreur fatale si le fichier n'est pas trouvé.

Editer: Je l'ai testé, laissez le "ou mourir" et cela fonctionnera.

Edit 2: Explication pourquoi cela est arrivé: Le code ci-dessus peut également être écrit comme ceci:

require_once (("header.php") or die()); 

Parce que require_once est pas une fonction, mais une déclaration en php, les accolades sont en option, php interprète ci-dessus en tant qu'expression booléenne, où la chaîne "header.php" est évaluée par le booléen "true". True est converti en une chaîne (résultant en "1"), et cette chaîne est renvoyée à une seule fois.

Ainsi, le code ci-dessus est interprété comme

require_once("1") 

Voici comment il est interprété étape par étape:

(("header.php") or die()) = (TRUE or die()) 
(TRUE or die()) = TRUE 
(string) TRUE = '1'; 

espérons que cette aide;)

+0

Sans le dé, la page se charge mais l'en-tête et le pied de page ne sont pas présents – asdfasdfasdfasdf

+0

Hmm, êtes-vous que l'en-tête et le pied de page ont réellement du contenu à afficher, par exemple quelque chose devient écho? la page montre des avertissements PHP? – smoove

+0

J'ai regardé à la fois header.php et footer.php directement et ils montrent tous les deux leur contenu. – asdfasdfasdfasdf

1

PHP commence à rechercher 'header.php' dans votre dossier racine et ne le trouve pas. Si elle est dans le même répertoire que le script actuel, vous devez plutôt utiliser la constante magique __DIR__:

<?php require_once __DIR__ . '/header.php'; ?> 
+0

Puisque header.php et master.php sont tous deux dans le même répertoire et que le chemin d'inclusion a '.' dans ce cas, cela ne devrait pas être nécessaire. – MitMaro

+0

Le répertoire en cours (include_path =.) Est le chemin à partir duquel le script est appelé, pas le répertoire, le script réside. – soulmerge

+0

Je reçois la même erreur exacte. – asdfasdfasdfasdf

1

Il peut être parce que master.php est en cours inclus ou requis par un autre fichier de script qui ne sont pas dans le même répertoire en tant que header.php. Autrement dit, lorsque vous consultez l'index, savez-vous quel fichier est appelé/analysé?

Jetez un oeil à la documentation pour include(), qui vaut également pour require():

Files for including are first looked for in each include_path entry relative to the current working directory, and then in the directory of current script. E.g. if your include_path is libraries, current working directory is /www/, you included include/a.php and there is include "b.php" in that file, b.php is first looked in /www/libraries/ and then in /www/include/

Mise à jour

Pour répondre à quelques-uns des commentaires: Je n'ai pas dit include() serait changer le CWD. Je dis que si le CWD n'est pas celui où les deux master/header.php sont situés, cela pourrait être le problème. Par exemple, disons index.php dans un dossier différent de master.php et header.php; il comprend ou nécessite master.php en utilisant le bon chemin d'accès. Maintenant, master.php a la déclaration:

<?php require_once("header.php"); ?> 

Cependant, à ce stade, le CWD ne contient pasheader.php, puisque l'encéphalopathie des cervidés est celle de index.php.

Pour résoudre ce problème, vous devez appeler require_once avec le bon chemin de la CWD du script en cours à header.php, PAS le chemin de master.php.

+0

Vous pouvez obtenir/vérifier/afficher le répertoire de travail actuel avec getcwd(), http://php.net/getcwd. Un include()/require() ne change pas le cwd, seulement quelque chose comme chdir() le fait. – VolkerK

+0

J'ai utilisé getcwd(); et il m'a donné/Users/MyName/Sites/MySite - Par conséquent require_once ("Views/header.php"); devrait fonctionner, mais ce n'est pas le cas. Cela me donne la même erreur! – asdfasdfasdfasdf

+0

En outre, Peter a soulevé un bon point au-dessus de master.php étant requis/inclus par un autre script pas dans le même répertoire. Donc je suis allé à http: //localhost/~MyName/MySite/Views/master.php et j'obtiens exactement la même erreur! – asdfasdfasdfasdf

0

Vous devez avoir la ligne 15 comme ceci:

<?php (require_once("header.php")) or die(); ?> 

Cependant, depuis lors tête.php ne se trouve pas le besoin est fatale alors vous devriez avoir:

<?php (include_once("header.php")) or die(); ?> 

ou

<?php require_once("header.php"); ?>