为什么我的登录系统不工作?
Why is my Log in System not working?
我创建了一个系统,允许管理员使用电子邮件地址和密码注册另一个管理员以登录受保护区域。管理员通过此表单注册:
<form action="adduser.php" method="POST">
<label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" />
<label for="password">Password: </label><input type="password" name="password" />
<label for="name">Name: </label><input type="text" name="name"/>
<input type="submit" value="Submit" name="submit"/>
</form>
adduser.php 看起来像这样:
<?php
require'databaselogin.php';
if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){
$result= $pdo->prepare('INSERT INTO users (emailaddress, password, name )
VALUES(:emailaddress, :password, :name)');
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
unset($_POST['submit']);
$_POST['password'] = $hash;
$result->execute($_POST);
header("Location:admin.php");
}
?>
到这里似乎工作 table 调用的用户然后填充数据。我猜它可能使用 $hash 不正确,而不是存储在 table 中的密码不是用户在密码字段中输入的密码?
当用户尝试使用此表单登录时:
<form action="login.php" method="POST" >
<label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/>
<label for="password">Password:</label><input type="password" name="password"/>
<input type="submit" value="Go" name="submit"/>
</form>
链接到此 php:
<?php
session_start();
require'databaselogin.php';
$stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress');
if(isset($_POST['submit'])){
$criteria = [
'emailaddress' => $_POST['emailaddress'],
];
$stmt->execute($criteria);
$user = $stmt->fetch();
var_dump($user);
if (password_verify($_POST['password'], $user['password'])) {
$_SESSION['loggedin'] = $user['id'];
header("Location:admin.php");
}
else {
header("Location:index.php");
}
}
?>
在从网站注册时输入正确的电子邮件和密码后,只需在 index.php 重新加载,而不是将它们带到 admin.php。我真的无法理解这里的问题,因为代码看起来太像我了,我猜这是 $hash 实际保存到密码字段的问题。
如果有人可以提供帮助,我们将不胜感激!
由于您没有回复评论,我将提交以下内容。
我怀疑你的密码栏太短了。
如果是这样,您需要将其设置为60+。因此,更改您的列,清除包含哈希的密码行,创建一个新的哈希并重试。
这方面的手册:
PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).
- MySQL 如果太短会无声地失败。我以前见过很多次。
补充说明:
最好在每个header之后使用exit;
,否则你的代码可能要继续执行。
if (password_verify($_POST['password'], $user['password'])) {
$_SESSION['loggedin'] = $user['id'];
header("Location:admin.php");
exit;
}
else {
header("Location:index.php");
exit;
}
我创建了一个系统,允许管理员使用电子邮件地址和密码注册另一个管理员以登录受保护区域。管理员通过此表单注册:
<form action="adduser.php" method="POST">
<label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" />
<label for="password">Password: </label><input type="password" name="password" />
<label for="name">Name: </label><input type="text" name="name"/>
<input type="submit" value="Submit" name="submit"/>
</form>
adduser.php 看起来像这样:
<?php
require'databaselogin.php';
if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){
$result= $pdo->prepare('INSERT INTO users (emailaddress, password, name )
VALUES(:emailaddress, :password, :name)');
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
unset($_POST['submit']);
$_POST['password'] = $hash;
$result->execute($_POST);
header("Location:admin.php");
}
?>
到这里似乎工作 table 调用的用户然后填充数据。我猜它可能使用 $hash 不正确,而不是存储在 table 中的密码不是用户在密码字段中输入的密码?
当用户尝试使用此表单登录时:
<form action="login.php" method="POST" >
<label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/>
<label for="password">Password:</label><input type="password" name="password"/>
<input type="submit" value="Go" name="submit"/>
</form>
链接到此 php:
<?php
session_start();
require'databaselogin.php';
$stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress');
if(isset($_POST['submit'])){
$criteria = [
'emailaddress' => $_POST['emailaddress'],
];
$stmt->execute($criteria);
$user = $stmt->fetch();
var_dump($user);
if (password_verify($_POST['password'], $user['password'])) {
$_SESSION['loggedin'] = $user['id'];
header("Location:admin.php");
}
else {
header("Location:index.php");
}
}
?>
在从网站注册时输入正确的电子邮件和密码后,只需在 index.php 重新加载,而不是将它们带到 admin.php。我真的无法理解这里的问题,因为代码看起来太像我了,我猜这是 $hash 实际保存到密码字段的问题。
如果有人可以提供帮助,我们将不胜感激!
由于您没有回复评论,我将提交以下内容。
我怀疑你的密码栏太短了。
如果是这样,您需要将其设置为60+。因此,更改您的列,清除包含哈希的密码行,创建一个新的哈希并重试。
这方面的手册:
PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).
- MySQL 如果太短会无声地失败。我以前见过很多次。
补充说明:
最好在每个header之后使用exit;
,否则你的代码可能要继续执行。
if (password_verify($_POST['password'], $user['password'])) {
$_SESSION['loggedin'] = $user['id'];
header("Location:admin.php");
exit;
}
else {
header("Location:index.php");
exit;
}