在PHP中重定向包含而不重定向主页面

时间:2015-02-24 03:39:51

标签: php redirect

我有一个带有index.php的网站,如下所示:

<?php
ob_start();
include_once 'config.php';
include_once 'dbconn.php';


session_start();


?>
<html>
<body>
<p>Some content</p>
<br>
<?php include_once 'loginform.php'; ob_end_flush(); ?>
</form>
</body>
</html>

loginform.php检查用户cookie以查看他们是否已登录,如果是,则重定向到account.php:

$regAddr = mysqli_query($conn, "SELECT * FROM users WHERE address = '$addr'");
$addrRow = mysqli_num_rows($regAddr);

//check if address is in db
if($addrRow !== 0) {
    header("Location: account.php");

如果他们没有登录,则会显示登录表单。 我有两个问题:

  1. 如果我删除了ob_start()和ob_end_flush(),则会在包含行上发送标题,而我无法重定向。
  2. 如果我离开并且用户已登录,则整个index.php将重定向到account.php。
  3. 有没有办法将login.php重定向到account.php,同时保持index.php静态(不刷新)而不使用iframe?

1 个答案:

答案 0 :(得分:1)

没有。整个文档将被重定向,因为您认为loginform.php的行为类似于iframe,但它的行为就像整个文档的一部分。

你有很多可用的选项来实现这一点......我不建议使用Iframe,而是使用验证用户登录的类或函数,然后根据结果包含一个文件。 / p>

<?php
if($logedin) {
     include("dashboard.php");
} else {
     include("loginform.php");
}

显然,这可以通过很多方式实现,我建议使用验证会话的类和一个将呈现视图的类,这样您就不必为每个视图重复HTML标题或类似的内容你要加载。

我用于其中一个系统的真实代码。

<?php
include_once("../models/class-Admin.php");

class AdminViewRender {

    public static function render() {
        $request = "home";
        $baseFolder = "../views/admin/";

        //index.php?url=theURLGoesHere -> renders theURLGoesHere.php if
        //exists, else redirects to the default page: home.php
        if(isset($_GET["url"])) {
            if(file_exists($baseFolder.$_GET["url"].".php")) {
                $request = $_GET["url"];
            } else {
                header("Location: home");
            }
        }

        $inc = $baseFolder.$request.".php";
        if($request !== "login") { //if you are not explicitly requesting login.php 
            $admin = new Admin();
            if($admin->validateAdminSession()) { //I have a class that tells me if the user is loged in or not
                AdminPanelHTML::renderTopPanelFrame(); //renders <html>, <head>.. ETC
                include($inc); //Includes requestedpage
                AdminPanelHTML::renderBottomPanelFrame(); //Renders some javascript at the bottom and the </body></html>
            } else {
                include($baseFolder."login.php"); //if user validation (login) fails, it renders the login form.
            }
        } else {
            include($inc); //renders login form because you requested it
        }

    }

}