Intereting Posts
Преобразование SVG в PNG / JPEG / BMP и наоборот? Активная запись Codeigniter 2 – Как создать временную таблицу для применения второго порядка сортировки? Обеспечение целостности CSS по импортированным php-страницам Могут ли скрипты PHP продолжать работать, даже если пользователь закрыл браузер? Идентификация имен классов из $ _SERVER Как отобразить или просмотреть загруженное изображение после отправки на PHP без сохранения базы данных? Как перенаправить на динамический URL-адрес в javascript Простое имя учетной записи SPA, сохраненное как «root» вместо заданного имени пользователя Динамическое создание / вставка в ассоциативный массив в PHP Где искать исключения в приложении PHP MVC? Youtube Загрузка видео в php с использованием регулярного выражения Как узнать, сколько строк mysql обновлено как проверить, пришел ли запрос с мобильного или компьютера в php В чем разница между перенаправлением и переходом в рамках Zend google-api-php-client: Неверный клиентский секретный файл JSON

Включенные php-файлы не будут работать после вложенных файлов вложенных файлов

У меня проблема с секцией 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 <== Это связано с тем, что файлы могут иметь одинаковое имя в разных папках
  • родительская таблица для папок
  • таблицу сопоставления для решения akasfileNamesfilePaths – отношения 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() .