Не удается войти в PHP / MySQL

Я изменяю свой код, но я все еще не могу войти … У меня есть база данных MySQL с базой данных под названием «пользователи» с таблицей «Пользователи» и следующими строками «UserNameID», «userName» и «UserName», пароль". Я создал только запись, чтобы проверить это:

+------------+----------+-----------+ | UserNameID | userName | password | +------------+----------+-----------+ | 1 | root | pass | +------------+----------+-----------+ 

Вот мой код:

 <!DOCTYPE html> <?php session_start(); ?> <html> <head> <title>File1</title> </head> <body> <?php $DB_connection = mysqli_connect("localhost","user1","user1","users") or die("ERROR. Failed to connect to MySQL." . mysqli_error($DB_connection)); function SignIn() { $usr = $_POST['user']; $pw = $_POST['pwd']; if(!empty($usr)) { $query = mysql_query("SELECT * FROM Users where userName = '$usr' AND password = '$pw'"); $result = mysqli_query($DB_connection,$query); if($result) { while($row = mysqli_fetch_array($result)) { echo "SUCCESSFULLY LOGIN TO USER PROFILE PAGE..."; } } else { echo "SORRY... YOU ENTERD WRONG ID AND PASSWORD... PLEASE RETRY..."; } } } SignIn(); mysqli_close($DB_connection); ?> </body> </html> 

Когда я вводил неправильный пароль или имя пользователя, он дает мне « SORRY... YOU ENTERD WRONG ID AND PASSWORD... PLEASE RETRY... ». Тем не менее, это бросает мне то же самое, когда я устанавливаю правильный пароль и имя пользователя. Что не так в моем коде?

Большое спасибо!

Здесь много проблем. Есть проблемы с определением области охвата, вы используете неправильные методы, это небезопасно.

Во-первых, эти две строки:

 $query = mysql_query("SELECT * FROM Users where userName = '$usr' AND password = '$pw'"); $result = mysqli_query($DB_connection,$query); 

Это не так, как вы запрашиваете базу данных. Вам нужно только вызвать mysql_query или mysqli_query зависимости от того, какой API вы используете. В этом случае вы используете MySQLi, поэтому выполните следующие действия:

 $query = "SELECT * FROM Users where userName = '$usr' AND password = '$pw'"; $result = mysqli_query($DB_connection,$query); 

Во-вторых, ваша функция SignIn не может получить доступ к переменной $DB_connection , она выходит за рамки. Вам нужно передать его:

 function SignIn($DB_connection){ } SignIn($DB_connection); 

В-третьих, этот код очень опасен ! Никогда не используйте $_POST непосредственно в SQL-запросе. Вы никогда не должны конкатенировать переменные в строку SQL, вы должны использовать подготовленные инструкции.

 // Don't use "SELECT *", use the fields you want $query = mysqli_prepare($DB_connection, 'SELECT user_id FROM Users where userName = ? AND password = ?'); // This sends the values separately, so SQL injection is a thing of the past mysqli_stmt_bind_param($query, 'ss', $usr, $pw); // Run the query mysqli_stmt_execute($query); // Prepared statements require to define exactly the fields you want mysqli_stmt_bind_result($query, $user_id); // Get the data while(mysqli_stmt_fetch($query)){ echo $user_id; } mysqli_stmt_close($query); в // Don't use "SELECT *", use the fields you want $query = mysqli_prepare($DB_connection, 'SELECT user_id FROM Users where userName = ? AND password = ?'); // This sends the values separately, so SQL injection is a thing of the past mysqli_stmt_bind_param($query, 'ss', $usr, $pw); // Run the query mysqli_stmt_execute($query); // Prepared statements require to define exactly the fields you want mysqli_stmt_bind_result($query, $user_id); // Get the data while(mysqli_stmt_fetch($query)){ echo $user_id; } mysqli_stmt_close($query); 

Наконец, хранение паролей с открытым текстом – это плохая практика. Используйте хеширующую библиотеку. PHP 5.5+ имеет один встроенный ( http://php.net/password ). Существует также версия для меньших версий PHP ( https://github.com/ircmaxell/password_compat ).

PS Как указано в комментариях ( вот ссылка ), ваш session_start() находится в неправильном месте. Это отправляет заголовок, поэтому он требует, чтобы перед ним ничего не выходило.

 <?php session_start(); ?> <!DOCTYPE html> <html> 

Убедитесь, что перед session_start() нет пробелов (или чего-либо еще session_start() .

Ваша проблема здесь:

 $query = mysql_query("SELECT * FROM Users where userName = '$usr' AND password = '$pw'"); 

Это должно быть

 $query = "SELECT * FROM Users where userName = '$usr' AND password = '$pw'"; 

Затем вы передаете строку запроса, а не ресурс в mysqli_query .

(Также см. Ответ Шанкара Дамодарана относительно вопроса о сфере охвата: передать $DB_connection в функцию SignIn ).

В качестве побочного примечания вы не должны использовать опубликованные данные непосредственно в запросе. Вы рискуете инъекцией SQL. Посмотрите на дезинфекцию данных или, желательно, на подготовленные заявления .

Прежде всего, вы сталкиваетесь с проблемами области.

В этой строке …

  $result = mysqli_query($DB_connection,$query); 

Переменная $DB_connection недоступна внутри вашего SignIn() и, следовательно, ваш запрос становится неудачным. Также вы смешиваете функции mysql_* (устаревшие) с функциями mysqli_* .

Этот простой и маленький фрагмент кода для входа может помочь вам.

  $con = mysqli_connect("localhost","user1","user1","users") or die("ERROR. Failed to connect to MySQL." . mysqli_error($con)); $username = $_POST['username']; $password = $_POST['userpassword']; $result = mysqli_query($con,"SELECT * FROM users WHERE user_name = '$username' and user_password='$password'"); $count=mysqli_num_rows($result); // get total number of rows fetched. needs only 1 row for successful login. if($count==1){ //Login successful } else{ //Login unsuccessful } 

Он будет извлекать строку, если введенное имя пользователя и пароль совпадают. Он будет выбирать только одну строку, поскольку имя пользователя и пароль будут уникальными. Если количество строк выбрано «1», у вас может быть успешный вход в систему.