1

我想在每个页面上都有相同的页眉和页脚,只有使用 PHP 的不同内容。做到这一点的最佳方法是什么?

我知道这两个流行的,但不知道选择哪一个(或者可能是其他一些):

1. 在每一页上包含页眉和页脚

在每个页面中,如contact.phpabout.php等,您必须在页面顶部包含页眉,在底部包含页脚。然后内容也介于两者之间。例如contact.php看起来像这样:

<?php include("header.php"); ?>
Lorem ipsum dolor sit amet...
<?php include("footer.php"); ?>

当你想做请求时,你只需输入example.com/contact.php

2. index.php?page=xyz

contact.phpabout.php等页面中,您只存储实际内容。然后你有index.php和一些参数(例如页面),你可以通过它指定要包含的内容。例如,contact.php文件如下所示:

Lorem ipsum dolor sit amet...

像这样的index.php文件(这是简化版):

<html>
    <head>
        <title>Lorem ipsum</title>
    </head>
    <body>
        <?php include(some_parser_function($_GET["page"].".php")); ?>
    </body>
</html>

现在,当您请求它时,index.php?page=contact它会显示index.php以及在开始和结束body标记之间来自contact.php的内容。

第一种方法在我看来有点不切实际,因为您必须将包含函数写入每个页面。在第二种方法中,如果你想拥有像example.com/contact.php或只是这样的好 URL example.com/contact,你需要做 apache mod_rewriting...

这些(和其他)方法中的哪一种更好/更受欢迎,为什么?

谢谢。

4

3 回答 3

2

如果可能的话,我会避免动态包含。它会打开一个安全漏洞,除非您清理来自外部源的变量,即您的案例中的 GET 参数。您可以采用像 Model-View-Controller 框架那样的方法。他们的代码基本上将模板的输出放入布局中。

于 2012-07-24T17:19:02.427 回答
1

选项 2 更适合模板化。您还可以使用 Rewrite 使其在 url 末尾没有 ?page=pagename 的情况下显示。此外,根据您网站上有多少页面,必须在每个文件中都包含这两个内容是一种痛苦。

但是,如果我是你,我会考虑使用 ob_start() ob_get_contents() 和 ob_flush()。然后,您可以在开始输出 html 之前实际运行包含文件上的所有代码。

这是一个例子:

ob_start();
include("{$page_name}.php");
$page_contents = ob_get_contents();
ob_end_clean();

ob_start();
include("templates/standard.php");
$full_html = ob_get_contents();
ob_end_clean();

echo $full_html;

通过这种方式,您可以轻松创建多个模板以随时使用。模板文件如下所示:

<html>
    <head>
        <title>Lorem ipsum</title>
    </head>
    <body>
        <?php echo $page_contents; ?>
    </body>
</html>
于 2012-07-24T17:16:54.037 回答
0

一般来说,2 方法的最大优点是验证/插入。如果您采用第一种方法,您将不得不一次又一次地进行所有验证/插入。而且,如果您必须更改/添加/删除某些内容,则必须更改所有页面。这很烦人。我通常更喜欢第二种方法,因为您可以集中所有内容并避免重复相同的指令。

但这也很大程度上取决于您的网站。

我给你举个例子:我曾经做过一个有 2 个主要部门的网站。

在这种情况下,我做了第二种方法的 2 个不同页面。

(当我谈论验证时,我的意思是验证所有 SESSION 变量、用户是否已登录、他是否是 ADM 等)

于 2012-07-24T17:16:27.987 回答