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

包含PHP,当包含的PHP代码用于不同目录中的文件时不起作用,php,Php,我正在写一个相当大的网站,所以我决定使用include函数来简化横幅、菜单、页脚等的更改 只要文件在同一个文件目录中,一切正常。从我在“stackoverflow”上找到的另一篇文章中,我找到了如何使包含文件的路径正常工作 我遇到的问题是,即使实际的网页可以找到包含的文件,它仍然无法工作,因为它似乎无法找到实际链接的正确目录 我将尝试使用一个示例代码来说明我的意思。。。 假设它是我的文件目录 某网站 [CSS][articles][inc]page.php page2.php page3.php

我正在写一个相当大的网站,所以我决定使用include函数来简化横幅、菜单、页脚等的更改

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

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

我将尝试使用一个示例代码来说明我的意思。。。 假设它是我的文件目录

  • 某网站
  • [CSS][articles][inc]page.php page2.php
  • page3.php
  • 因此,如果我想将page.php与page2.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,但我总是发现,无论我使用编写人员编写的教程是什么,它总是假定我知道某些代码。正是在这种情况下,我的“学习”停止了,因为我感到非常困惑并再次陷入困境。我感谢其他人在回答我的问题时所做的努力,很抱歉,我做得不够好。)(不要惊慌。这不是一个罕见的问题。从你收到的投票数来看,这显然是一个非常好的问题