我有一个框架,我认为我遵循MVC模式之类的东西:一个框架(模型)一个控制输入(控制器)和视图页面(包含在main中的页面)的索引页面。 php /主要的HTML)
我阅读了很多关于结构和逻辑的知识,写了一篇很好的应用程序。我读了许多评论,例如"如果您要做的就是尝试将用户重定向到另一个页面,为什么要输出任何内容?"。答案是,最常见的情况是:用户成功登录后重定向。我需要打印一些东西吗?当然,整个主页面都有一个登录表单/帖子。我应该如何进行重定向?
所以我对应用程序的逻辑和结构有点困惑。如何存储所有输出并执行标题重定向而不打印任何内容?
我正在考虑使用javascript进行重定向,但我也读过评论说; "如果您编写好的代码(遵循良好的逻辑/结构),您将不再需要使用像javascript重定向这样的黑客攻击"。怎么可能呢?
因为不应该启用php output_buffering。
我启用了output_buffering,我可以使用header(输出后)没有任何问题。如果我使用javascript重定向整个页面重新加载,但使用标题只是加载内容(main.php中包含的视图内容)。
那么如果没有output_buffering,你怎么做呢?
答案 0 :(得分:2)
如果您想重定向到成功页面并传递消息 - 比如说,在成功登录后 - 一个简单的解决方案是使用“flash”会话,您可以在SESSION
中存储消息,然后,一旦它被使用,你就丢弃它。你不需要在输出缓冲区中为此做任何事情。
这是一个非常基本的例子,但应该给你一个要点。
<强>的login.php 强>
if($login_successful) {
// put your message in the session
$_SESSION['message'] = 'Login Successful';
// redirect to the success page
header('location: success.php');
}
<强> success.php 强>
<?php
session_start();
// check if $_SESSION['message'] exists
if(isset($_SESSION['message'])) {
// print the message
echo $_SESSION['message'];
// clear the session
$_SESSION['message'] = null;
}
答案 1 :(得分:2)
看起来你在这里混淆了一些东西。你在说什么实际上是两个不同的要求。用户想要查看主页面,或者他想要在主页面上使用该表单登录。在你的index.php中你会有这样的东西(伪代码):
if (isLoginRequest) {
// user wants to log in
if( validateLogin($loginFormData) ) {
redirect('successful');
} else {
displayLoginError();
}
} else {
// user wants to view main page
echo main.html
}
更新以回答评论中的问题:更好的选择是将您的表单验证内容留在login.php中,并在登录表单<form action="login.php" ...
中引用它。然后在你的login.php中你会有这样的东西:
if (loginSuccessful) {
redirect('success.php');
// no need to call die() or whatever
} else {
setFlashMessage('Login failed'); // set a flash message like timgavin described
redirect('index.php')
// also no die() or whatever
}
index.php然后负责显示您的主页面,如果设置,则从失败的登录尝试中呈现Flash消息。
答案 2 :(得分:0)
简单解决方案:将登录后脚本从login.php移动到另一个文件(login_post.php)。 dom输出后使用header()的其他脚本也是如此。 (无需更改表单操作=&#34;&#34;)
在index.php中:
$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
//some more security checks like esc_url() (non-php function)
if ($url == '/login') {
include('header_pages/login_post.php');
}
// all these includes before including main.php
// where views pages are included and the DOM output starts
由于header()在post脚本中,所以没有更多的头文件已经发送错误(当然还有output_buffering off。)
当前包含在main.php
中的注销页面相同感谢其他答案,他们帮助我找到了解决方案。