- 编辑 -
发现了这个问题。感谢Conyc。 我想我发现了这个问题。当没有剩余的行要读取时,mysqli_fetch_assoc($ result)返回null。这意味着当您尝试将用户名放入$ _SESSION [' Id'] = $ row ['用户名']时的会话时,$ row将为null;尝试将用户名存储在变量中,就像使用密码一样。 - Conyc 12分钟前
目前正尝试通过登录来显示内容。我正在使用会话和散列密码。我不能为我的生活弄清楚为什么它没有显示我登录"#34;登录"。 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>
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>
Sign Out
</button>
</form>
</html>
答案 0 :(得分: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();
}
}
}
}
答案 1 :(得分:0)
您实际上在两个页面上使用了不同的会话。
在您的html页面中,您使用
将会话名称设置为“Id”session_name('Id');
虽然您的login.php页面使用默认会话名称,因为没有其他声明。
通过声明相同的会话名称或使用默认值,确保所有需要共享同一会话的页面上的会话名称相同。
您还可以使用
将自己置于html页面每个页面加载的新会话中session_regenerate_id();
您也必须删除它。
此外,在将数据库添加到会话之前,必须将数据库中的用户名存储在临时变量中,因为当您尝试将其添加到会话时$row
将为null
({当没有更多要获取的行时,{1}}返回mysqli_fetch_assoc()
。