Я изменяю свой код, но я все еще не могу войти … У меня есть база данных 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», у вас может быть успешный вход в систему.