У меня есть 3 файла: home, failed_attempt, login.
Файл home и failed_attempt относятся к файлу входа в систему.
Досадно, что они ошибаются, заявив, что файл входа не существует. home будет генерировать исключение, если я это сделаю, но failed_attempt не будет.
include_once("../StoredProcedure/connect.php");
include_once ( "../ без названия / sanitize_string.php");
и если я это сделаю:
include_once("StoredProcedure/connect.php"); include_once("untitled/sanitize_string.php");
происходит противоположное, fail_attempt выдает исключение, но дома, привычно. Как это исправить..
Я говорю, чтобы включить, чтобы перейти на страницу, поставив это ../, и поэтому home.php не нужно идти на одну страницу, поэтому она выдает это исключение ..
Как я могу это сделать, так что оба файла принимают эти вложения как действительные .. возможно, не относительно того, где они размещены .. т.е. без этого ../
Структура каталога:
PoliticalForum ->home.php ->StoredProcedure/connect.php ->untitled/sanitize_string.php ->And other irrelevant files
Вот три возможных решения. Во-вторых, это действительно просто обходные пути, которые используют абсолютные пути умным способом.
1: chdir в правильный каталог
<?php // check if the 'StoredProcedure' folder exists in the current directory // while it doesn't exist in the current directory, move current // directory up one level. // // This while loop will keep moving up the directory tree until the // current directory contains the 'StoredProcedure' folder. // while (! file_exists('StoredProcedure') ) chdir('..'); include_once "StoredProcedure/connect.php"; // ... ?>
Обратите внимание, что это будет работать, только если ваша папка StoredProcedure находится в самой верхней директории любых файлов, которые могут содержать файлы, которые она содержит.
2: Используйте абсолютные пути
Теперь, прежде чем вы скажете, что это не переносимо, на самом деле это зависит от того, как вы его реализуете. Вот пример, который работает с Apache:
<?php include_once $_SERVER['DOCUMENT_ROOT'] . "/StoredProcedure/connect.php"; // ... ?>
В качестве альтернативы, снова с apache, добавьте следующее в свой .htaccess в корневой каталог:
php_value auto_prepend_file /path/to/example.php
Тогда в example.php:
<?php define('MY_DOC_ROOT', '/path/to/docroot'); ?>
И, наконец, в ваших файлах:
<?php include_once MY_DOC_ROOT . "/StoredProcedure/connect.php"; // ... ?>
3: Установить PHP include_path
См. Руководство для директивы include_path . Если у вас нет доступа к php.ini, это можно установить в .htaccess, если вы используете Apache, а PHP не установлен как CGI, например:
php_value include_path '/path/to/my/includes/folder:/path/to/another/includes/folder'
Такие вещи, как realpath()
и __DIR__
являются вашими друзьями, когда дело доходит до создания путей в PHP.
Realpath http://php.net/manual/en/function.realpath.php
Магические константы http://php.net/manual/en/language.constants.predefined.php
Поскольку include и require – это языковые конструкции (а не функции), они не нуждаются в скобках. Вообще говоря, вы должны include
чтобы включить «шаблоны» (выходные файлы) и require
включения файлов PHP, таких как классы.
Таким образом, вы можете использовать что-то вроде:
$sPath = realpath( __DIR__ . '../relative/path/here'); if($sPath) { require_once $sPath; }
(используйте dirname(__FILE__)
вместо dirname(__FILE__)
на PHP <5)
Стоит оценить путь, прежде чем пытаться потребовать файл, поскольку realpath()
возвращает false, если файл не существует и пытается require false;
выдает ошибку PHP.
В качестве альтернативы вы можете просто использовать абсолютные пути, такие как:
require /home/www/mysite.com/htdocs/inc/somefile.php
Для новичков это поможет понять. Используйте только следующее, основанное на вашем относительном пути:
//include file directly from parent directory: include_once(dirname(__FILE__) . '/../connect.php');
ИЛИ
//include file from parent's child directory: include_once(dirname(__FILE__) . '/../StoredProcedure/connect.php');
ИЛИ
//include file from own child directory: include_once('StoredProcedure/connect.php');
ИЛИ
//include sibling files from same directory: include_once('connect.php');
Сделайте что-то вроде require(dirname(__FILE__) . '[RELATIVE PATH HERE]');
Другие ребята правильно ответили на ваш вопрос, однако я думал, что внес что-то еще: автозагрузчики.
Автозагрузчики позволяют определить функцию, которая будет автоматически включать определенные файлы при попытке использовать класс.
Документация здесь и может объяснить это лучше, чем я могу: http://php.net/manual/en/language.oop5.autoload.php
Поистине рекомендую использовать их, сэкономит вам время и станет лучшей практикой.