我对在PHP中使用会话感到困惑,尤其是。在登录后维护用户会话。因此,为了维护会话,我们可以使用的方法之一是在PHP中使用session_start()。
现在,session_start()会生成一个唯一的sessionID,如果我正确的话,我会使用此ID向浏览器发送一个cookie(我从几个资源中读取)。
现在让我们来看一个简单的用户登录用例,我需要维护会话。通常,这是一个非常简单的场景,用户日志在表单的相应字段中输入他的用户名和密码。然后用户按下提交按钮。
POST值被发送到处理会话的PHP脚本,比如login.php。在login.php中我检查$ _POST ['用户名']和$ _POST ['密码']以查看它是否与数据库中存在的值匹配。让我们假设值匹配。
所以现在应该创建一个新会话,对吧?为什么我们在login.php的开头包含session_start()呢?
其次,所以在会话启动并创建sessionID之后,它会以cookie的形式发送到浏览器,并且还会记录在$ _SESSIONS全局变量中。那么现在问题就在于我们将这个会话与这个特定用户绑定了吗?我理解,因为cookie将由用户发送每个请求,并且由于服务器具有相同的sessionID,如在cookie中,也在其末端维护,服务器将知道该请求来自同一用户。但是,我们不会在此用户的任何位置(在数据库等中)显式记录此会话ID。因此,如果我需要有关此用户的所有其他详细信息,我将如何获得它?那么sessionID究竟是如何与存储在db?
中的特定用户的详细信息相关联的呢?所以举一个例子,让我们假设在上面的例子中我们讨论过的用户是USER A.对于第二个用户,比如说用户B,上述所有内容都适用。因此,现在服务器肯定能够区分来自这两个用户的请求,因为这些用户将在cookie中发送2个不同的会话ID及其请求。但是在服务器端,用户A的请求如何与数据库中用户A的详细信息相关联,以及用户B的请求如何与用户B的详细信息相关联。 db?
答案 0 :(得分:2)
清除你的困惑,我将逐点进行
So a new session should be created now, right? Why do we include session_start() in the beginning of login.php then?
我们包含session_start(),因为它说PHP启动会话然后您可以在$_SESSION
中存储任何信息,因此session_start()
是必要的
But on the server side, how will USER A's request be linked with USER A's details in the db and how will USER B's request be linked with USER B's details in the db ?
当用户登录时,我们将用户的(唯一)信息存储在$ _SESSION。
中例如,如果用户A已登录,则我将从数据库中获取其ID并将其存储在$_SESSION['uid']
中,并在需要时将其存储在其他信息中。
然后,当我想在任何页面上获得用户A的其他信息时,我将从$ _SESSION获取他的ID并根据此进行查询。
我希望这会清除你的困惑。
答案 1 :(得分:1)
在检查到您的页面有POST后,您可以设置$ _SESSION变量以保存已登录用户的一些信息以供进一步使用。
首先,您必须使用session_start()
开始您的会话,如您所述。
之后,检查用户提供的凭据是否与数据库中的信息匹配。
现在,如果用户应该登录,请试试这个(或者......就像......)
$_SESSION['logged_in'] = true;
$_SESSION['username']= $_POST['username'];
并存储您稍后可能需要的所有其他信息。
访问这些信息就像存储它们一样简单。只需使用$_SESSION['variable-name']
即可访问会话中的存储值
例如,获取用户名'当前登录用户,您可以使用$username = $_SESSION['username'];
我希望它有所帮助。
答案 2 :(得分:0)
所以基本上我对http://www.php.net/manual/en/session.examples.basic.php和https://www.youtube.com/watch?v=0dq5Sj9jyKU的会话有了更清晰的了解。
温和的说明: - 这个答案是为了帮助自己更好地理解会话。
所以基本上PHPSessionID和在对应特定用户的服务器上创建的会话具有以下关系和工作流程: -
所以要做到这一点,在开头本身的login.php中,在我们需要编写session_start()的任何其他代码之前。现在session_start()在这种情况下的作用是: -
- 它会生成PHPSessionId
- 将其存储在客户端的cookie中
现在,自用户进行身份验证后,他将获得欢迎屏幕或成功登录后用户需要发送到的任何屏幕。
当从客户端发送请求时,它会携带与该站点相关的所有cookie。因此,其中一个cookie包含我们的PHPSessionID,它也与此请求一起发送到页面welcome_member.php。
now welcome_member.php现在需要显示特定于登录用户的信息。
为此,我们在上面的步骤5和6中进行了一些小修改。因此,在成功匹配用户凭证之后,我们还创建了一个会话变量,其中我们将特定于此用户的一些唯一信息存储到此变量中。比如说我们将用户的唯一ID存储在会话变量loggedInUser中: -
$ _ SESSION ['loggedInUser'] = $ userID; //其中userId是从数据库中检索的用户的唯一userID。
现在可能有很多用户使用该应用程序。所以对于所有这些用户来说,所有这些都是真的。因此,将为成功登录的所有用户创建上述会话和会话变量。
所以应该有一种方法让服务器区分所有这些会话。
所以这就是PHPSessionId进入图片的地方。在服务器上,PHP区分使用此PHPSessionId的不同会话,因为对于每个用户,此ID将是唯一的。因此,根据此ID,PHP会选择从其内部存储中获取哪个特定会话。例如,对于用户A,例如,生成的PHPSessionId为1234。所以这将由PHP内部存储,例如标签“此会话保存用户A的信息”。类似地,对于用户B,例如,生成的PHPSessionId是6789。因此,这将由PHP内部存储,例如标签“此会话保存用户B的信息”。
现在回到上面的第12点,其中welcome_member.php需要访问特定于我们登录用户的一些信息。
所以在welcome_member.php中,要访问当前用户的会话以及我们之前在此会话中存储的所有信息(在我们的例子中只是userID),我们需要再次使用session_start()这个页面(当然还有在任何其他代码之前的页面开头welcome_member.php)。
现在在这种情况下,session_start()不会像上面步骤6中的情况那样重新启动另一个会话。但是,在这种情况下,由于页面welcome_member.php是从客户端调用的,因此它在cookie中已经有一个有效的PHPSessionID。因此,如上面步骤14和以下段落中所述,此会话ID用于检索存储在此登录用户的会话中的所有信息(在我们的示例中仅为userID)。
再次回到welcome_member.php,现在我们将用户的uniqueId存储在会话变量$ _SESSION ['loggedInUser']中,我们可以使用此值从中获取有关用户的任何其他详细信息数据库。
现在,对于需要访问此会话信息的每个页面(或者换句话说,需要维护页面用户会话),我们只需调用session_start(),然后按照步骤17中的说明进行操作以上。