PHP:将变量/函数/ session_start保存在一个包含文件中?

时间:2012-03-09 22:53:14

标签: php redirect

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

在经典ASP中,我曾经在每个页面的顶部都有一个精彩的包含文件。它不仅具有网站上每个页面顶部的基本html模板...它还具有关键变量,如dbase连接字符串,有用的函数和各种变量,如果更改将传播到整个站点。我只需将它包含在网站的每个页面的顶部,它给了我统一的外观和访问各种东西。最好的部分... ASP让我在html被发送到顶级包含文件后重定向,例如,成功登录,表单提交或用户的其他操作。

现在我正在学习PHP(仍然是noob)。一旦html被发送为header.php失败,似乎没有简单的方法来进行重定向。你想在session_start()等每个页面上想要的某些东西必须在任何html之前。因此,我可以在每个页面的顶部放置一个无html的包含常用函数,字符串以及session_start之类的调用。但是,如果我想根据以下某些条件进行重定向,即成功登录,似乎没有简单的方法可以保持好的html模板。如果不是重定向问题,我会把代码放在html之前并将它全部放在top-include文件中。

是否有一种最佳做法,可以在每个页面的第一行保持会话开始,并使用常用的html模板,并且仍然保留重定向功能,从而使其他代码更方便。

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

感谢有经验的PHP人员对最佳实践的任何建议。

2 个答案:

答案 0 :(得分:0)

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

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

然而它返回一个错误,期待[而不是{。第二种方式

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

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

答案 1 :(得分:0)

发送内容后无法发送标头是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