2009-07-20 9 views
0

Ich bin neu in MVC und ich mache eine Menge von meinem Code.require_once Problem mit Templating

Ich habe master.php (Index), die hat:

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

Beide master.php und header.php sind im selben Ordner noch bekomme ich folgende Fehlermeldung:

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

Dieses vor nicht geschehen. (Dateien befanden sich alle im Stammordner). Ich sehe nicht, was das Problem ist, da sie im selben Ordner sind - ich muss nicht '../' zurückgehen oder andere Ordner referenzieren. Was fehlt mir hier?

Danke.

+1

Aus dem Fehler nicht wahr Sieht so aus als ob es versucht "header.php" zu verlangen, es sieht so aus als würde es versuchen "1" zu verlangen. Ist die Zeile, die du zeigst, wirklich in Zeile 15? Es könnte helfen, wenn Sie mehr von Ihrem Code posten – Cfreak

+0

Ja, es ist der genaue Code in Zeile 15: asdfasdfasdfasdf

Antwort

5

In Ihrem Kommentar sagen Sie Ihren Code ist:

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

bitte versuchen Sie es das Weglassen " oder sterben "-> ist nicht notwendig, da require_once einen fatalen Fehler auslöst, wenn die Datei nicht gefunden wird.

Edit: Ich testete es, lassen Sie die "oder sterben" und es wird funktionieren.

Edit 2: Erklärung, warum dies geschehen: Der obige Code auch wie folgt geschrieben werden kann:

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

Da require_once keine Funktion, sondern eine Aussage in php, sind die Klammern optional, PHP interpretiert das obige als boolescher Ausdruck, wobei der String "header.php" auf den booleschen Wert "true" ausgewertet wird. True wird in eine Zeichenkette umgewandelt (was zu "1" führt), und diese Zeichenkette wird zurückgegeben, um sie einmal zu benötigen.

So ist der obige Code wird als

interpretiert
require_once("1") 

Hier ist, wie es wird Schritt für Schritt interpretiert:

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

hoffe, das hilft;)

+0

Ohne die sterben, die Seite lädt aber die Kopf- und Fußzeile sind nicht vorhanden. – asdfasdfasdfasdf

+0

Hmm, sind Sie, dass die Kopf- und Fußzeile tatsächlich Inhalt zu zeigen haben? zB etwas wird Echo'd? die seite zeige irgendwelche php-warnungen? – smoove

+0

Ich habe sowohl header.php als auch footer.php direkt angeschaut und beide zeigen ihren Inhalt gut. – asdfasdfasdfasdf

1

PHP beginnt in Ihrem Stammordner nach 'header.php' zu suchen und kann es nicht finden. Wenn es im selben Verzeichnis wie das aktuelle Skript ist, sollten Sie eher die magische Konstante verwenden __DIR__:

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

Seit header.php und master.php sind beide im selben Verzeichnis und der Include-Pfad hat '.' In diesem Fall sollte dies nicht erforderlich sein. – MitMaro

+0

Das aktuelle Verzeichnis (include_path =.) Ist der Pfad, von dem das Skript aufgerufen wird, nicht das Verzeichnis, in dem sich das Skript befindet. – soulmerge

+0

Ich bekomme den gleichen genauen Fehler. – asdfasdfasdfasdf

1

Es kann sein, weil master.php durch eine andere Skriptdatei, die nicht im selben Verzeichnis enthält oder erforderlich ist, ist als header.php. Das heißt, wissen Sie beim Besuch des Indexes, welche Datei aufgerufen/geparst wird?

einen Blick auf die für include()documentation nehmen, die require() gilt auch für:

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/

aktualisieren

einige der Kommentare zu adressieren: Ich habe nicht gesagt, dass include() würde ändere die CWD. Ich sage, dass, wenn das CWD nicht das ist, wo sich beide Master/Header.php befinden, das das Problem sein könnte.

Zum Beispiel sagen Sie haben index.php in einem anderen Ordner als master.php und header.php; es enthält oder erfordert master.php den richtigen Pfad dazu verwenden. Nun hat master.php die Aussage:

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

jedoch an dieser Stelle die CWD enthält keineheader.php, da die CWD, dass der index.php ist.

Um dies zu beheben, müssen Sie require_once mit dem richtigen Pfad von der CWD des aktuellen Skripts zu header.php, nicht dem Weg von master.php nennen.

+0

Sie können das aktuelle Arbeitsverzeichnis mit getcwd(), http://php.net/getcwd abrufen/prüfen/anzeigen lassen. Ein include()/require() ändert _not_ nicht das cwd, nur etwas wie chdir(). – VolkerK

+0

Ich benutzte getcwd(); und es gab mir/Users/MyName/Sites/MySite - Deshalb require_once ("Views/header.php"); sollte funktionieren, tut es aber nicht. Es gibt mir den gleichen Fehler! – asdfasdfasdfasdf

+0

Auch Peter brachte einen guten Punkt darüber, dass master.php von einem anderen Skript, das sich nicht im selben Verzeichnis befindet, benötigt wird. Also ging ich zu http: //localhost/~MyName/MySite/Views/master.php und ich bekomme genau den gleichen Fehler! – asdfasdfasdfasdf

0

Sie benötigen Linie haben 15 wie folgt aus:

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

jedoch seit wann Header.PHP wird nicht gefunden die erfordern fatal ist, dann sollten Sie haben:

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

oder

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