Я создаю систему входа в систему для моего сайта с использованием базы данных MySQL.
Когда пользователь регистрируется, он сохраняет пароль в базе данных, используя:
$password = hash("sha512","somesalt".$password."moresalt");
Затем, когда я вхожу в систему, я сравниваю введенный пароль с паролем в базе данных, используя ту же хеш-функцию.
Для сравнения базы данных я использую это:
$query = mysql_query("select * from users where password='$password' AND email='$email'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {//do login stuff}
Но ряды всегда возвращают 0. Когда я удаляю хеш-функцию как из регистра, так и из логина, она нормально регистрируется. В чем дело?
В качестве дополнительного примечания на случай, если кому-то интересно, я бы использовал mysqli, но версия базы данных моего веб-хостинга устарела. Они используют 5.2, я считаю.
Я забыл упомянуть, что проверил, чтобы убедиться, что база данных соответствует тому, что она получала, как видно на этих фотографиях (не может вставлять фотографии, поэтому ссылки):
https://drive.google.com/file/d/0B_u6weYp5wTCQng5eVhTSkZFRDg/view?usp=sharing
https://drive.google.com/file/d/0B_u6weYp5wTCQVRXTkNqdzhWUFE/view?usp=sharing
какова длина вашего поля пароля в базе данных ???
Мне кажется, что причина в том, что длина хешированного пароля слишком велика, и при сохранении в часть базы данных он или сбрасывается …
Тогда при сравнении вы получите 0 строк …
Хорошо, я хотел бы предложить использовать подготовленные операторы, отличные от библиотеки mysql. Это гораздо безопаснее и надежнее.
$query = "SELECT * FROM `users` WHERE AND `email`=:email_token";
Затем вы готовите и выполняете свой запрос
$data = $connection->prepare($query);
try {
$data->bindParam(":email_token",$_POST["email"],PDO::PARAM_STR);
$data->execute();
}
$result = $data->fetch(PDO::FETCH_ASSOC);
while($row = $result) {
$out = $row["password"];
}
if($out == $_POST["password"]) {
//loggin
} else {
//get lost
}
Это очень простая структура, но, по сути, вы хотите сначала извлечь пароль из базы данных, а затем сравнить строки вместо того, чтобы делать все это с вашим запросом.