我在不同的php文件中使用变量,而不使用session_start()。会话_start()缺少什么?我应该在什么时候使用此函数?

我在不同的php文件中使用变量,而不使用session_start()。会话_start()缺少什么?我应该在什么时候使用此函数?,php,mysqli,Php,Mysqli,我是PHP新手。我正在做一个小项目(从数据库中读取数据、密码)来学习PHP,我正在使用我在不同PHP文件中以某种形式获得的一些变量。我想我应该使用session_start()和全局变量$session在不同的PHP文件中使用相同的变量。下面是我的代码,我将这些文件放在一个文件夹中:index.php(HTML和表单)、conn.php(连接到数据库)、login.php(从数据库读取数据的文件) 有人能给我解释一下为什么在这种情况下我不需要使用session_start(),在什么特定情况下我

我是PHP新手。我正在做一个小项目(从数据库中读取数据、密码)来学习PHP,我正在使用我在不同PHP文件中以某种形式获得的一些变量。我想我应该使用session_start()和全局变量$session在不同的PHP文件中使用相同的变量。下面是我的代码,我将这些文件放在一个文件夹中:index.php(HTML和表单)、conn.php(连接到数据库)、login.php(从数据库读取数据的文件)

有人能给我解释一下为什么在这种情况下我不需要使用session_start(),在什么特定情况下我需要使用全局变量$\u session吗

index.php:

<?php
include_once "conn.php";

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>

    <form id="login" method="POST" action="login.php">
        <label for="loginUsername">Username</label>
        <input type="text" id="loginUsername" name="loginUsername">
        <br>
        <label for="loginPassword">Password</label>
        <input type="password" name="loginPassword" id="loginPassword"><br>
        <input type="submit" name="login" value="Login">
    </form>
</body>
</html>

文件
用户名

密码
conn.php:

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "loginsystem";

    $conn = mysqli_connect($servername, $username, $password, $dbname);

首先需要使用session\u start,session\u start之后只能使用$\u session变量

我建议您编写config.php的第一行。

在不同的php文件中使用变量不需要会话。但是,您可以使用会话存储和访问来自不同请求的数据

这可能是你项目的下一步。用户登录后,可能会被授权执行此操作。你不想让她每次都登录。因此,您需要一种方法来允许她执行这些任务,而无需再次发送她的密码

这是一个会话可以帮助您(或者您可以用另一种方式解决它)的示例


但是对于您现在拥有的代码,您不需要会话,它本身就可以了。

如果我理解正确,您会想为什么您可以从一个脚本访问另一个脚本中的变量

答案很简单:无论何时调用
include
require
,所包含代码中的所有内容(所有变量和方法)都可以在调用方脚本中使用。这意味着所包含脚本的每一行代码都在调用方脚本中执行


这意味着您必须小心处理includes:如果在脚本中定义函数并两次包含该脚本,PHP将抛出一个错误,指出已定义了具有此名称的函数。为了避免这种情况,您可以使用
include_once
require_once

只需在此基础上进一步构建一个技巧:不要存储密码。那么你该怎么做呢:1。存储单向散列,而不是密码;2.使用随机盐来防止彩虹表攻击;3.使用一个缓慢的散列算法,否则这一切都是徒劳的。谢谢你的提示。我知道我不应该将用户的密码存储在数据库中。对于我学习php的小项目,我使用函数“password_hash($password,password_DEFAULT);”加密密码,这个函数是否与您所说的一致,或者我是否需要使用其他函数将密码存储在数据库中?我理解您的意思。但在我的例子中,我在主文件(index.php)中包含conn.php文件,以便使用连接,但在index.php中不包含login.php文件,我在表单中定义变量,但即使如此,我也可以在login.php中使用这些变量。在本例中,action=“login.php”是否作为一个包含项工作?login.php是否包含在其他地方?
action=“login.php”
中的login.php调用什么?login.php不包括在任何地方,action=“login.php”进入数据库,查看用户是否存在以及密码是否有效index.php中可用变量的内容与login.php中的内容相同?PHP不关心变量的声明。您仍然可以使用未声明的变量。谢谢提示。我知道我需要使用会话来让用户在登录验证后登录,但我现在还不清楚该如何使用它。例如,我是否应该将用户在表单上插入的密码存储在会话变量中,并将我从数据库获得的密码存储在其他会话变量中,并在每次需要验证操作时比较这两个变量,还是应该以不同的方式使用会话变量?您不会存储密码。在理想情况下,您只需在
$\u SESSION
变量中存储一个ID,其余的由PHP处理。但可悲的是,这个世界并不完美,还有一种叫做“跨站点请求伪造”的东西。为了防止这种情况发生,您需要记住诸如密码/令牌/nonce之类的内容,并使用它来验证任何操作。此令牌可以存储在会话中,并在需要时进行验证。
<?php
    include_once "conn.php";


    if(isset($_POST["login"])){

        $username = $_POST["loginUsername"];
        $password = $_POST["loginPassword"];

        echo $password;
        $sql = "SELECT password FROM users WHERE username=?;";

        $stmt = mysqli_stmt_init($conn);

        mysqli_stmt_prepare($stmt, $sql);
        mysqli_stmt_bind_param($stmt, 's', $username);
        mysqli_stmt_execute($stmt);

        $result = mysqli_stmt_get_result($stmt);
        while($row=mysqli_fetch_assoc($result)){
            echo $row["password"];
        }

    }