У меня проблема с секцией php include. Чтобы полностью объяснить проблему, я создал тестовую страницу для вас.
Сначала я хочу показать вам схему файлов. Также вы можете загрузить тестовые файлы с этой LINK, и вы можете протестировать его в Интернете. TEST LINK
Как вы можете видеть, есть вложенная папка в htdocs
(root) и всех php-файлах. Теперь я покажу вам php-код внутри файла, соответственно.
имя_приложения / index.php
<?php include_once 'includes/config.php';?> <div class="callPage">Click Here</div> <div id="testBox"></div> <script type="text/javascript"> $(document).ready(function(){ var siteurl = '<?php echo $url;?>'; $("body").on("click",".callPage", function(){ $.ajax({ url: siteurl+'content/test', beforeSend: function() { //Do something }, complete:function(){ //Do something }, success:function(response){ $("#testBox").html(response); } }); }); function LoadPage(){ $.get(siteurl+'content/test', function(data) { $('#testBox').html(data); }); } LoadPage(); }); </script>
имя_приложения / содержание / test.php
<?php include_once 'includes/config.php'; echo $text.'</br>'; echo $worked.'</br>'; ?>
имя_приложения / включает / config.php
<?php $url = 'http://localhost:8888/'; $text = 'Well Come! How are you today ?'; $worked = 'It is working :)'; ?>
Когда вы открываете TEST LINK , LoadPage();
javascript вызовет test.php
в файле содержимого и отобразит его в #testBox
. Сначала вы не увидите ничего в #testBox
из index.php
. Поскольку config.php
не может быть включен из test.php
.
Я знаю, если я изменю эту строку include_once 'includes/config.php';
от test.php
как this include_once '/appname/includes/config.php';
то проблема будет исправлена.
Но если страницы размножаются и я хочу использовать файлы в корневой папке (htdocs или www), мне нужно удалить имя приложения (имя подпапки) => include_once 'appname/includes/config.php';
из всех файлов. Это будет большая проблема, когда эти файлы будут размножаться.
На самом деле вопрос точно:
Как включить php-файлы без указания полного пути к include, когда путь приложения относительно
DOCUMENT_ROOT
является переменным или неизвестным, аinclude_path
не может быть надежно изменен всеми пользователями приложения?
Иногда это проблема, когда вы не используете абсолютный путь в системе.
объяснение
В зависимости от того, как работает PHP, может повлиять на способ include
& require
work, если PHP запущен из каталога appname, он будет работать нормально, если php сообщит, что он запущен внутри каталога appname с помощью соединителя. однако, если PHP запущен, например, www-data@/usr/bin/# php /var/www/somesite.com/htdocs/appname/index.php
путь может быть нарушен.
исправлять
если вы используете define("FS_ROOT", realpath(dirname(__FILE__)));
как первое, кроме того, что ther является пространством имен внутри index.php, вы можете использовать include FS_ROOT."/includes/config.php";
это означает, что пути к файлу используются из корня системы, поэтому он получает оценку для include "/var/www/somesite.com/htdocs/appname/index.php"
Почему это отличается
Это отличается от ROOT_PATH, поскольку ROOT_PATH иногда задается конфигурацией PHP веб-хостами, и это может быть проблемой. поскольку путь выполнения PHP может быть неправильным, чтобы приложение хоста PHP выглядело не в том месте, где оно включено и требует.
Это также означает, что никакие include
или require
не должны использоваться ../
поскольку вы должны знать путь от своей кодовой базы.
ваше имя приложения / index.php
<?php define("FS_ROOT", realpath(dirname(__FILE__))); include_once FS_ROOT.'includes/config.php';?> <div class="callPage">Click Here</div> <div id="testBox"></div> <script type="text/javascript"> $(document).ready(function(){ var siteurl = '<?php echo $url;?>'; $("body").on("click",".callPage", function(){ $.ajax({ url: siteurl+'content/test', beforeSend: function() { //Do something }, complete:function(){ //Do something }, success:function(response){ $("#testBox").html(response); } }); }); function LoadPage(){ $.get(siteurl+'content/test', function(data) { $('#testBox').html(data); }); } LoadPage(); }); </script>
ваше приложение / content / test.php
<?php # as this file is loaded directly and is not in the root directory # we apend the dirname result with ../ so realpath can resolve the root directory for this site define("FS_ROOT", realpath(dirname(__FILE__)."../")); include_once FS_ROOT.'includes/config.php'; echo $text.'</br>'; echo $worked.'</br>'; ?>
В идеале вы должны пройти через bootstrap и .htaccess, поэтому вам не нужно менять переопределять FS_ROOT
в каждом загруженном файле.
вы можете сделать это, убедившись, что mod_rewrite
включен в apache
создать файл .htaccess
в папке appname
RewriteCond %{REQUEST_URI} \.(php)$ RewriteRule .* bootstap.php [L]
создать bootstrap.php
define("FS_ROOT", realpath(dirname(__FILE__))); include_once FS_ROOT.'includes/config.php'; if(file_exists(FS_ROOT.$_SERVER['REQUEST_URI']){ include(FS_ROOT.$_SERVER['REQUEST_URI']); }else{ // 404 }
это означает, что вы не требуете включения для конфигурации, поскольку он автоматически включен до того, как скрипт для этого запроса будет нужен, это всего лишь базовый план и не является 100% -ным безопасным. Я бы рекомендовал прочитать о том, как использовать MVC и как они работают это даст вам лучшее понимание загрузки файлов по требованию и требующих файлов.
Если путь к файлу документа должен быть динамическим, вам необходимо использовать базу данных. Насколько я понимаю, вы планируете сделать проект более крупным, и поэтому вам нужна нормализованная база данных, чтобы свести к минимуму количество кода, написанного на сервере, и сохранить ваши данные в соответствии.
Тебе нужно:
filePaths
fileNames
akas
<== Это связано с тем, что файлы могут иметь одинаковое имя в разных папках akas
– fileNames
– filePaths
– отношения folders
. Я покажу на примере из MySQLi
.
С помощью этого кода вы создаете таблицы в MySQL console
или phpmyadmin
:
// Create parent tables create table `fileNames` ( `fileName` VARCHAR(70) NOT NULL, `description` VARCHAR(250) NULL, PRIMARY KEY(`fileName`) ) ENGINE=InnoDB; create table `fileAkas` ( `aka` VARCHAR(100) NOT NULL, `description` VARCHAR(250) NULL, PRIMARY KEY(`aka`) ) ENGINE=InnoDB; create table `filePaths` ( `filePath` VARCHAR(250) NOT NULL, `description` VARCHAR(250) NULL, PRIMARY KEY(`filePath`) ) ENGINE=InnoDB; create table `folderNames` ( `folderName` VARCHAR(250) NOT NULL, `description` VARCHAR(250) NULL, PRIMARY KEY(`folderName`) ) ENGINE=InnoDB; // Create mapping table create table `fileNames_x_fileAkas_x_filePaths_x_folderNames` ( `aka` VARCHAR(100) NOT NULL, `fileName` VARCHAR(70) NOT NULL, `filePath` VARCHAR(250) NOT NULL, `folderName` VARCHAR(250) NOT NULL, PRIMARY KEY (`aka`, `fileName`, `filePath`, `folderName`), FOREIGN KEY (`aka`) REFERENCES `fileAkas` (`aka`) ON UPDATE CASCADE, FOREIGN KEY (`fileName`) REFERENCES `fileNames` (`fileName`) ON UPDATE CASCADE, FOREIGN KEY (`filePath`) REFERENCES `filePaths` (`filePath`) ON UPDATE CASCADE, FOREIGN KEY (`folderName`) REFERENCES `folderNames` (`folderName`) ON UPDATE CASCADE ) ENGINE=InnoDB;
Хотя этот фрагмент кода предназначен только для того, чтобы вы не делали таблицы MyISAM
потому что у MyISAM
нет ограничений отношений:
ENGINE=InnoDB
Теперь сделайте программу PHP
чтобы легко добавлять / изменять данные. Используйте это как отдельную программу и загружайте ее на сервер только тогда, когда вам это нужно:
<?php // Database connection $con = mysqli_connect("localhost","my_user","my_password","my_db"); // Function helper function testIfAddedAndInsert($colName, $tableName, $value, $con) { $result = mysqli_query($con, "SELECT ".$colName." FROM ".$tableName." WHERE ".$colName."='".$value."'"); if(mysqli_num_rows($result) == 0) mysqli_query($con, "INSERT INTO ".$tableName." (".$colName.") VALUES ('".$value."')"); } // Call this to add new file function addNewFile($name, $aka, $path, $folderName, $con) { testIfAddedAndInsert('fileName', 'fileNames', $name, $con); testIfAddedAndInsert('fileAka', 'fileAkas', $aka, $con); testIfAddedAndInsert('filePath', 'filePaths', $path, $con); testIfAddedAndInsert('folderName', 'folderNames', $folderName, $con); } // Call this to change a file path function changeFilePath($aka, $path, $con) { testIfAddedAndInsert('filePath', 'filePaths', $path, $con)); mysqli_query($con, "UPDATE `fileNames_x_fileAkas_x_filePaths_x_folderNames` SET `filePath`= '".$path."' WHERE `fileAka`='".$fileAka."' "); } // Call this to change all paths of all files that belong to a certain folder function changeFolderPath($folderName, $path, $con) { testIfAddedAndInsert('folderPath', 'folderPaths', $folderPath, $con)) mysqli_query($con, "INSERT INTO `folderPaths` (`folderPath`) VALUES ('".$folderPath."')"); mysqli_query($con, "UPDATE `fileNames_x_fileAkas_x_filePaths_x_folderNames` SET `filePath`= '".$path."' WHERE `folderName`='".$folderName."' "); } // ... // You can make as many different functions as you want // To populate/change the database example: addNewFile('config.php', 'conf_PHP_IndexPage', './../conf/', 'conf', $con); // or change all the paths of the items in the folder (not counting subfolder items) changeFolderPath('conf', './../../../', $con); // You could use FOR loops with arrays to enter/change big chunks at a time ?>
Затем, заполнив базу данных допустимой информацией, добавьте ее в каждый из ваших main PHP
файлов main PHP
(файлы, которые включают другие):
<?php // Database connection $con = mysqli_connect("localhost","my_user","my_password","my_db"); // Function returns path of file from database function returnPathToFile($fileAka, $con) { $result = mysqli_query($con, "SELECT fileName, filePath FROM fileNames_x_fileAkas_x_filePaths_x_folderNames WHERE fileAka='".$fileAka."'"); if(mysqli_num_rows($result) > 0) { $row = mysqli_fetch_array($result); return $row[1].$row[0]; } return ''; } ?>
А затем просто вызовите функцию, чтобы получить результат:
<?php $include = returnPathToFile('configFileForTheMainPage', $con); include_once($include); ?>
Если какие-либо изменения происходят в пути к файлам, легко изменить их значения, но при этом не нужно даже когда-либо открывать файлы (для этой цели).
Определение ROOT_PATH
в порядке. Вы можете включить путь после определения, например:
include ROOT_PATH;
Test.php находится в папке содержимого. Если вы хотите включить config.php из папки с папками, вам нужно сделать это относительно, поэтому вам нужно идти на один уровень сверху.
include '../include/config.php';
Это происходит потому, что вы запускаете автономный сценарий с помощью ajax, а структура папок относительно test.php.
Вы можете использовать пространства имен с PSR. Таким образом, вы должны знать только верхний каталог. Пространства имен не привязаны к структуре каталога. Используя PSR, вы все файлы загружаются при вызове в базовом пространстве имен и
use Base\Child
они вызываются и загружаются. Если вы хотите что-то повторить, как если бы вы include
или require
просто сохранить его в функции, вызываемой из пространства имен, такого как Base\Child\Function()
.