首页 文章

PHP会话 . 无法登录

提问于
浏览
0

--EDIT--

发现了这个问题 . 感谢Conyc . 我想我发现了这个问题 . 当没有剩余的行要读取时,mysqli_fetch_assoc($ result)返回null . 这意味着当您尝试将用户名放入$ _SESSION ['Id'] = $ row ['Username']的会话时,$ row将为null;尝试将用户名存储在变量中,就像使用密码一样 . - Conyc 12分钟前


目前正在尝试通过登录来显示内容 . 我正在使用会话和哈希密码 . 我不能为我的生活弄清楚为什么它没有显示我“登录” . if(isset($ _ SESSION ['Id']))显示我没有登录,即使我可以从mysql中检索我的用户名和密码 . 我认为它可能与html上的会话有关?或者会话ID可能错了? IDK . 如果你们有任何想法,我很想知道 . 我是一个新的PHP,所以它非常粗糙 .

这是我的login.php

<?php
session_start();
$servername = "localhost";
$username = "root";
$password = "";

$user = $_POST['User'];
$Userpassword = $_POST['Password'];
$password_hash = password_hash($Userpassword, PASSWORD_DEFAULT);

$storedPassword = "";

// Create connection

$conn= mysqli_connect("$servername","$username","$password") or die ("could 
not connect to mysql");
mysqli_select_db($conn, "dpw_recyclopedia") or die ("no database");
$sql = "SELECT Username, Password FROM Users WHERE Username = '".$user."'";
$result = mysqli_query($conn, $sql);


if(! $result ) {
    die('Could not select data: ' . mysqli_error($conn));
}

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        //echo "user: " . $row["UserName"]. " " . $row["Password"]. "<br>";
        $storedPassword = $row["Password"];
    }
} else {
    echo "User Not Found";
}

 if (password_verify($Userpassword , $storedPassword)) {
    $_SESSION['Id'] = $row['Username'];
    header ("Location: 'mywebsite');
 }else {
    header ("Location: 'mywebsite');
    exit();

 }

?>

这是我的html页面

<?php
include 'DbConfig.php';
session_name('Id');
session_start();
session_regenerate_id();
?>

<!DOCTYPE html>
<html lang="en">

                    <?php

                        if (isset($_SESSION['Id'])){
                                echo "you are logged in";
                            } else {
                                echo "you are not logged in";
                    }

                    echo json_encode($_SESSION);
                    echo json_encode($_COOKIE);
                    ?>
                        <form method = 'POST' action="./ajax/login.php">
                        <input type='text' name='User' placeholder='Email'>
                        <input type='password' name= 'Password' 
placeholder='Password'>
                        <button type='submit'  name='my_form_submit_button'>
                        <span class='glyphicon glyphicon-log-in'></span> 
&nbsp; Sign In
                        </button>
                        </form>

                        <form method = 'POST' action="./ajax/logout.php">
                        <button type='submit'  name='my_form_submit_button'>
                        <span class='glyphicon glyphicon-log-in'></span> 
&nbsp; Sign Out
                        </button>
                        </form>


</html>

2 回答

  • 0

    您实际上在两个页面上使用不同的会话 .

    在您的html页面中,您可以使用将会话名称设置为“Id”

    session_name('Id');
    

    您的login.php页面使用默认会话名称,因为没有其他声明 .

    通过声明相同的会话名称或使用默认值,确保需要共享同一会话的所有页面上的会话名称相同 .

    您还可以使用自己在html页面的每个页面加载中进行新的会话

    session_regenerate_id();
    

    你也必须删除它 .

    此外,在将其添加到会话之前,必须将数据库中的用户名存储在临时变量中,因为 $row 将在您尝试将其添加到会话时 nullmysqli_fetch_assoc() 在没有更多行要提取时返回 null ) .

  • 0

    试试这段代码(改变if(password_verify)部分):

    if (password_verify($Userpassword , $storedPassword)) {
        $sql = "SELECT Username, Password FROM Users WHERE Username = '".$user."'";
        if($result = mysqli_query($conn, $sql)) {
            if (mysqli_num_rows($result) > 0) {
                while($row = mysqli_fetch_assoc($result)) {
                    $_SESSION['Id'] = $row['Username'];
                    header ("Location: 'mywebsite');
                    die();
                }
            }
        }
    }
    

相关问题