包含的php文件在移动文件子文件夹后无法正常工作

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

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

在此处输入图像描述

如您所见, htdocs (root)文件中有一个子文件夹,其中包含所有php文件。 现在我将分别向您展示文件中的php代码。

APPNAME / index.php文件

  
Click Here
$(document).ready(function(){ var siteurl = ''; $("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(); });

应用程序名称/内容/ test.php的

 <?php include_once 'includes/config.php'; echo $text.'
'; echo $worked.'
'; ?>

应用程序名称/包括/ config.php中

  

当你打开TEST LINKLoadPage(); javascript函数将在内容文件中调用test.php并将其显示在#testBox 。 首先,你不会在index.php #testBox看到任何内容。 因为test.php不能包含config.php

我知道如果我改变这行include_once 'includes/config.php'; 来自test.phpinclude_once '/appname/includes/config.php'; 然后问题将得到解决。

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

实际上问题恰恰是:

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

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

说明

根据PHP的运行方式可能会影响includerequire工作的方式,如果PHP从appname目录中运行,如果通过连接器告诉php在appname目录中运行,它将正常工作。 但是,如果运行PHP,例如www-data@/usr/bin/# php /var/www/somesite.com/htdocs/appname/index.php则路径可能会被破坏。

固定

如果你使用define("FS_ROOT", realpath(dirname(__FILE__))); 作为第一件事,除了if是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

  
Click Here

你的appname / content / test.php

  

理想情况下,您应该通过引导程序和.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以及它们如何工作它将使您更好地了解按需加载文件和需要文件。

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

你需要:

  • filePaths的父表
  • fileNames的父表
  • akas的父表<==这是因为文件在不同的文件夹中可能具有相同的名称
  • 文件夹的父表
  • 一个映射表来解决akasfileNamesfilePathsfolders关系。

我将在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程序来轻松添加/更改数据。 将此作为单独的程序使用,并仅在需要时将其上载到服务器:

  

然后,在使用有效信息填充数据库之后,将其添加到每个main PHP文件(包含其他文件的文件)中:

  0) { $row = mysqli_fetch_array($result); return $row[1].$row[0]; } return ''; } ?> 

然后只需调用函数即可得到结果:

  

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

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

 include ROOT_PATH; 

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

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

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