PHP动态包含内容的方法


PHP dynamic include content approaches

我希望使用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等页面中,您只存储实际内容。然后您就有了带有一些参数(例如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.phpexample.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等)