目前正在尝试为学校做一个项目,就php而言,代码很好。当我运行它时,我输入用户名和密码并单击提交按钮,但似乎没有发生任何事情,我仍然在登录页面上。
<?php
session_start();
try{
$databaseConnection = new PDO('mysql:host=127.0.0.1;dbname=mycontacts','root','');
$databaseConnection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'Error: '.$e->getMessage();
}
if(isset($_POST['login'])) {
$errMsg = '';
$username = trim($_POST['username']);
$password = trim($_POST['password']);
if ($username == ''){
$errMsg .= "You must enter your Username <br />";
}
if($password == '') {
$errMsg .= 'You must enter your Password<br>';
}
if ($errMsg == '') {
$records = $databaseConnection->prepare('SELECT id,username,password from users WHERE username = :username');
$records->bindParam(':username',$username);
$records->execute();
$results = $records->fetch(PDO::FETCH_ASSOC);
if(count($results) > 0 && password_verify($password, $results['password'])){
header('location:mainMenu.php');
exit();
}else {
$errMsg .= 'Username and Password are not found<br />';
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="CSS/main.css">
</head>
<body>
<h1>Welcome to the Contact List</h1>
<br />
<br />
<div>
<form method="post" class="submit" name="login">
<h3><u>Please login</u></h3>
<p>Username: <input type="text" name="username" maxlength="15" size="20" /> </p>
<p>Password: <input type="text" name="password" maxlength="15" size="20" /> </p>
<input type="submit" value="Submit" name="login" />
</form>
</div>
</body>
</html>
数据库名称是mycontacts 表名是用户 字段是id(主要),用户名,密码
当输入用户名和密码时,屏幕将保留在登录名中,文本框中没有任何内容,查询时也没有任何错误。
答案 0 :(得分:4)
“id int(4)username varchar(20)password varchar(20)”
有你的问题。 (也请查阅我的脚注)。
MySQL无声地失败,因为密码列的长度不足以容纳哈希值。
从password_hash()
函数生成的哈希值为60个字符长,即 IF ,实际上您使用该函数创建哈希值。
将它增加到60并重新开始(Nota:手册建议255)。含义,清除密码,生成新密码并重新登录。
http://php.net/manual/en/function.password-hash.php
PASSWORD_DEFAULT - 使用bcrypt算法(默认自PHP 5.5.0起)。请注意,此常量旨在随着时间的推移而变化,因为新的和更强大的算法被添加到PHP中。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在数据库列中,该列可以扩展到 60个字符(255个字符将是一个不错的选择)。
PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH算法创建哈希。这将使用“$ 2y $”标识符生成标准的crypt()兼容哈希。结果将始终为 60个字符的字符串,或者在失败时为FALSE。
<强>脚注:强>
还要确保在标题之前没有输出。 <?php
标记之前的那些空格会导致这种情况并阻止您的代码执行,并且应该是任何其他后续文件(例如您用于标题的文件)的情况。因此,您需要在<?php
代码之前删除这些空格。
请参阅Stack上的以下内容:
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:只应在暂存时进行显示错误,而不是生产。
如评论中所述:您没有回复$errMsg
,但这不会导致您的代码无法正确重定向或执行。
如果您使用的是未显示的JS / Ajax,则需要对其进行排序。
您的表单和提交按钮也有重复的名称属性name="login"
。从name="login"
移除<form>
,这可能会有冲突。
您还可以查看ircmaxell的答案: