移动的文件子文件夹

时间:2017-12-13 12:26:31

标签: javascript php jquery ajax .htaccess

我的php include部分有问题。为了充分解释这个问题,我为您创建了一个测试页面。

首先,我想向您展示文件的架构。您也可以从 LINK 下载测试文件,然后在线测试 TEST LINK

enter image description here

如您所见,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 :)';
?>

当您打开 TEST LINK 时,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';那么问题就会得到解决。

但是如果页面成倍增加,我想使用root(htdocs或www)文件夹中的文件,我需要删除appname(子文件夹名称)=&gt;来自所有文件的include_once 'appname/includes/config.php';。当这些文件成倍增加时,这将是一个大问题。

实际上问题恰恰是:

  

当应用程序相对于DOCUMENT_ROOT的路径可变或未知且include_path无法被所有人可靠地修改时,如何在不指定包含的完整路径的情况下包含php文件应用程序用户?

4 个答案:

答案 0 :(得分:7)

当您未在系统上使用绝对路径时,这有时会出现问题。

<强>解释

根据PHP的运行方式可能影响include&amp; require的工作方式,如果PHP从appname目录中运行,如果告诉php在appname目录中运行它将正常工作通过连接器它很好。但是,如果PHP运行例如www-data@/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有时由Web主机通过PHP配置设置,这可能是问题所在。由于PHP执行路径可能是错误的,因此请将PHP主机应用程序放在错误的位置以查找包含和请求。

这也意味着includerequire不应该使用../,因为您应该知道代码库中的路径。

您的appname / 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>

您的appname / 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

您可以通过确保在apache

中启用mod_rewrite来执行此操作

在appname文件夹中创建文件.htaccess

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
}

这意味着您不需要配置的include,因为它是在需要该请求的脚本之前自动包含的,这只是一个基本大纲并且不是100%安全我会建议阅读如何使用MVC和它们如何工作将使您更好地了解按需加载文件和需要文件。

答案 1 :(得分:0)

如果文档文件路径需要是动态的,则需要使用数据库。根据我的理解,您计划将项目扩大,因此您需要一个规范化的数据库,以最大限度地减少在服务器上写入的代码量并保持数据的一致性。

你需要:

  • filePaths
  • 的父表
  • fileNames
  • 的父表
  • akas的父表&lt; ==这是因为文件在不同的文件夹中可能有相同的名称
  • 文件夹的父表
  • 用于解决akas - fileNames - filePaths - folders关系的映射表。

我将在MySQLi上展示一个示例。

使用此代码,您可以在MySQL consolephpmyadmin

中创建表格
// 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);
?>

如果文件路径发生任何变化,则很容易更改其值,而不必再次打开文件(为此目的)。

答案 2 :(得分:-1)

ROOT_PATH定义没问题。您可以在定义之后包含路径,如:

include ROOT_PATH;

答案 3 :(得分:-2)

Test.php位于内容文件夹中。 如果你想包含include文件夹中的config.php,你必须要相对地做,所以你需要更高一级。

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

发生这种情况是因为您使用ajax独立运行脚本,并且文件夹结构与test.php相关。