这是我的代码:
<?php
try {
$connection = new PDO("mysql:host=localhost;dbname=tp1-2015_groep2", "utp1-2015_groep2", "bB5HvUC7MV7mqpWp");
$connection->query("SET NAMES utf8");
echo "<p id='popupg'>Heeft u al een account? U kunt nu inloggen!</p>";
} catch (PDOException $exception) {
echo "<p id='popupr'>U bent NIET verbonden! Probeer alstublieft opnieuw te verbinden!</p>";
exit;
}
function hashedPassword($username, $password) {
return hash ("sha512", $username.$password);
}
//zodra het login knop ingedrukt wordt..
if(isset($_POST['login'])){
//Verkrijg de info binnen van onze formulier
$username = $_POST['username'];
$password = $_POST['password'];
//Haal de geselecteerde velden op
$sql = $connection->prepare ("SELECT id, username, password FROM gebruikersgegevens WHERE username = :username AND password = :password");
$passwordHash = hashedPassword($username, $password);
//Koppel de onderstaande waarden aan elkaar
$sql->bindValue(':username', $username, PDO::PARAM_STR);
$sql->bindValue(':password', $passwordHash, PDO::PARAM_STR);
//Voer het voorbereidde query uit
$sql->execute();
if ($sql->execute()) {
//Haal rij op..
$sql->fetch();
//kijken of de rijen kloppen..
$count = $sql->rowCount();
if ($count !== 0) {
//Zodra count "true" geeft, vergelijk wachtwoorden..
$validPassword = password_verify($password, $user['password']);
if ($validPassword) {
//Bied de gebruiker een login sessie aan.
$_SESSION['user_id'] = $user['id'];
$_SESSION['logged_in'] = time();
$_SESSION['username'] = $_POST['username'];
//Stuurt de gebruiker door naar het onderstaande link..
header('Location: index.php');
exit;
} else {
die('<p id="popupr">Het verifiëren is fout gegaan!</p>');
}
} else {
//een tijdelijke error oplossing!
echo '<p id="popupr">De combinatie van wachtwoord en gebruikersnaam klopt niet!</p>';
}
}
}
我必须为学校制作一个博客,您需要能够注册和登录。但是登录页面实际上不起作用。找不到错误。我尝试了很多方法,但没有任何效果。它总是说登录的组合是错误的。我已经想到哪里出了问题,但我找不到哪里出了问题。这是验证密码的地方。
你在做双重工作。首先,您从表中检索与username
和password
匹配的行,然后您将使用不同哈希方法哈希的密码与哈希密码进行比较。稍后您将访问尚未设置的$user
(您正在使用$sql->fetch()
而不将结果分配给变量)。
你也有双$sql->execute()
.这(如果它返回 false)意味着查询出了问题,而不是没有任何行。
请尝试以下操作,
<?php
session_start();
if(isset($_POST['login'])){
//Verkrijg de info binnen van onze formulier
$username = $_POST['username'];
$password = $_POST['password'];
//Haal de geselecteerde velden op
$sql = $connection->prepare ("SELECT id, username, password FROM gebruikersgegevens WHERE username = :username AND password = :password");
$passwordHash = hashedPassword($username, $password);
//Koppel de onderstaande waarden aan elkaar
$sql->bindValue(':username', $username, PDO::PARAM_STR);
$sql->bindValue(':password', $passwordHash, PDO::PARAM_STR);
//Voer het voorbereidde query uit
if ($sql->execute()) {
//Haal rij op.. (En sla op in $user)
$user = $sql->fetch();
//kijken of de rijen kloppen..
$count = $sql->rowCount();
if ($count > 0) {
//Bied de gebruiker een login sessie aan.
$_SESSION['user_id'] = $user['id'];
$_SESSION['logged_in'] = time();
$_SESSION['username'] = $_POST['username'];
//Stuurt de gebruiker door naar het onderstaande link..
header('Location: index.php');
exit;
} else {
die('<p id="popupr">Het verifiëren is fout gegaan!</p>');
}
} else {
//een tijdelijke error oplossing!
// Je komt alleen hier als de query mislukt is (fout in de query of database).
echo '<p id="popupr">De combinatie van wachtwoord en gebruikersnaam klopt niet!</p>';
}
}
您使用password_verify()
来验证密码,但您可以使用hash()
函数生成哈希。尝试将hash()
更改为 password_hash()
。请参阅 password_verify() 文档。 password_hash()
使用 crypt()
生成密码,请参阅password_hash文档。