Это происходит потому, что вы запускаете сценарий автономно с ajax, а структура папок относительно test.php.

я проблема с разделом php include. Чтобы полностью объяснить проблему, я создал для вас тестовую страницу.

Сначала я хочу показать вам схему файлов. Также вы можете скачать тестовые файлы с этогоССЫЛКА и вы можете проверить это онлайнТЕСТ ЛИНК

Как видите, в папке есть подпапкаhtdocs (корневой) файл и все файлы 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 :)';
?>

Когда вы открываетеТЕСТ ЛИНК, LoadPage(); функция JavaScript будет вызыватьtest.php в файле содержимого и отобразить его в#testBox, Сначала вы ничего не увидите в#testBox изindex.php , Потому чтоconfig.php не может быть включен изtest.php .

Я знаю, если я изменю эту строкуinclude_once 'includes/config.php'; изtest.php нравитсяinclude_once '/appname/includes/config.php'; тогда проблема будет решена.

Но если страницы размножаются, и я хочу использовать файлы в корневой папке (htdocs или www), мне нужно удалить имя приложения (имя подпапки) =>include_once 'appname/includes/config.php'; из всех файлов. Это будет большой проблемой, когда эти файлы размножатся.

На самом деле вопрос точно:

Как мы можем включить файлы php без указания полного пути к включению, когда путь приложения относительноDOCUMENT_ROOT является переменной или неизвестной иinclude_path не может быть надежно изменен всеми пользователями приложения?

 Hkachhia13 дек. 2017 г., 13:34
Используйте метод загрузки Ajax вместо php include.jquery-tutorial.net/ajax/the-load-method
 Azzo13 дек. 2017 г., 13:33
@madalinivascu Я хочу включитьinc.php файл вtest.php после аяксаLoadPage();
 Azzo13 дек. 2017 г., 13:31
@panther Нормально, включая файл inc.php, но после LoadPage (); не включают в себя
 panther13 дек. 2017 г., 13:29
define ('ROOT_PATH', dirname (DIR) '/Inc/inc.php'); на самом деле не содержит никаких файлов. Остальная часть вопроса неясна.
 madalinivascu13 дек. 2017 г., 13:32
@DevStud, что именно вы хотите сделать с этим определением?

Ответы на вопрос(4)

вам необходимо использовать базу данных. Из того, что я понимаю, вы планируете сделать проект больше, и поэтому вам нужна нормализованная база данных, чтобы минимизировать объем кода, написанного на сервере, и поддерживать согласованность ваших данных.

Тебе нужно:

родительская таблица для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 файлы (файлы, включая другие):

<?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);
?>

Если в путях к файлам происходят какие-либо изменения, их значения легко изменить, при этом не нужно даже когда-либо открывать файлы (для этой цели).

 Yuri20 дек. 2017 г., 16:13
Все еще имеет ту же проблему, я полагаю .. Согласно вашему коду, если ему нужно изменить какую-либо информацию о соединении mysql, он должен будет отредактировать все свои файлы ..
 Ivan8620 дек. 2017 г., 13:04
Я буду редактировать, чтобы включить ту часть информации, которую я забыл включить с самого начала. Благодарю.
 Ivan8620 дек. 2017 г., 12:27
Спасибо за downvote, он может добавить соединение (одна строка кода) к каждому файлу php.
 Yuri20 дек. 2017 г., 10:44
Даунвот: А где бы ты взял свой$con переменная? Есть еще та же проблема
 Ivan8620 дек. 2017 г., 20:08
Ну, да, это правда, но поскольку путь к серверам MySQL на самом деле просто (например)localhost и нет никаких вовлеченных каталогов, я предполагаю, что изменение серверов mysql или информации mysql, такой как имя пользователя и т. д., было бы единственным недостатком этого метода. Я просто не вижу лучшего способа сделать это, так как он сказал, что хочет, чтобы его пути были переменными. Я сразу же спрашиваю себя, что если он сделает это, что если он сделает это. Вот откуда берется необходимая гибкость.

.php из папки include, вы должны сделать это относительно, поэтому вам нужно подняться на один уровень выше.

include '../include/config.php';

Это происходит потому, что вы запускаете сценарий автономно с ajax, а структура папок относительно test.php.

когда вы не используете абсолютный путь в системе.

объяснение

В зависимости от того, как работает PHP, может повлиять на способinclude&require работать, если PHP работает из каталога appname, он будет работать нормально, если php сообщат, что он работает внутри каталога appname через соединитель, это нормально. однако, если PHP запускается, например,[email protected]/usr/bin/# php /var/www/somesite.com/htdocs/appname/index.php путь может быть сломан.

исправлять

если вы используетеdefine("FS_ROOT", realpath(dirname(__FILE__))); во-первых, кроме случаев, когда есть пространство имен внутри 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>';
?>

В идеале, вы должны пройти через загрузчик и .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 и как они работают это даст вам лучшее понимание загрузки файлов по требованию и требующих файлов.

 Azzo23 дек. 2017 г., 10:10
Я получил пустую страницу, после проверки вашего ответа. Я сделал все то же самое.
 Martin Barker28 дек. 2017 г., 13:17
Пустая страница означает, что есть ошибка PHP и ваши ошибки отображения отключены.error_reporting(E_ALL) & ini_set("display_errors", true) на вершинеbootstrap.php или ваш 404 сработал и ничего не сделал, чтобы проверить правильность путей, немного отладив.
 Martin Barker12 янв. 2018 г., 11:43
@ Azzo, ты когда-нибудь работал? Я просто заметил, что твой параметр ajax URL неверенurl: siteurl+'content/test', должно бытьurl: siteurl+'content/test.php', Ajax требует полный путь к файлу, если вы не используете.htaccess Мод переписать правило для изменения пути к файлу php.
 Azzo20 дек. 2017 г., 08:31
Очень хорошо, но я не понимаю, как использовать ваше выражение. Не могли бы вы привести пример через мои коды?
 Martin Barker21 дек. 2017 г., 12:34
Добавлен пример для вашего кода и демонстрация того, как его можно настроить, чтобы он не требовалFS_ROOT определены в разных файлах и поэтому ваш авто, включая конфигурацию, так как большинству файлов потребуется доступ к нему. @Azzo

ROOT_PATH определение в порядке. Вы можете включить путь после определения, например:

 Azzo13 дек. 2017 г., 14:04
Не могли бы вы ответить мне немного яснее, пожалуйста? Благодарю.
 Phil13 дек. 2017 г., 14:18
Вы держалиdefine('ROOT_PATH', dirname(__DIR__) . '/inc/inc.php'); вышеinclude ROOT_PATH; ?
 Azzo13 дек. 2017 г., 14:12
проблема в том, что я пытаюсь включить это. но я не могу.
 Azzo13 дек. 2017 г., 14:08
Я проверил ваш код и получил уведомление, но эхо работает.Notice: Use of undefined constant ROOT_PATH - assumed 'ROOT_PATH' in /home/****/public_html/subfolder/theme/themes/files/contents/test.php on line 1
 Phil13 дек. 2017 г., 14:09
Как указала Пантера, определение не включает ни одного файла, хотя путь правильный. Так что все, что вам нужно сделать, это включить его.

Ваш ответ на вопрос