Я хочу, чтобы мой код проверял, существуют ли имя пользователя и пароль в моей базе данных. Он работает жестко, но я хочу сделать это с помощью базы данных. Теперь это то, что у меня есть:
if(isset($_POST["name"], $_POST["password"])) { $name = $_POST["name"]; $password = $_POST["password"]; $result1 = mysql_query("SELECT password FROM Users WHERE username = '".$name."'"); $result2 = mysql_query("SELECT username FROM Users WHERE password = '".$password."'"); if($name == $result2 && $password == $result1) { $_SESSION["logged_in"] = true; $_SESSION["naam"] = $name; } else { echo'The username or password are incorrect!'; } }
Проблема в том, что result1/2
я думаю, потому что, когда я использую правильное имя пользователя и пароль на своем сайте, он дает неверное сообщение.
О да, и запрос работает тоже, попробовал его в PHPmyAdmin, но затем без имени $name
который я заменил его именем пользователя
Вы можете использовать mysql_num_rows()
и объединить свой запрос – см. Сноски
if(isset($_POST["name"], $_POST["password"])) { $name = $_POST["name"]; $password = $_POST["password"]; $result1 = mysql_query("SELECT username, password FROM Users WHERE username = '".$name."' AND password = '".$password."'"); if(mysql_num_rows($result1) > 0 ) { $_SESSION["logged_in"] = true; $_SESSION["naam"] = $name; } else { echo 'The username or password are incorrect!'; } }
Чтобы сделать ваш настоящий код более безопасным, используйте:
$name = stripslashes($_POST["name"]); $name = mysql_real_escape_string($_POST["name"]); $password = stripslashes$_POST["password"]); $password = mysql_real_escape_string$_POST["password"]);
но посмотрите на ссылки ниже, используя подготовленные заявления и хеширование паролей.
Примечания:
Ваш существующий код открыт для SQL-инъекции . Используйте подготовленные заявления или PDO с подготовленными заявлениями . Посетите эти ссылки для получения дополнительной информации.
Я заметил, что вы можете хранить пароли в текстовом виде. Если это так, то оно очень обескуражено.
Если вы и это сайт LIVE, вы, в конце концов, будете взломаны.
Я рекомендовал вам использовать функцию CRYPT_BLOWFISH или PHP 5.5's password_hash()
. Для PHP <5.5 используйте password_hash() compatibility pack
.
mysql_*
уведомление об mysql_*
функций:
http://www.php.net/manual/en/intro.mysql.php
Это расширение устарело с PHP 5.5.0 и не рекомендуется для написания нового кода, поскольку оно будет удалено в будущем. Вместо этого следует использовать расширение mysqli или PDO_MySQL . См. Также Обзор API MySQL для получения дополнительной информации при выборе API MySQL.
Эти функции позволяют вам обращаться к серверам баз данных MySQL. Более подробную информацию о MySQL можно найти на странице http://www.mysql.com/ .
Документацию по MySQL можно найти по адресу http://dev.mysql.com/doc/ .
Изменить: чтобы помочь OP (просмотрите ссылки, которые я предоставил относительно хэширования паролей).
Попробуйте заменить
if(mysql_num_rows($result1) > 0 ) { $_SESSION["logged_in"] = true; $_SESSION["naam"] = $name; } else { echo 'The username or password are incorrect!'; }
с:
while($row=mysql_fetch_assoc($result1)) { $check_username=$row['username']; $check_password=$row['password']; } if($username == $check_username && $password == $check_password){ echo "Matches."; } else{ echo "No match."; }
вwhile($row=mysql_fetch_assoc($result1)) { $check_username=$row['username']; $check_password=$row['password']; } if($username == $check_username && $password == $check_password){ echo "Matches."; } else{ echo "No match."; }
$name
и $password
, вероятно, являются строками. Если ваши запросы пройдут и завершится правильно, они будут возвращены как объекты.
Чтобы это сработало, вам просто нужно удалить $name ==
и $password ==
из условия if()
!
Вы можете также объединить эти запросы для простоты.
<?php $result = mysql_query("SELECT username, password FROM Users WHERE username = '".$name."' && password = '".$password."'"); if ($result && mysql_num_rows($result) > 0) { // Login } else { // Failed! }
Это выполнит то же самое, если вы не заботитесь о том, какой из них потерпел неудачу.