包含PHP,当包含的PHP代码用于不同目录中的文件时不起作用
我正在写一个相当大的网站,所以我决定使用include函数来简化横幅、菜单、页脚等的更改 只要文件在同一个文件目录中,一切正常。从我在“stackoverflow”上找到的另一篇文章中,我找到了如何使包含文件的路径正常工作 我遇到的问题是,即使实际的网页可以找到包含的文件,它仍然无法工作,因为它似乎无法找到实际链接的正确目录 我将尝试使用一个示例代码来说明我的意思。。。 假设它是我的文件目录包含PHP,当包含的PHP代码用于不同目录中的文件时不起作用,php,Php,我正在写一个相当大的网站,所以我决定使用include函数来简化横幅、菜单、页脚等的更改 只要文件在同一个文件目录中,一切正常。从我在“stackoverflow”上找到的另一篇文章中,我找到了如何使包含文件的路径正常工作 我遇到的问题是,即使实际的网页可以找到包含的文件,它仍然无法工作,因为它似乎无法找到实际链接的正确目录 我将尝试使用一个示例代码来说明我的意思。。。 假设它是我的文件目录 某网站 [CSS][articles][inc]page.php page2.php page3.php
当我使用
<?php include ("inc/menu.php"); ?>
(或任何适当指示的文件)
所有内容都按照我希望的方式显示,但问题是,当我按index.php或从其他目录指向网页的任何其他链接时,它都不起作用。在php中,包含的文件将显示为它们所包含的文件的一部分。因此,如果您在page2.php中有图像和链接,并将page2包含在page1.php中,那么您的所有图像和链接都将显示为与page1.php相关。所以page2.php在一个子文件夹中,而page2的图像在同一个子文件夹中,当您将其包含到page1.php中时,您的图像源将是错误的
解决这个问题的一种方法是让所有图像源和站点链接都与根相关,而不是与php文件相关。因此,从根文件夹“/”开始设计源代码和链接,如果站点位于域的顶部,则从“/”开始;如果站点位于子文件夹中,则从“/sometopfolder”开始,然后从那里开始设计。您的问题在格式方面有一些错误和问题,因此我可能是选错了。但是您需要包含包含文件的路径,否则php将不知道在哪里查找 例如,如果inc文件夹中有page2.php,并且您希望在page3.php中包含page2.php,那么您可以使用如下内容:
include('inc/page2.php');
include('../page3.php');
include('/home/user/vhosts/yoursite/public_html/inc/page2.php');
如果您想在page2.php中包含page3.php,它应该是这样的:
include('inc/page2.php');
include('../page3.php');
include('/home/user/vhosts/yoursite/public_html/inc/page2.php');
您还可以使用include文件的完整路径,如下所示:
include('inc/page2.php');
include('../page3.php');
include('/home/user/vhosts/yoursite/public_html/inc/page2.php');
尽管我建议创建一些配置文件,将站点的基本文件夹设置在一个地方,然后在需要的地方重新使用
这是非常基本的php内容,所以我建议在开始构建这样的网站之前,先学习一些教程。谷歌是你的朋友,但这里有一个开始:我可以建议你使用一个或创建一个基本的MVC(框架)吗
然后,您可以更好地控制在何处以及如何加载内容
如何编写类和
如果你的网站将是一个“大”的开始,你的意思是继续和程序从一开始就正确。。。看看OOP和MVC——从长远来看,它将对您有所帮助。使用初始网关php文件,假设您的结构如下所示:
include('inc/page2.php');
include('../page3.php');
include('/home/user/vhosts/yoursite/public_html/inc/page2.php');
文件夹:
/downloads
/templates
/templates/my_design
/templates/my_design/css
/templates/my_design/js
/system
因此,您需要的是为您调用的每个页面提供一个入口点:
/index.php
在此文件中,您可以链接系统配置文件,例如:
require_once '/system/config.inc.php'
现在,在config.inc.php中为根设置一个常量:
define('PAGE_ROOT','/home/user/vhosts/example.com/httpdocs/');
现在,您可以使用此常量在页面链接的任何位置包含以下内容:
include PAGE_ROOT.'/templates/my_design/theme.php';
现在,对于您的子页面,您可以使用两种不同的方法:
首先,使用参数
index.php?section=guestbook
在index.php文件中,解析参数,以便知道必须包含哪个php文件
第二次,修改
使用mod_rewrite,您还可以引导每个页面调用到index.php
RewriteEngine On
RewriteRule .* index.php
RewriteBase /
example.com/section/guestbook
这里您设置了一个类,比如说urlworker();它将请求的uri拆分为不同的部分,这样您就可以再次知道必须包含哪个站点。使用绝对路径
问题:菜单中的链接与包含menu.php的页面相关。例如,在art1.php中包含menu.php会使contact.php的链接指向
http://yoursite.com/articles/contact.php
而不是http://yoursite.com/contact.php
解决方案:在菜单链接中使用绝对URL:
突出显示当前页面的一种方法是在menu.php中执行以下操作:
<?php
// DO NOT CHANGE THESE
$server = 'http://'.$_SERVER["SERVER_NAME"]; // domain name or localhost
$this_page = $server . $_SERVER["PHP_SELF"]; // name of the script that
// includes menu.php
/*
* This array holds the menu items. I put in a few examples.
*
* The key (left side/before =>) is the URL to a page.
* It takes the form "$server/path/to/somepage.php"
* Make sure to include $server at the beginning.
*
* The value (right side/after =>) is the text that will appear in the menu.
*
* This is the only part you need to change to fit your site.
* Make sure you put a comma after each item, except the last one.
*/
$menuitems = array(
"$server/index.php" => 'Home Page', // notice the
"$server/home_page/page1.php" => 'Page 1', // comma after
"$server/home_page/articles/art1.php" => 'Article 1', // each item
"$server/contact.php" => 'Contact Us' // except the last
);
// The rest just generates an unordered list in HTML
// You do not need to change anything below.
$doc = new DOMDocument();
$menu = $doc->createElement('ul');
$doc->appendChild($menu);
// this creates the list of links in your menu
foreach ($menuitems as $url=>$label) {
$item = $doc->createElement('li');
$menu->appendChild($item);
$link = $doc->createElement('a',$label);
$link->setAttribute('href', $url);
// if the current page matches the current link,
// set class="current" on that link
if ($url === $this_page)
$link->setAttribute('class', 'current');
$item->appendChild($link);
}
echo $doc->saveHTML($menu);
?>
很好的建议,但并不能真正回答问题。@Herbert不完全。。。但它确实解决了问题。。。这意味着任何文件都可以被调用,无论它位于何处。例如,如果他调用“/page1”、“/page2”甚至是page2/getMembers,则所有这些都由框架控制。+1用于说明包含的文件中的路径是相对于包含它的文件的。这就像将代码复制到包含的文件中,然后粘贴到“父”文件中(因为没有更好的词)。我尝试了这里提到的一些事情,但我认为我对PHP的理解和知识太基础,无法确切了解我在做什么。到目前为止,我使用PHP的方式是基于复制+粘贴+研究需要更改哪些代码才能使其适合我。我想我首先需要做的是获得更多的PHP知识,这样答案中提到的所有其他代码对我来说就不会是一个黑魔法(我以前曾尝试通过在线教程学习PHP,但我总是发现,无论我使用编写人员编写的教程是什么,它总是假定我知道某些代码。正是在这种情况下,我的“学习”停止了,因为我感到非常困惑并再次陷入困境。我感谢其他人在回答我的问题时所做的努力,很抱歉,我做得不够好。)(不要惊慌。这不是一个罕见的问题。从你收到的投票数来看,这显然是一个非常好的问题