Это первый раз, когда я использую PHP и MySQL для создания системы входа, в которой человек может ввести имя пользователя и пароль, а скрипты php проверяют, существует ли в базе данных имя пользователя и пароль.
Когда пользователь вводит правильную информацию, он отображает сообщение «УСПЕШНО ВХОД В ПОЛЬЗОВАТЕЛЮ ПРОФИЛЬ …», которое все хорошо. Но если пользователь вводит неверную информацию, появляется сообщение «ИЗВЛЕЧЕН … ВЫ ВХОДИЛИ НЕПРАВИЛЬНЫЙ И И ПАРОЛЬ … ПОЖАЛУЙСТА, ВОЗВРАЩАЙТЕ …», но страница пустая. Почему это?
<?php define('DB_HOST','localhost'); define('DB_NAME','test'); //name of database define('DB_USER','root'); //mysql user define('DB_PASSWORD',''); //mysql password $con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die(mysqli_connect_error()); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); } $db = mysqli_select_db($con,DB_NAME) or die(mysqli_connect_error()); /* $ID = $_POST['user']; $Password = $_POST['pass']; */ function SignIn(mysqli $con){ session_start(); //starting the session for user profile page if(!empty($_POST['user'])){ //checing the 'user' name which is from Sign-in.html, is it empty or have some text $query = mysqli_query($con,"SELECT * FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysqli_connect_error()); $row = mysqli_fetch_array($query) or die(mysql_error()); if(!empty($row['userName']) AND !empty($row['pass'])){ $_SESSION['userName'] = $row['pass']; echo "SUCCESSFULLY LOGIN TO USER PROFILE PAGE..."; } else{ echo "SORRY...YOU ENTERED WRONG ID AND PASSWORD...PLEASE RETRY..."; } } } if(isset($_POST['submit'])){ SignIn($con); } ?>
Во-первых, я должен указать, что ваш код сильно подвержен SQL-инъекции <= читать, что , не говоря уже о хранении паролей в тексте, который сильно обескуражен.
Не храните пароли в текстовом виде, вы в конечном итоге будете взломаны.
Проконсультируйтесь со своими сносками обо всем вышеперечисленном, касающемся инъекций и хранения паролей.
Вы также смешиваете MySQL API с mysql_error()
который не смешивается с функциями mysqli_
. Это должен быть mysqli_error($con)
.
Теперь ваш код не работает из-за этой строки:
if(!empty($row['userName']) AND !empty($row['pass']))
Даже если человек вводит неправильное или неистовое имя пользователя и / или пароль, он все равно останется ИСТИННЫМ, потому что эти строки НЕ пусты.
Поэтому он никогда не попадает в else
часть вашего скрипта.
Чтобы начать работу, вот что вам нужно сделать:
Заменить:
if(!empty($row['userName']) AND !empty($row['pass']))
с:
$row = mysqli_fetch_array($query); $username = $row['userName']; $pw = $row['pass']; if($user==$username && $pass==$pw) { // $user and $pass are from POST // $username and $pw are from the rows $_SESSION['userName'] = $row['pass']; echo "Successfully logged in."; } else { echo "Invalid."; }
При использовании следующих функций SignIn()
:
$user = mysqli_real_escape_string($con,$_POST['user']); $pass = mysqli_real_escape_string($con,$_POST['pass']);
и заменив ваш запрос:
$query = mysqli_query($con,"SELECT * FROM UserName where userName = '$user' AND pass = '$pass'") or die(mysqli_connect_error());
Примечания:
Для хранения паролей используйте функцию password_hash()
CRYPT_BLOWFISH или PHP 5.5.
Для PHP <5.5 используйте password_hash() compatibility pack
.
Кроме того, что касается SQL-инъекций, используйте mysqli
с подготовленными операторами или PDO с подготовленными операторами , они намного безопаснее .
Редактировать:
О да, а также я изменил свой код на ваш, но теперь каждый раз, когда я вхожу в систему, он отображает Invalid, даже с правильным именем пользователя и паролем. Любые идеи? Кажется, что это ошибка в случае if ($ user == $ username && $ pass == $ pw) if.
Вот что я использовал для проверки, вы можете заменить учетные данные БД своими собственными и другими настройками, так как я не использовал форму, а жестко закодированные значения.
На самом деле это произошло, если был введен неверный пароль пользователя / пароль.
<?php $DB_HOST = 'xxx'; $DB_USER = 'xxx'; $DB_PASS = 'xxx'; $DB_NAME = 'xxx'; $con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME) or die(mysqli_connect_error()); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); } function SignIn($con){ $_POST['user'] = "John"; $user = $_POST['user']; $_POST['pass'] = "12345"; $pass = $_POST['pass']; // session_start(); //starting the session for user profile page if(isset($_POST['user'])){ $query = mysqli_query($con,"SELECT * FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysqli_connect_error()); $row = mysqli_fetch_array($query); $username = $row['userName']; $pw = $row['pass']; if($user==$username && $pass==$pw) { echo "Successfully logged in."; } else { echo "Invalid"; } } // brace for isset post user } // brace for function if(isset($_POST['submit'])){ echo SignIn($con); } ?>
Прежде чем ответить на ваш вопрос, я бы рекомендовал вам использовать mysqli_real_escape_string()
для имени пользователя и пароля. Вы можете использовать PDO
который делает все это для вас и, на мой взгляд, меньше работает.
Проблема заключается в том, что вы забыли добавить еще один блок в первый оператор if.
if(!empty($_POST['user'])) { // first block if(!empty($row['userName']) AND !empty($row['pass'])) { // first inner block } else { } } else { // this else is what your missing }