@Павел Голубцов, то что идентификатор не нужен это правильно. Пользователь чаще всего его вообще не знает. Но вот "проверка", явно указывает на непонимание принципов обработки запросов к базе данных.
Дичь полная, конкретно на мое предложение решения вопроса комментарии оставляй а не книги кидай по sql. Я дал ответ на конкретный вопрос, что тебе не нравится?
Внимательно читай, у тебя дичь полная https://php.ru/forum/threads/sravnit-dannye-php-mysql.77084/#post-600719
SELECT `login`, `pass` FROM `user` WHERE login = '$slogin' AND pass = '$spass' он либо найдет эти данные: true или не найдет: false Дан ответ на вопрос человека! Какие задачи вы себе поставили, это знаете только вы, формулируйте вопрос, задачу, будем обсуждать. И ответ был похожий оказывается который устроил человека, тема закрыта.
Я долго смотрел смотрел, ладно вмешаюсь. @Павел Голубцов Что хотят сказать профессионалы своего дела: Например обычно логин человека известен, это почта, или как на этом форуме логин видно всем. Например логин такой: PHP: $slogin = 'Павел Голубцов'; Пароль я конечно же не знаю, но вы например в проверке пароля написали такой код: PHP: $result = mysql_query("SELECT `login`, `pass` FROM `user` WHERE login = '$slogin' AND pass = '$spass'"); Я например прочитав книгу хацкеров для чайников, пишу запрос, где отправляю пароль как случайно генерируемое строку, делаю так чтобы он отправлялся на сервер раз 0,1 секунду. И пишу, что если сервер вернет true то отобразить отправленный пароль. Ухожу пить чай, когда приду у меня возможно будет пароль человека. Вот и люди хотят сказать что так не делается. Но, есть одно большое но. Они и не пишут готовый правильный код. Потому что искренне считают что человек должен сам найти и разобраться. Так вот я с этим не согласен. Нужно давать готовый код, ибо это форум для этого и созданный. Если человеку не помочь тут, он пойдет дальше искать окей гугл, и таки наткнется на готовый код, возможно не правильный. Но это имхо мое мнение. А такая проверка пользователя да не правильная. Но я дать правильный ответ не смог. Поэтому написал так: https://google.gik-team.com/?q=php+правильная+проверка+логина+и+пароля попал первой ссылкой сюда: https://php.ru/forum/threads/proverka-logina-i-parolja.3666/ вижу что там тоже бардак, иду дальше: https://ru.stackoverflow.com/questions/28785/Проверка-Логина-и-Пароля вижу что там древний ответ с устаревшими функциями, и ищу дальше: https://habr.com/ru/post/323714/ https://true-coder.ru/php/pishem-avtorizaciyu-na-php.html @MouseZver @Valick товарищи профессионалы вы поняли суть? Человек пошел дальше искать готовый код, и смотрите на что он натыкается. Не ужели так трудно написать правильный готовый код. Особенно если учесть что первые запросы от гугла дают какую то ахинею?
@Павел Голубцов, в обоих случаях $result будет true и не важно будут совпадения логина и пароля или нет, false случиться, только если сам запрос будет с ошибкой. А вот mysqli_num_rows вернёт ноль если совпадений логина и пароля в БД нет или вернёт количество совпадений если они есть, поскольку поле логин должно быть уникальным, то запрос вернёт либо ноль если совпадений нет, либо единицу если логин пароль совпали. --- Добавлено --- не трудно, но сильно скучно, а если мне станет совсем скучно, то я уйду с форума, и завтра некому будет давать даже наводящие ответы я конечно сильно утрирую и я далеко не один на этом форуме но надеюсь суть ясна. отвечаю так как считаю нужным и самое главное я уже это говорил, что обучается не тот кто спрашивает на форуме, а тот кто отвечает, поэтому все мои ответы больше расчитаны на таких как ты, а не на таких как ТС не пиши больше такое никогда
Пишу, на минуту хватает, лень PHP: <?php error_reporting ( E_ALL ); use Aero\Supports\Lerma; session_start (); require 'autoload.php'; if ( ) { } elseif ( filter_input ( INPUT_SERVER, 'REQUEST_METHOD' ) == 'POST' ) { }
Приведенный к ассоциативному массиву, к примеру (в других случаях не уверен точно и проверять лень), $result будет при успехе true и противоположно false, это факт. Artur_hopf Потому что искренне считают что человек должен сам найти и разобраться. Да я так и писал ответ, потому что сам пользуюсь PDO, sql вымер, осталось sqli или PDO, но сами запросы они идентичны. Artur_hopf Я например прочитав книгу хацкеров для чайников, пишу запрос, где отправляю пароль как случайно генерируемое строку, делаю так чтобы он отправлялся на сервер раз 0,1 секунду. И пишу, что если сервер вернет true то отобразить отправленный пароль. Ухожу пить чай, когда приду у меня возможно будет пароль человека. После 5 попыток не удачных забанить на 5 минут, после 10 на час, и т.д. И будешь пить чай лет 100.
array(0) { } если найдено: array(1){ и т. д. и эти значения соответствуют для условия if как false и true
@Artur_hopf, надо не только читать, но и понимать что там написано)) Есть у меня и про хацкеров книги))
с какого перепугу у тебя mysqli_query возвращает массив ? спустись на землю и читай документацию внимательно. --- Добавлено --- у меня сейчас стул расплавится
... --- Добавлено --- сказочник --- Добавлено --- https://www.php.net/manual/ru/mysqli.query.php читай возвращаемые значения --- Добавлено --- МЫ ВЕДЕМ ДИАЛОГ О ФУНКЦИИ mysqli_query какого рака приписываешь result --- Добавлено --- я теперь понимаю, почему в программирование рекомендовано брать до 25 лет (включ) людей
Я писал что не пользуюсь sqli и просто нашел похожее с PDO. А в PDO не все скопировалось полностью будет выглядеть так: PHP: $result = $sth -> fetchAll(PDO::FETCH_ASSOC); ассоциативный массив. А $result тут часть метода query, Class Database.
на ошибки не проверял, но красиво смотрится PHP: <?php if(isset($_POST['submit'])){ $servername = "localhost"; $dbusername = "my_user"; $dbpassword = "my_password"; $dbname = "dbname"; $conn = mysqli_connect($servername, $dbusername, $dbpassword, $dbname); if(!$conn){ die("Ошибка соединения: ".mysqli_connect_error()); } $slogin = $_POST['log']; $spass = $_POST['pasl']; if(emptu($slogin) || emptu($spass)){ header("Location index.php?error=Отсутствует логин или пароль"); exit(); }else{ $sql = "SELECT * FROM user WHERE login=?;"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ header("Location index.php?error=Ошибка запроса"); exit(); }else{ mysqli_stmt_bind_param($stmt, "s", $slogin); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if($row = mysqli_fetch_assoc()){ $spassCheck = password_verify($spass, $row['pass']); if($spassCheck === false){ header("Location index.php"); exit(); }else if($spassCheck === true){ //миссия выполнена } } } } }else{ header("Location index.php"); exit(); } свиснуто отсюда:
Спойлер: немножко кода для размышления PHP: <?php // Включаем отображение ошибок в браузере error_reporting(E_ALL); ini_set('display_errors', 'On'); // Параметры подключения к базе данных define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); define('DB_NAME', 'phpforum'); // Функция подключения к базе данных // можно вынести в отдельный файл вместе с параметрами подключения // и подключать в скриптахпри помощи require_once function connectDB(){ $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if(!$conn){ echo 'Невозможно подключиться к серверу базы данных <br />'; die(mysqli_error()); }else{ $query = $conn->query('set names utf8'); if(!$query){ echo 'Невозможно установить кодировку подключения к базе данных'; die(mysqli_error()); }else{ return $conn; } } } // Функция инициализации таблицы // $rdb - указатель ресурса соединения с базой данных function iniTable($rdb){ mysqli_query($rdb, "CREATE TABLE IF NOT EXISTS `user` ( `u_id` INT(11) NOT NULL AUTO_INCREMENT , `u_login` VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `u_pass` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , PRIMARY KEY (`u_id`), UNIQUE KEY `u_login` (`u_login`)) ENGINE = InnoDB;") or die ("Ошибка создания таблицы: ".mysqli_error()); mysqli_query($rdb, "TRUNCATE TABLE `user`") or die ("Ошибка очистки таблицы: ".mysqli_error()); mysqli_query($rdb, "INSERT INTO `user` (`u_login`, `u_pass`) VALUES ('admin', '".md5('admin')."')") or die ("Ошибка добавления данных в таблицу: ".mysqli_error()); header("Location: ".$_SERVER['PHP_SELF']); } // Инициализируем переменные сообщений и тела запроса $message = array(); $query = ''; // Устанавливаем соединение с базой данных $link = connectDB(); // Обработка переменной инициализации таблицы if(isset($_GET['ini'])){ iniTable($link); } // Если нажата кнопка вход if(isset($_GET['go'])){ $login = (isset($_GET['login']) && !empty($_GET['login'])) ? mysqli_real_escape_string($link, $_GET['login']) : false; $password = (isset($_GET['password']) && !empty($_GET['password'])) ? mysqli_real_escape_string($link, $_GET['password']) : false; if($login && $password){ // Собираем запрос к базе данных $query = "SELECT * FROM `user` WHERE `u_login` = '$login' AND `u_pass` = '" . md5($password) . "'"; $message[] = 'Запрос: ' . $query; $result = mysqli_query($link, $query); if($result){ $message[] = '$result = true Запрос успешно обработан'; if(mysqli_num_rows($result) == 1){ $message[] = 'Логин и пароль совпали'; }else{ $message[] = 'Логин и пароль не совпали'; } }else{ $message[] = '$result = false Ошибка выполнения запроса: ' . mysqli_error($link); } } else { $message[] = 'Введите логин и пароль'; } } // Закрываем соединение с базой данных mysqli_close($link); ?> <!DOCTYPE html> <html> <head> <meta charset='UTF-8' /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container"> <hr /> <div class="row"> <div class="col-md"> <small> <h5>Отладочная информация</h5> <hr /> <h6 class ="table-danger">Массив $_GET <?php echo 'count ('.count($_GET).')';?></h6> <pre><?php print_r($_GET);?></pre> <hr /> </small> </div> <div class="col-md-9"> <?php if($message) echo '<div style="color: red"><p>' . implode('</p><p>',$message) . '</p></div>';?> <div style="text-align: right"><h1>Авторизация</h1></div> <form action="" method="GET"> <p style="text-align: right">Логин: <input type="text" name="login" value=""></p> <p style="text-align: right">Пароль: <input type="password" name="password" value=""></p> <p style="text-align: right"><input type="submit" name="go" value=" Вход "></p> </form> <hr /> <div><h5><a href="?ini=1">Создать и заполнить таблицу</a> (логин admin пароль admin)</h5></div> </div> </div> <hr /> </div> </body> </html>
@Павел Голубцов, не правильный, к тому же. Если в твоём случае $result не null, это всего лишь означает, что запрос правильный, а не что он вернул результат. К тому же, нет экранирования.
я вас сейчас всех ... за говнокод --- Добавлено --- set_charset( ... ) --- Добавлено --- Замечание: Это предпочтительный способ задания набора символов. Использование для этих целей функции mysqli_query() (например SET NAMES utf8) не рекомендуется.
Mля, скатились до киберфорума, даже ниже... Ламеры, не научившиеся читать описание ф-ций, толкают свою мыслЮ. Хотя бы тему с начала прочитайте, а то у меня уже дежавю
Ага, особенно emptu. Тебе сколько раз нужно написать, что результат нужно отдельно проверять, чтобы ты понял? В заголовках нужно вручную urlencode'ть, это тебе даже не контент, где за тебя это может сделать браузер (а может и не сделать). Предопределенные сообщения можно кодировать номерами. А то фиг знает, какая там защита от подкладывания ХЗ какого текста. --- Добавлено --- Location: /... А еще лучше полноформатный абс. адрес. Так этот заголовок будет макс-но совместимым.
Спойлер: поправил чарсет PHP: <?php error_reporting(E_ALL); ini_set('display_errors', 'On'); header('Content-Type: text/html; charset=utf-8'); // Параметры подключения к базе данных define('DB_HOST', 'localhost'); define('DB_USER', 'mysql'); define('DB_PASSWORD', 'mysql'); define('DB_NAME', 'test'); // Функция подключения к базе данных // можно вынести в отдельный файл вместе с параметрами подключения // и подключать в скриптахпри помощи require_once function connectDB(){ $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if(!$conn){ echo 'Невозможно подключиться к серверу базы данных <br />'; die(mysqli_error($conn)); }else{ $query = $conn->set_charset("utf8"); if(!$query){ echo 'Невозможно установить кодировку подключения к базе данных'; die(mysqli_error($conn)); }else{ return $conn; } } } // Функция инициализации таблицы // $rdb - указатель ресурса соединения с базой данных function iniTable($rdb){ mysqli_query($rdb, "CREATE TABLE `user` ( `u_id` INT(11) NOT NULL AUTO_INCREMENT , `u_login` VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `u_pass` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , PRIMARY KEY (`u_id`), UNIQUE KEY `u_login` (`u_login`)) ENGINE = InnoDB;") or die ("Ошибка создания таблицы: ".mysqli_error($rdb)); mysqli_query($rdb, "TRUNCATE TABLE `user`") or die ("Ошибка очистки таблицы: ".mysqli_error($rdb)); mysqli_query($rdb, "INSERT INTO `user` (`u_login`, `u_pass`) VALUES ('admin', '".md5('admin')."')") or die ("Ошибка добавления данных в таблицу: ".mysqli_error($rdb)); header("Location: ".$_SERVER['PHP_SELF']); } // Инициализируем переменные сообщений и тела запроса $message = array(); $query = ''; // Устанавливаем соединение с базой данных $link = connectDB(); // Обработка переменной инициализации таблицы if(isset($_GET['ini'])){ iniTable($link); } // Если нажата кнопка вход if(isset($_GET['go'])){ $login = (isset($_GET['login']) && !empty($_GET['login'])) ? mysqli_real_escape_string($link, $_GET['login']) : false; $password = (isset($_GET['password']) && !empty($_GET['password'])) ? mysqli_real_escape_string($link, $_GET['password']) : false; if($login && $password){ // Собираем запрос к базе данных $query = "SELECT * FROM `user` WHERE `u_login` = '$login' AND `u_pass` = '" . md5($password) . "'"; $message[] = 'Запрос: ' . $query; $result = mysqli_query($link, $query); if($result){ $message[] = '$result = true Запрос успешно обработан'; if(mysqli_num_rows($result) == 1){ $message[] = 'Логин и пароль совпали'; }else{ $message[] = 'Логин и пароль не совпали'; } }else{ $message[] = '$result = false Ошибка выполнения запроса: ' . mysqli_error($link); } } else { $message[] = 'Введите логин и пароль'; } } // Закрываем соединение с базой данных mysqli_close($link); ?> <!DOCTYPE html> <html> <head> <meta charset='UTF-8' /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container"> <hr /> <div class="row"> <div class="col-md"> <small> <h5>Отладочная информация</h5> <hr /> <h6 class ="table-danger">Массив $_GET <?php echo 'count ('.count($_GET).')';?></h6> <pre><?php print_r($_GET);?></pre> <hr /> </small> </div> <div class="col-md-9"> <?php if($message) echo '<div style="color: red"><p>' . implode('</p><p>',$message) . '</p></div>';?> <div style="text-align: right"><h1>Авторизация</h1></div> <form action="" method="GET"> <p style="text-align: right">Логин: <input type="text" name="login" value=""></p> <p style="text-align: right">Пароль: <input type="password" name="password" value=""></p> <p style="text-align: right"><input type="submit" name="go" value=" Вход "></p> </form> <hr /> <div><h5><a href="?ini=1">Создать и заполнить таблицу</a> (логин admin пароль admin)</h5></div> </div> </div> <hr /> </div> </body> </html>