【问题标题】:PHP header redirection is not workingPHP标头重定向不起作用
【发布时间】:2014-02-28 17:54:43
【问题描述】:

我正在开发 PHP 网站。我创建了一个函数来检查用户是否登录。如果用户已登录,那么它将触发数据库查询并检查将用户重定向到哪里。但它不能正常工作。我已经尝试通过更改 mysql db 中的值,但它不起作用并重定向到位置。

<?php
function Is_User_Logged_In()
{
    require $_SERVER['DOCUMENT_ROOT'].'/configuration/configurationfile.php';
    if(isset( $_SESSION['uname'], $_SESSION['email']))
    {
        $uname = @$_SESSION['uname'];
        $email = @$_SESSION['email'];

        if($result = $db->query("SELECT * FROM `users` WHERE BINARY `uname` = '$uname' AND `email` = '$email'"))
        {
            if($result and $result->num_rows)
            {
                $result = mysqli_fetch_array($result);
                $step2 = $result['step2'];
                $vpic = $result['vpics'];
                $act = $result['active'];

                if($step2 == 0)
                {
                    header("Location: /steptwo");
                }
                return true;
                exit();

                if($step2 != 0 && $vpic == 0)
                {
                    header("Location: /idupload");
                }
                return true;

                if($step2 != 0 && $vpic != 0 && $act == 0)
                {
                    header("Location: /pending");
                }
                return true;
            }
        }
        return true;
    }
    return false;
    header ("Location: /");
}
?>

这是我的职责。 step2、vpics 和 active in database 的默认值为 0。首先我想检查 step2 是否为零或什么。如果它为零,那么它应该重定向到“/steptwo”页面。然后我想检查 vpics 然后激活。如果其中三个不为零,则为主页。谁能帮我?

【问题讨论】:

  • 重定向指令不应该在函数内部
  • return true; exit() 是毫无意义的。 exit() 永远无法执行,因为返回调用在该点终止了函数。而且由于 return/exit 不在 if() 调用中,因此无论 if() 测试说什么,函数都会终止。
  • 这些回报看起来不对
  • 您能验证您的数据库调用是否返回任何内容吗?
  • 好吧,首先..如果$step2 不等于0,由于return trueexit,您的函数什么也不做。只需执行 print_r($step2)print_r($vpic); 即可查看输出结果

标签: php mysql redirect header


【解决方案1】:

您在标题语句之前返回 false。

return false;
header ("Location: /");

应该是

header ("Location: /");
return false;

编辑刚刚意识到你的 if 语句都是靠不住的。更改它们:

if($step2 == 0)
{
     header("Location: /steptwo");
     exit();
}
if($step2 != 0 && $vpic == 0)
{
     header("Location: /idupload");
     exit();
}
if($step2 != 0 && $vpic != 0 && $act == 0)
{
     header("Location: /pending");
     exit();
}

【讨论】:

  • 这个函数实际上会返回任何东西还是 header() 函数会停止应用程序(从 die() 开始)?
  • +1,除非 OP 计划在重定向后运行更多代码...
  • @Loïc 我认为不会返回 false,因为标头重定向部分将覆盖该部分。
  • 我对我的帖子进行了编辑。你的if 声明真的很奇怪。
  • @Maximus2012:让我们明确一点:header('Location: ..'); 不会使代码停止运行:它将继续运行,直到网络服务器检测到用户中止(您可以将浏览器配置为不这样做),甚至直到设置ignore_user_abort(true); 为止。如果其余的不应该运行,请始终 exit。 @OP:为什么它不起作用:我怀疑你已经生成了输出。
【解决方案2】:
   if($step2 == 0){
       header("Location: /steptwo");
   }return true; exit();

这应该是

       if($step2 == 0){
        header("Location: /steptwo");
        exit();
      }

如果退出在 if 之外,那么 if 下面的行将永远不会被执行。

【讨论】:

  • 放一个 exit();毕竟 header() 函数调用
  • 他为什么用exit()
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多