【问题标题】:Include PHP, not working when included php code is for files in different directories包含 PHP,当包含的 php 代码用于不同目录中的文件时不起作用
【发布时间】:2014-04-10 08:56:56
【问题描述】:

我正在写一个很大的网站,所以我决定使用包含函数来更容易地更改横幅、菜单、页脚等。

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

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

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

  1. 一些网站
  2. [CSS] [文章] [inc] page.php page2.php
  3. page3.php

因此,如果我想将 page.php 与 page2.php 链接,则链接将是 <a href="page2.php"> 但是,如果我想将 page3.php 与 page2.php 链接,则链接将是 <a href="../page2.php">

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

我非常感谢任何帮助。

编辑:

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

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

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

假设我的 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 或任何其他从不同目录指向网页的链接时,它不起作用。

【问题讨论】:

  • 我尝试了这里提到的一些东西,但我认为我对 PHP 的理解和知识太基础了,无法确切知道我在做什么。到目前为止,我使用 PHP 的方式是基于复制+粘贴+研究需要更改哪些代码才能使其适合我。我想我首先需要做的是首先获得更多关于 PHP 的知识,这样答案中提到的所有其他代码对我来说似乎都不是黑魔法。 :(
  • 我之前曾尝试通过在线教程学习 PHP,但我总是发现,无论我使用编写它的人的任何教程,都假定我知道某些代码。这就是我的“学习”停止的时候,因为我变得非常困惑并再次陷入困境。我感谢其他人为回答我的问题所做的努力,我很抱歉我还不够好,无法正确实施它。 :(
  • 不要灰心。这不是一个不常见的问题。从您收到的赞成票数量来看,这显然是一个非常好的问题。由于您提供了更多详细信息,因此我尝试了一个 我认为 更符合您的特定需求的答案。它还展示了如何使用class="current" 突出显示当前页面。

标签: php


【解决方案1】:

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

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

<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);
?>

【讨论】:

  • 这是一种快速而肮脏的编码,所以如果有人发现任何错误或潜在的改进,请告诉我。 :)
  • 我花了几个小时(大约 8 个大声笑)看教程,并且为了更好地理解 PHP,我做了更多的阅读(相信我,我的大脑变成了一个炒鸡蛋)。我从头开始做所有事情。我设法让链接和图像工作。在“普通”php 文件中,我添加了 在我的包含文件夹中,目录的路径是:
  • Home Page
  • 我猜这是你的调用绝对 URL(我承认我以前不知道它是什么(更多研究:P))。
  • 我希望我不会开始变得非常烦人(我有很多问题,想了解更多:P)。我试图研究这里使用的代码的特定部分,但信息通常非常笼统,所以仍然没有给我满意的答案。你能推荐任何关于 PHP 的聊天室吗?
  • @Kornie:StackOverflow 有一个PHP chat room,但你可能没有足够的声望进入。你让它工作了吗?您在这段代码的哪些特定部分遇到问题?
  • 我了解变量的工作原理,但我想更详细地了解为什么您输入某些代码而不是其他代码,或者用什么完全替换代码,例如
  • 【解决方案2】:

    您的问题有一些错误和格式问题,所以我可能会弄错。但是您需要包含包含文件的路径,否则 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 内容,所以我建议在开始构建这样的网站之前先学习一些教程。 Google 是您的朋友,但这是一个开始:http://php.net/manual/en/tutorial.php

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • +1 用于提及包含文件中的路径与包含它的文件相关。这就像复制包含文件中的代码并将其粘贴到“父”文件中(因为没有更好的词)。
      【解决方案4】:

      使用绝对路径

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

      【讨论】:

      • 如此简单,我花了很多时间研究以了解真正的绝对路径是什么,它的用途以及如何正确使用它。
      【解决方案5】:

      使用初始网关 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

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

      RewriteEngine On
      RewriteRule .* index.php
      RewriteBase /
      
      example.com/section/guestbook
      

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

      【讨论】:

        【解决方案6】:

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

        然后,您可以更好地控制加载的位置和方式

        如何编写类herehere

        如果您的网站要“大”启动,因为您打算从一开始就对其进行正确编程...看看 OOP 和 MVC - 从长远来看,它将对您有所帮助。

        【讨论】:

        • 好建议,但不能真正回答问题。
        • @Herbert 不完全......但它确实解决了问题......这意味着可以调用任何文件,并且它的位置无关紧要。例如如果他调用“/page1”、“/page2”甚至是 page2/getMembers - 它都由框架控制。
        猜你喜欢
        相关资源
        最近更新 更多
        热门标签