Система входа в PHP-MySQL

Это первый раз, когда я использую 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); } ?> 

Solutions Collecting From Web of "Система входа в PHP-MySQL"

Во-первых, я должен указать, что ваш код сильно подвержен 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 }