2009-07-20 2 views
0

Im новое для MVC, и я повторно делаю много своего кода.require_once проблема с templating

У меня есть master.php (индекс), который имеет:

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

Оба master.php и header.php находятся в той же папке, но я получаю следующее сообщение об ошибке:

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

Это не произошло раньше. (Файлы были в корневой папке). Я не понимаю, в чем проблема, так как они находятся в одной папке - мне не нужно возвращаться '../' или ссылаться на любые другие папки. Что мне здесь не хватает?

Спасибо.

+1

От ошибки это не делает похоже, что он пытается потребовать «header.php», похоже, что он пытается требовать «1». Действительно ли линия вы показываете в строке 15? Это может помочь, если вы разместите еще свой код – Cfreak

+0

Да, это точный код в строке 15: asdfasdfasdfasdf

ответ

5

В вашем комментарии вы говорите, что ваш код:

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

пожалуйста, попробуйте Опуская " или die "-> ist не требуется, поскольку require_once вызывает фатальную ошибку, если файл не найден.

Редактировать: Я протестировал его, оставьте «или умереть», и он будет работать.

Edit 2: Объяснение, почему это произошло: Приведенный выше код можно записать так:

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

Поскольку require_once не является функцией, но заявление в PHP, фигурные скобки являются необязательными, PHP трактует вышесказанное как логическое выражение, где строка «header.php» оценивается по логическому «истинному». True получает бросок в строку (в результате получается «1»), и эта строка возвращается обратно, чтобы потребовать один раз.

Таким образом, приведенный выше код получает интерпретируется как

require_once("1") 

Вот как он получает интерпретированы шаг за шагом:

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

надеюсь, что это помогает;)

+0

Без штампа, страница загружается, но верхний и нижний колонтитулы отсутствуют. – asdfasdfasdfasdf

+0

Хм, вы, что у верхнего и нижнего колонтитулов на самом деле есть контент для показа? Например, что-то получает echo'd? на странице отображаются любые php-предупреждения? – smoove

+0

Я посмотрел как на header.php, так и на footer.php, и оба они отлично показывают свое содержание. – asdfasdfasdfasdf

1

PHP начинает искать «header.php» в вашей корневой папке и не может его найти. Если он находится в том же каталоге, что и текущий сценарий, вы должны лучше использовать волшебную константу __DIR__:

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

Так как header.php и master.php находятся в одной директории, а путь include имеет. в этом это не требуется. – MitMaro

+0

Текущий каталог (include_path =.) - это путь, из которого вызывается сценарий, а не каталог, в котором находится скрипт. – soulmerge

+0

Я получаю ту же точную ошибку. – asdfasdfasdfasdf

1

Это может быть потому, что master.php в настоящее время включено или требуется другого файла сценарий, который не находится в той же директории, как header.php. То есть, когда вы посещаете индекс, вы знаете, какой файл вызывается/разбирается?

Посмотрите на documentation для include(), который также относится к 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/

Update

Для решения некоторых из комментариев: Я не говорил, что включают в себя() будет измените CWD. Я говорю, что если CWD не тот, где расположены оба master/header.php, это может быть проблемой.

Например, у вас есть index.php в другой папке, кроме master.php и header.php; он включает или требует master.php, используя правильный путь к нему. Теперь master.php имеет заявление:

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

Однако, на данный момент УХО не содержитheader.php, поскольку УХО является то, что index.php.

Чтобы это исправить, вам нужно вызвать require_once с правильным путем от ВЦЕВ текущего сценария header.php, не путь от master.php.

+0

Вы можете получить/проверить/отобразить текущий рабочий каталог с помощью getcwd(), http://php.net/getcwd. Функция include()/require() не меняет cwd, только что-то вроде chdir(). – VolkerK

+0

Я использовал getcwd(); и он дал мне/Users/MyName/Sites/MySite - Поэтому require_once («Views/header.php»); должен работать, но это не так. Это дает мне ту же ошибку! – asdfasdfasdfasdf

+0

Кроме того, Питер поднял хорошую точку выше о том, что master.php требуется/включен другим скриптом не в том же каталоге. Поэтому я пошел в http: //localhost/~MyName/MySite/Views/master.php, и я получил ту же ошибку! – asdfasdfasdfasdf

0

Вы должны иметь линию 15, как это:

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

Однако с тех пор, когда заголовок.PHP не найден требуется смертельна, то вы должны иметь:

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

или

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