【问题标题】:PHP:Keep variables/functions/session_start in one include file?PHP:将变量/函数/session_start 保存在一个包含文件中?
【发布时间】:2012-03-09 22:53:14
【问题描述】:

这可能是一个没有答案的问题,但是......

在经典的 ASP 中,我曾经在每个页面的顶部都有一个很棒的包含文件。它不仅具有站点上每个页面的页面顶部的基本 html 模板……它还具有关键变量,例如 dbase 连接字符串、有用的函数和各种变量,如果更改这些变量将传播到整个站点。我只需要将它包含在网站每个页面的顶部,它就可以给我统一的外观和访问各种内容的权限。最好的部分... 在顶部包含文件中发送 html 后,ASP 让我在下面进行重定向,例如,在成功登录、表单提交或用户的其他操作时。

现在我正在学习 PHP(仍然是菜鸟)。一旦 html 被发送,因为 header.php 失败,似乎没有简单的方法来进行重定向。并且您希望在每个页面上出现的某些内容(例如 session_start())必须位于任何 html 之前。因此,我可以在每个页面的顶部放置一个无 html 的包含,其中包含常用函数、字符串和调用,如 session_start 开头。但是,如果我想根据以下某些条件(即成功登录)进行重定向,似乎没有简单的方法可以为顶部保留漂亮的 html 模板。如果不是重定向问题,我会将代码放在 html 之前并将其全部放入顶级包含文件中。

有没有一种最佳做法可以让会话在每个页面的第一行开始,并方便使用其他代码,使用通用的 html 模板并仍然保留执行重定向的能力。

否则,如果重定向始终必须在任何 html 发送之前,则 html 不能作为单个文件包含在站点顶部,但必须插入到代码下方以及每个页面上的任何重定向...

感谢经验丰富的 PHP 专家对最佳实践的任何建议。

【问题讨论】:

  • 听起来您的网站已经到了将大量演示代码 (HTML) 与业务逻辑 (PHP) 混合在一起的地步。虽然您的问题肯定可以轻松解决(尽管如果没有看到您的实际代码我们无法帮助您),但您应该考虑将业务逻辑分成有组织的类,并且只在“视图”或“模板”文件中包含 HTML。这称为separation of concerns,是一种非常常见的最佳实践。

标签: php redirect


【解决方案1】:

发送内容后无法发送标头是 HTTP 协议的限制。 ASP 使用自动输出缓冲,但 PHP 默认在您输出内容后立即发送内容。您可以在 PHP 中打开输出缓冲,请阅读此处:http://php.net/manual/en/book.outcontrol.php

但是,您绝对应该研究 MVC。这是在 ASP 和 PHP(以及许多其他)中构建 Web 应用程序的标准模型:http://en.m.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

【讨论】:

    【解决方案2】:

    对于 session_start 问题,在董事会的其他地方,我发现了两个建议来检查会话是否已启动,以避免在会话已经存在时启动时出现错误消息。第一个是

    if (session_id() === "") {
        session_start();
    } 
    

    但是它返回一个错误,期望 [ 而不是 {。第二种方法

    if(empty($_SESSION))
        session_start();
    

    不会抛出错误,但如果为空则返回 0。所以我的计划是将 session_start 放在标题包含的开头,但用一个测试来检查会话尚未启动...然后放入重定向到登录页面的 logcheck 代码,除非你已经登录或者它是加入页面。然后我将在页面顶部放入一个等于 html 的变量。然后可以在任何包含头文件的文件中回显此变量以开始输出。这样,我认为,我已经将 html 与页面中的逻辑分开,以允许逻辑中的重定向。对于网站页面,他们获得标题包含。那么每个页面都可以做逻辑并产生一个消息。然后可以在回显顶部 html 后回显此消息。结果:标题在开头包含 session_start,用于管理跨站点访问的通用日志检查和顶部 html 模板。页面有自己的逻辑并且可以进行重定向。最后,他们回显输出。看看有没有用。。

    【讨论】:

    • 好的,很抱歉继续发帖。如果您可以在调用 session_start 之前检查它的状态,似乎会有不同的意见。有人说 if(!isset($_SESSION)) { session_start(); } 已验证。我在上面又举了两个例子。其他人说在调用 session_start() 之前无法检查会话。我想做检查以确保不会在会话之上意外启动会话。有人有明确的答案吗?谢谢!
    • 作为我为遇到此问题的任何人所做的最后说明,我创建了一个 php 代码文件以插入每个页面的顶部,没有空格或返回,因为它们将停止重定向。在这个文件中,我使用非常有用的 heredocs 将顶部 html 存储在一个变量中。有些人不喜欢它,但它对我来说就像一个魅力。然后,当需要在重定向后开始页面输出时,我调用了这个变量。感觉不是最佳实践,但会导致结构合理的代码。毫无疑问,类和对象会更好,但同时也会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2011-08-01
    • 2015-05-09
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多