登录脚本PHP上的重定向循环

登录脚本PHP上的重定向循环,php,redirect,cookies,login,Php,Redirect,Cookies,Login,我有一个登录系统,每当用户成功登录时,就会使用其用户名密码和一些其他变量创建一些cookie,这些变量放在url中用于配置会话: setcookie("username", $myusername); //Sets a cookie storing the username setcookie("password", $mypassword); //Sets a cookie storing the encrypted value of the password setcookie("typeO

我有一个登录系统,每当用户成功登录时,就会使用其用户名密码和一些其他变量创建一些cookie,这些变量放在url中用于配置会话:

setcookie("username", $myusername); //Sets a cookie storing the username
setcookie("password", $mypassword); //Sets a cookie storing the encrypted value of the password
setcookie("typeOfUser",$type); //example variable
变量通过URL传递:

header("location:http://www.example.com/logged.php?type=".$type);
在logged.php页面中,我有一个名为protect.php的文件,它检查cookies是否存在以及它是什么类型的用户

if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){
    //check if this user's cookies exist on the DB
    $user = $_COOKIE["username"];
    $pass = $_COOKIE["password"];

    $sql="SELECT * FROM USERS WHERE Usr='".$user."' and Pass='".$pass."';";
    $result=mysql_query($sql);

    // Mysql_num_row is counting table row
    $count=mysql_num_rows($result);

    if($count==1){
        $type = $_COOKIE["type"];
        header("location:logged.php?type=".$type);
        exit();
    }
    else{
         header("location:http://www.example.com/login.php");
    }
}
因此,如果用户只是键入www.example.com/logged.php,他/她将获得与其用户相关联的变量,但每当我这样做时,我就会在站点上得到一个重定向循环。(在我看来,有点明显的是,每次它转到报头时都会重定向原因(“位置…它会重新启动,并在顶部检查protect.php…但我想不出解决这个问题的方法)

注意logged.php的顶部有一个:

include("protect.php");

提前感谢!

此脚本无限循环的原因基于以下逻辑:

if($count==1){
    header("location:logged.php?type=".$type);
}
else{
     header("location:http://www.example.com/login.php");
}
无论此时
$count
的值是多少,您的脚本都会发送一个位置头。换句话说,无论
$count
是否等于1,浏览器都会收到重定向

if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){
结合这一行,您的循环被定义。如果用户定义了这些Cookie,这将计算为真,这发生在他们第一次登录时,或者已经登录。如果他们登录,他们的用户名和密码必须有效,
$count
将最终为1,因为他们在数据库中。

简言之,每次用户登录后转到
logged.php
,都会运行此脚本,因为他们拥有适当的cookie,并且再次被引导到
“logged.php?type=。“$type”
(一次又一次),因为他们是有效用户,并且存在于数据库中

要解决此问题,您需要在每次运行
protect.php
时停止运行
header(“location:logged.php?type=“.$type”);
这是问题的本质。您可以随心所欲地解决此问题,但我会使用会话

查看以了解如何在登录脚本中实现会话

您已经有三个COOKIE:
用户名
密码
、和
类型用户
。您拥有的系统运行良好,但大多数身份验证脚本使用会话,可以像COOKIE一样访问($\u COOKIE['foo']),但改用$\u SESSION变量。使用SESSION的优点是,除了服务器/站点上的脚本之外,存储在会话中的值不可供任何人查看或编辑。一般来说,向用户公开的信息越少越好。如果需要说明,请查看或查看上的基本示例

还有一点需要指出的是,在您的脚本中,
if(isset($\u COOKIE[“username”])和&isset($\u COOKIE[“password”])){
没有else语句。如果未定义其中一个或两个cookie,则不会执行任何代码,并且我假设将公开显示受保护的页面。您可能需要添加一个
else
语句,大致如下:

else{
     header("location:http://www.example.com/login.php");
}

希望您能够使此脚本功能强大!

此脚本无限循环的原因基于以下逻辑:

if($count==1){
    header("location:logged.php?type=".$type);
}
else{
     header("location:http://www.example.com/login.php");
}
无论此时
$count
的值是多少,您的脚本都会发送一个位置头。换句话说,无论
$count
是否等于1,浏览器都会收到重定向

if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){
结合这一行,您的循环被定义。如果用户定义了这些Cookie,这将计算为真,这发生在他们第一次登录时,或者已经登录。如果他们登录,他们的用户名和密码必须有效,
$count
将最终为1,因为他们在数据库中。

简言之,每次用户登录后转到
logged.php
,都会运行此脚本,因为他们拥有适当的cookie,并且再次被引导到
“logged.php?type=。“$type”
(一次又一次),因为他们是有效用户,并且存在于数据库中

要解决此问题,您需要在每次运行
protect.php
时停止运行
header(“location:logged.php?type=“.$type”);
这是问题的本质。您可以随心所欲地解决此问题,但我会使用会话

查看以了解如何在登录脚本中实现会话

您已经有三个COOKIE:
用户名
密码
、和
类型用户
。您拥有的系统运行良好,但大多数身份验证脚本使用会话,可以像COOKIE一样访问($\u COOKIE['foo']),但改用$\u SESSION变量。使用SESSION的优点是,除了服务器/站点上的脚本之外,存储在会话中的值不可供任何人查看或编辑。一般来说,向用户公开的信息越少越好。如果需要说明,请查看或查看上的基本示例

还有一点需要指出的是,在您的脚本中,
if(isset($\u COOKIE[“username”])和&isset($\u COOKIE[“password”])){
没有else语句。如果未定义其中一个或两个cookie,则不会执行任何代码,并且我假设将公开显示受保护的页面。您可能需要添加一个
else
语句,大致如下:

else{
     header("location:http://www.example.com/login.php");
}
希望你能够使这个功能和真棒