【问题标题】:PHP dynamic include content approachesPHP 动态包含内容方法
【发布时间】:2012-07-24 17:00:17
【问题描述】:

我想在每个页面上使用相同的页眉和页脚,但使用 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 等页面中,您只存储实际内容。然后你有 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 或只是 example.com/contact 这样的好 URL,你需要做 apache mod_rewriting...

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

谢谢。

【问题讨论】:

  • 好吧,从性能的角度来看,#2 包含 1 个包含,而包含 2 个,但我不知道这在宏伟的计划中真的很重要。当我第一次开始学习 PHP 时,我曾经广泛使用 #2,在设计中添加新页面非常方便,但如果我想做一些不同的事情,那么我必须编辑模板并单独维护它。到底用哪一种,就看你的需求了。
  • 我也是从 #2 开始的,但现在我认为 #1 看起来更好。如果我有几页,我会使用 #1,但我拥有的页面越多,我必须输入的包含越多...:)
  • 一般规则,您不应该信任用户输入。第一种方法是要走的路!
  • 我可以通过忽略所有用户输入来做到这一点,除了那些包含带有 mod_rewrite 和正则表达式的字符/数字的用户输入...

标签: php dynamic include


【解决方案1】:

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

【讨论】:

  • 我用 RewriteRule 检查每个 URL,只有当它包含字母和数字时,我才会将它传递给 PHP...我认为 MVC 方法对于我的需要来说有点复杂。
  • 明白了。我只是建议一个框架,因为它们带有用于处理路由、布局、模板等的样板代码。对于较大的项目可能会派上用场,但对于真正的小项目来说可能会带来更多麻烦。
【解决方案2】:

选项 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>

【讨论】:

  • 我不久前开始使用这种方法并喜欢它。我曾经使用您的选项 1,它非常有限,可能会很痛苦。
  • 也许它在 2012 年不可用:使用 ob_get_clean(),您可以在一次调用中获取缓冲区内容并删除缓冲区。它会变成:$page_contents = ob_get_clean(); .. 完成!
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 你不能把SESSION控制放在header.php中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2013-03-03
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多