0

我的登录系统有这个问题。我在同一台计算机上有两个用户,userA 和 userB。用户 A 在一个浏览器中进入他的帐户;userB 可以在同一个浏览器中访问他的帐户。我的系统认为现在 userB 也是 userA 并且 userA 仍然连接到它自己的帐户,但他的名字显示为 userB。如果这两个用户可以访问不同的浏览器,则没有问题。

你知道我该如何解决这个问题吗?这是我的登录系统的代码:

<?php session_start();

 $error = "";
 $usuario1="";
 $password="";
 $form = $_POST['acceso_cuenta'];

 if($_SERVER['REQUEST_METHOD']=='POST'){

    $usuario1  = $_POST['login'];
    $password1 = $_POST['pass'];

        $strconn="dbname=postgres port=5432 host=127.0.0.1 user=xxx password=***";
        $conn=pg_Connect($strconn);

if(!$conn){
 //  "Error connection!!!";  

}else{

  $query3 = "SELECT USUARIO FROM USERS WHERE USUARIO='$usuario1' 
      AND E_CONTRASENIA='$password' AND LEVEL='TAMER_LEVEL_3'";

  $query2 = "SELECT USUARIO FROM USERS WHERE USUARIO='$usuario1' 
      AND E_CONTRASENIA='$password' AND LEVEL='TAMER_LEVEL_2'";

      $result2=pg_query($conn,$query2);

      $result3=pg_query($conn,$query3);

         if(pg_num_rows($result3) != 0 ) { //success
             if(isset($_SESSION['logged-in']) || isset($_SESSION['user'])){
                   session_unset();
                   session_destroy();
                   }

             $_SESSION['logged-in'] = true;
             $_SESSION['user']=$usuario1;
             header('location: http://localhost/public_html/teacherLv3.php');   
             exit;

          }else if(pg_num_rows($result2) != 0){
             if(isset($_SESSION['logged-in']) || isset($_SESSION['user'])){
                   session_unset();
                   session_destroy();
                   }

         $_SESSION['logged-in'] = true;
         $_SESSION['user']=$usuario1; 
         header('location: http://localhost/public_html/teacherLv2.php');   
         exit;  

       }else { 

           $error = "WRONG DATA."; 
       }//
    pg_close($conn);

  } //else { $error = 'Don't leave blank spaces';}
 }//end of if server
 ?>

这是teacherLv3页面的代码:

<?php
session_start();

// is the one accessing this page logged in or not?

 if ( (!isset($_SESSION['logged-in']) && $_SESSION['logged-in'] !== true)) {

// not logged in, move to login page
session_destroy();
header('Location: login.php');
exit;
  }
?>

<html>
  <?  echo "Welcome back Teacher_Level 3 MASTER  {$_SESSION['user']} " ; ?>
</html>

这是teacherLv2页面的代码:

// is the one accessing this page logged in or not?

 if ( (!isset($_SESSION['logged-in']) && $_SESSION['logged-in'] !== true)) {

// not logged in, move to login page
session_destroy();
header('Location: login.php');
exit;
  }
?>

<html>
  <?  echo "Welcome back Teacher_Level 2 MASTER  {$_SESSION['user']} " ; ?>
</html>
4

2 回答 2

0

首先要做的事情...在页面顶部开始会话是一种很好的做法。所以在第一个<?php标签之后你开始会话session_start();

然后,如果用户已经登录,则需要先取消设置会话变量。

因此,在您注销的那一刻,您可以执行以下操作:

// everything fine for logout???
session_unset();
session_destroy();
// rederict to login / home page or whatever...

在登录部分:

if(pg_num_rows($result3) != 0 ) { //success
    if(isset($_SESSION['logged-in']) || isset($_SESSION['user']){
            session_unset();
            session_destroy();
        }
    $_SESSION['logged-in'] = true;
    $_SESSION['user']=$usuario1;
    header('location: http://localhost/public_html/teacherLv3.php');   
    exit;
}else if(pg_num_rows($result2) != 0){
    if(isset($_SESSION['logged-in']) || isset($_SESSION['user']){
            session_unset();
            session_destroy();
        }   
    $_SESSION['logged-in'] = true;
    $_SESSION['user']=$usuario1; 
    header('location: http://localhost/public_html/teacherLv2.php');   
    exit;  
}

编辑

首先,您需要为用户创建一个唯一的字符串(在登录部分):

$r_addr = $_SERVER['REMOTE_ADDR'];
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$unique_string = hash('ripemd160', $user_agent . $r_addr);

然后,您需要在数据库中创建一个表,该表可以保存username(以了解哪个用户在谈论)和unique_string您设置0 or 1是否注销的列(默认为 0);

然后,当您登录时,您检查数据库是否已经有任何用户unique_string,如果有,更新它们(除了您自己的)并将其设置logout column为 1。然后检查您是否unique_string已经存在,如果是,则删除该条目. 然后在表中插入自己的数据。

然后在您检查用户是否登录的任何地方,您还可以在获得注销状态的新表上进行查询(因此检查usernameunique_string)。状态为01。然后你做一点如果:

if(logout_status == 1 || no_result){ // also check for no result, because if so you an unregisterd user. The safest way to handle this is to logout and login again...
    // Do the logout with session_unset, session_destroy
}
于 2013-07-26T06:58:31.630 回答
0

当已经有人登录时,为什么不阻止其他人登录呢?

if($_SERVER['REQUEST_METHOD']=='POST' && empty($_SESSION['logged-in'])) {
    /* ... */
}
于 2013-07-26T08:20:10.453 回答