我的登录系统存在此问题。 我有两个用户,userA和userB在同一台计算机上。 userA在一个浏览器中输入他的帐户; 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>
答案 0 :(得分: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
已经被激活了,如果有的话,那就删除那个条目。然后在表格中插入您自己的数据。
然后在您检查用户是否已登录的任何地方,您还会在新建的表上执行查询,以获取注销状态(因此请检查username
和unique_string
) 。状态为0
或1
。然后你做一点如果:
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
}
答案 1 :(得分:0)
为什么不阻止其他人在已经有人登录时登录?
if($_SERVER['REQUEST_METHOD']=='POST' && empty($_SESSION['logged-in'])) {
/* ... */
}