我希望使用PHP在每一页上都有相同的页眉和页脚,但内容不同。做到这一点的最佳方法是什么?
我知道这两个很受欢迎的,但不知道该选择哪一个(或者其他一些):
1.每页包括页眉和页脚
在每个页面中,如contact.php、about.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.php、about.php等页面中,您只存储实际内容。然后您就有了带有一些参数(例如page)的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.中的内容
在我看来,第一种方法有点不切实际,因为您必须将include函数写入每一页。在第二种方法中,如果你想拥有像example.com/contact.php
或example.com/contact
这样的漂亮URL,你需要执行apachemod_rewriting。。。
这些(和其他)方法中哪一种更好/更受欢迎,为什么
谢谢。
如果可能的话,我会避免动态包含。它打开了一个安全漏洞,除非您清除来自外部源的变量,即您的案例中的GET参数。您可以采用类似于模型-视图-控制器框架的方法。它们的代码本质上是将模板的输出放入布局中。
选项2对于模板化来说要好得多。您也可以使用"重写"使其显示为没有?page=url末尾的页面名称。另外,根据你的网站上有多少页面,在每个文件上都要包含这两个内容是一种痛苦。
然而,如果我是你,我会考虑使用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>
通常,2方法的最大优点是验证/插入。如果采用第一种方法,则必须一次又一次地进行所有验证/插入。如果你必须更改/添加/删除某些内容,你就必须更改所有页面。这很烦人。我通常更喜欢第二种方法,因为你可以集中所有东西,避免重复相同的指令。
但这在很大程度上也取决于你的网站。
我给你举一个例子:我曾经做过一个有两个主要部门的网站。
在这种情况下,我做了两页不同的第二种方法。
(当我谈论验证时,我指的是验证所有SESSION变量,如果用户已登录,如果他是ADM等)