我的php include部分有问题。为了充分解释这个问题,我为您创建了一个测试页面。
首先,我想向您展示文件的架构。您也可以从 LINK 下载测试文件,然后在线测试 TEST LINK
如您所见,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文件应用程序用户?
答案 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主机应用程序放在错误的位置以查找包含和请求。
这也意味着include
或require
不应该使用../
,因为您应该知道代码库中的路径。
您的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 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);
?>
如果文件路径发生任何变化,则很容易更改其值,而不必再次打开文件(为此目的)。
答案 2 :(得分:-1)
ROOT_PATH
定义没问题。您可以在定义之后包含路径,如:
include ROOT_PATH;
答案 3 :(得分:-2)
Test.php位于内容文件夹中。 如果你想包含include文件夹中的config.php,你必须要相对地做,所以你需要更高一级。
include '../include/config.php';
发生这种情况是因为您使用ajax独立运行脚本,并且文件夹结构与test.php相关。