有关基于PHP会话的登录的问题

时间:2012-11-06 17:43:19

标签: php session session-state

我对基于PHP会话的登录有几个问题。我使用以下教程创建了一个连接到我现有用户数据库的登录表单:

http://www.sourcecodester.com/tutorials/php/4341/how-create-login-page-phpmysql.html

我理解其中的大部分内容,但我只是想查询一些我不理解的事情:

//Login Successful
session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
$_SESSION['SESS_FIRST_NAME'] = $member['username'];
$_SESSION['SESS_LAST_NAME'] = $member['password'];
session_write_close();
header("location: home.php");
exit();

以下代码进入login_exec.php页面 - 我认为此代码是在成功登录时设置会话ID - 我是否正确?

我不明白的原因是“SESS_MEMBER_ID”,“SESS_FIRST_NAME”和“SESS_LAST_NAME” - 为什么会出现这种情况以及它在做什么呢?

我的第二个问题。在“home.php”中 - 当用户单击“注销”时,它们将被定向回index.php并以某种方式破坏会话。确切地说,当点击“注销”时会话被破坏了。

第三,是否可以更改“home.php”,以便有一个if / else语句,说“if logged_in echo”yay,你登录“有各种登录内容, “否则,如果not_logged_in echo”抱歉,您尚未登录且无法查看此页面,请转到以下页面登录“。如果有可能,我该怎么做?

非常感谢

2 个答案:

答案 0 :(得分:3)

//Login Successful
session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
$_SESSION['SESS_FIRST_NAME'] = $member['username'];
$_SESSION['SESS_LAST_NAME'] = $member['password'];
  

以下代码进入login_exec.php页面 - 我认为这样   代码是在成功登录时设置会话ID - 我是否正确?

是的,它会设置会话,并在保存之前将一些成员信息保存到会话中。这样,无需进一步查询数据库即可获得信息。此外,如果信息存在,我们知道该用户未经过身份验证。

您还可以存储整个$member

$_SESSION['member'] = $member;

但这样做也会保存密码,并且在所有后续页面中将密码隐藏在会话中并不是一个好习惯。但是你可以这样做:

unset($member['password']);    // $member is a copy of the database row, untouched.
$_SESSION['member'] = $member;
  

我的第二个问题。在“home.php”中 - 当用户点击“注销”时,他们   被引导回index.php并以某种方式进行会话   销毁。确切地说,当会话被破坏时   点击“退出”。

通常,这是通过重定向和session_destroy完成的。

  

第三,是否可以改变“home.php”以便有一个   if / else语句就是说“if logged_in echo”   “yay,您已登录”,其中包含各种登录内容

是的,使用上面的$ _SESSION:

<?php
    if (!empty($_SESSION['SESS_MEMBER_ID']))
    {
?>

    Welcome, <?php print $_SESSION['SESS_FIRST_NAME']; ?>!

<?php
    } else {
?>
    Sorry, you need to <a href="login.php">LOGIN!</a>
<?php
    }
?>

答案 1 :(得分:0)

是:session_regenerate_id();正在设置您的会话ID。

设置了其他会话变量(SESS_MEMBER_ID等),因此您不必一直对数据进行查询。因此,这些变量(ID,名字和姓氏)存储在会话中。所以你可以简单地为“Welcome Zach”做<? echo "Welcome ".$_SESSION['SESS_FIRST_NAME']; ?> ...而且你可以做进一步的检查,以确保会话数据与该成员的数据库记录相匹配,以确保它没有被欺骗。

第三,你可以做到

if(!empty($_SESSION['SESS_MEMBER_ID'])){ echo "Yay ".$_SESSION['SESS_FIRST_NAME'].", you are logged in"; }else{ echo "XX"; }