包含PHP,当包含php代码用于不同目录中的文件时不工作

时间:2012-01-20 12:38:46

标签: php

我正在编写相当大的网站,因此我决定使用包含功能,以便更改横幅,菜单,页脚等。

只要文件位于同一文件目录中,一切正常。从我在'stackoverflow'上发现的另一篇文章中,我发现了如何使包含文件的路径工作。

我遇到的问题是即使实际的网页可以找到包含的文件,它仍然无法正常工作,因为它似乎找不到实际链接的正确目录。

我将尝试使用示例代码来表明我的意思...... 假设这是我的文件目录

  1. 部分网站
  2. [CSS] [articles] [inc] page.php page2.php
  3. page3.php
  4. 因此,如果我想将page.php与page2.php相关联,则链接将为<a href="page2.php"> 但是,如果我想将page3.php与page2.php链接,则链接将为<a href="../page2.php">

    我认为这就是冲突所在。 menu.php中的文件目录不适用于所有页面。

    我真的很感激任何帮助。

    编辑:

    我会尝试更好地解释一下网站的结构。对不起,如果我有点困惑(我有时很难解释我的意思,因为英语不是我的第一语言)。

    这是我的网站文件目录的示例。

    我想使用include功能的唯一原因是我可以在所有网页上使用相同的横幅图像,菜单导航或页脚。

    file hierarchy

    假设我的menu.php(位于“inc文件夹”中)将包含在所有页面中,就像那样

    <ul>
    <li><a href="index.php"  class="navon">Home Page</a></li>
    <li><a href="contact.php">Contact us</a></li>
    </ul>
    

    当我使用

    <?php include ("inc/menu.php"); ?>
    

    (或任何适当指示的文件)

    一切都以我希望的方式出现,但问题是,当我将index.php或任何其他链接从不同目录按到网页时,它不起作用。

6 个答案:

答案 0 :(得分:4)

你的问题有一些错误和格式问题,所以我可能错了。但是你需要包含你所包含文件的路径,否则php将不知道在哪里看。

例如,如果在inc文件夹中有page2.php而你想在page3.php中包含page2.php,你可以使用这样的东西:

include('inc/page2.php');

如果你想在page2.php中包含page3.php,它将是这样的:

include('../page3.php');

您还可以使用包含文件的完整路径,如下所示:

include('/home/user/vhosts/yoursite/public_html/inc/page2.php');

虽然我建议创建某种配置文件,将网站的基本文件夹设置在一个位置,然后在需要的地方重复使用。

这是非常基本的PHP内容,所以我建议先进行一些教程,然后再开始构建这样的网站。谷歌是你的朋友,但这是一个开始:http://php.net/manual/en/tutorial.php

答案 1 :(得分:4)

问题:菜单中的链接与包含menu.php的页面相关。例如,在art1.php中包含menu.php会使指向contact.php的链接指向http://yoursite.com/articles/contact.php,而不是http://yoursite.com/contact.php

解决方案:在菜单链接中使用绝对网址:

<ul>
    <li><a href="http://yoursite.com/index.php"  class="navon">Home Page</a></li>
    <li><a href="http://yoursite.com/contact.php">Contact us</a></li>
</ul>

突出显示当前页面的一种方法是在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);
?>

答案 2 :(得分:3)

使用初始网关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中为你的root设置一个常量:

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

使用mod_rewrite,您还可以引导每个页面调用index.php

RewriteEngine On
RewriteRule .* index.php
RewriteBase /

example.com/section/guestbook

在这里设置一个类,让我们说urlworker();它将请求的uri分成不同的部分,因此您再次知道必须包含哪个站点。

答案 3 :(得分:3)

使用绝对路径

<?php include ($_SERVER['DOCUMENT_ROOT']."/inc/menu.php"); ?>

答案 4 :(得分:2)

在PHP中,包含的文件似乎是它们所包含的文件的一部分。因此,如果您在page2.php中有图像和链接并将page2包含到page1.php中,则所有图像和链接将显示为相对于page1.php。所以page2.php在一个子文件夹中,你在同一个子文件夹中有page2的图像,当你将它包含在page1.php中时,你的图像源会出错。

解决此问题的一种方法是让所有图像源和站点链接相对于根而不是相对于php文件。所以设计你的源和链接从根文件夹开始,“/”如果你的站点位于域的顶部,或者如果站点在子文件夹中启动,则设置为“/ sometopfolder”,然后从那里开始。

答案 5 :(得分:-1)

我建议您使用framework或创建 own 基本MVC(框架)

然后你可以更好地控制加载的地方和方式

如何编写课程herehere

如果您的网站将变得“大”,那么您可以从一开始就对其进行正确编程......看看OOP和MVC - 从长远来看它会对您有所帮助。