不明白为什么需要 $_SESSION

Don't understand why $_SESSION is needed

我尝试通过示例创建登录表单。我让它工作了,但我不明白。

为什么需要 $_SESSION['umsco'] 以及为什么要将 $username 变量分配给它。我也不明白是否需要 conn->close() 以及 $result 变量是什么。

// I include the database file so we can get the information from there and apply it in here as well.
include "dbc.php";

// here we select the variables we want from the table 'members'.
$sql = "SELECT id, firstName, lastName FROM members";

// here we do something that I dont really know but this is standard procedure.
$result = mysqli_query($conn, $sql);

// declaring username
$username = $_POST["username"];
$password = $_POST["password"];


// my result thing, again, standard procedure.
$result = $conn->query($sql);

// we insert all values in row, standard procedure.
$row = $result->fetch_assoc();

// here we check if the username is the same as the database.
if ($username == $row["firstName"]) {
    // if it's correct then we start a session
    session_start();
    // we give a session some random letters or numbers and set it to $username, not exactly sure why, but it wont work without it.
    $_SESSION['umsco'] = $username; 
    // we change the location to secrect.php
    header("location: secret.php");
}

// we close the connection, not sure if this is needed, but it seems logical.
$conn->close();

我建议您始终在代码的开头实现session_start()以避免不良行为


什么是会话

要理解,你必须理解什么是PHP session

A session is a way to keep variables on all pages of your site for a current user.

工作原理

首先,您必须要求 PHP 初始化会话。为此,您必须在代码开头添加 session_start()

当服务器响应客户端时,它会附加一个名为 PHPSESSID 的 cookie,其中包含用户的唯一会话标识符。

在每次请求时,浏览器都会将此 cookie 发送到服务器,以便 php 可以从服务器的硬盘恢复会话。

注册会话变量最常用的方法是$_SESSION['key'] = $value;

最终答案

最后,行 $_SESSION['umsco'] = $username; 将用户的用户名存储在他的会话中,直到。

  • 会话被销毁 session_destroy()
  • php.ini
  • 中定义的会话 expire after a time
  • 您注销变量。

secret.php中你可能检查这个值是否被分配或者如果会话存在检查用户是否登录。这就是为什么它是强制性的,否则登录表单将没有任何意义。

另一个资源:Is closing the mysql connection important?

结果就是你下次打电话

session_start();
$loggedUserName = $_SESSION['umsco'];

您可以随时随地使用该用户(用户名)。

看一下SESSION的基础,应该就明白了。

首先,您需要查询用户名和密码匹配$_POST数据的成员。

其次,存储在 $_SESSION 变量中的任何内容都将在请求之间可用。通常,您想要 "remember" 用户 ID 或类似的,因此您不需要提交 username/password 并在每个请求中重复成员查找。

在此处查看更详细的说明:https://www.johnmorrisonline.com/build-php-login-form-using-sessions/

其他人关于 $_SESSION 变量的说法是正确的。如果使用 session_start();,这些值可以在来自用户浏览器的多个请求中保持不变。 $_SESSION 值将特定于访问您网站的用户。

关于 $result 对象,$result->fetch_assoc(); 只会从您的 table 中获取一行。因此,您当前的代码只有在用户名与您的成员 table 的第一行匹配时才有效。最好只查询用户名与他们输入的内容匹配的行。请注意,如果您只是将字符串连接在一起以进行查询,则存在很大的安全风险,因此您应该使用准备好的语句 (https://websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection)