Почему $array=$sql->fetch(PDO::FETCH_ASSOC). Возвращает false не зависимо от того что я написал в форму?
//Файл login.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Вход в админку</title> </head> <body> <h2 style="text-align:center;padding-top:100px">Вход в административную панель</h2> <form action="admin/admin.php" method="post" style="text-align:center;padding-top:50px"> <div class="form-group"> <lable>Логин </lable> <input type="text" placeholder="Введите логин" name="login"> </div> <div class="form-group"> <lable>Пароль</lable> <input type="text" placeholder="Введите пароль" name="password"> </div> <button type="submit" class="btn btn-primary">Войти</button> </form> </body> </html> Файл connect.php <?php $user = "root"; $password =""; $host = "localhost"; $db = "project"; $dbh = 'mysql:host='.$host.';dbname='.$db.';charset=utf8mb4'; $pdo=new PDO($dbh,$user,$password); ?> //Файл admin.php <?php require_once '../functions/connect.php';?> <?php $login = $_POST['login']; $password = $_POST['password']; $sql = $pdo->prepare("SELECT id FROM user WHERE login=:login AND password=:password"); $sql->execute(array('login' => $login, 'password' => $password)); $array=$sql->fetch(PDO::FETCH_ASSOC); var_dump($array); ?> |
//Файл login.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Вход в админку</title> </head> <body> <h2 style="text-align:center;padding-top:100px">Вход в административную панель</h2> <form action="admin/admin.php" method="post" style="text-align:center;padding-top:50px"> <div class="form-group"> <lable>Логин </lable> <input type="text" placeholder="Введите логин" name="login"> </div> <div class="form-group"> <lable>Пароль</lable> <input type="text" placeholder="Введите пароль" name="password"> </div> <button type="submit" class="btn btn-primary">Войти</button> </form> </body> </html> Файл connect.php <?php $user = "root"; $password =""; $host = "localhost"; $db = "project"; $dbh = 'mysql:host='.$host.';dbname='.$db.';charset=utf8mb4'; $pdo=new PDO($dbh,$user,$password); ?> //Файл admin.php <?php require_once '../functions/connect.php';?> <?php $login = $_POST['login']; $password = $_POST['password']; $sql = $pdo->prepare("SELECT id FROM user WHERE login=:login AND password=:password"); $sql->execute(array('login' => $login, 'password' => $password)); $array=$sql->fetch(PDO::FETCH_ASSOC); var_dump($array); ?>
Дополнительно:
Ответы:
Если версия PHP ниже 8.0, то добавьте в вызов конструктора опцию PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. Если версия 8.0 и выше или после добавления опции ошибок не показывает, то значит запрос ничего не находит в базе.
-
ошибок не показывает, то значит запрос ничего не находит в базе.
Пустой результат запроса - это пустой массив, а не false
- Сергей delphinpro, Пустой массив возвращает fetchAll. Обычный fetch возвращает false если больше нет строк в выборке.
The return value of this function on success depends on the fetch type. In all cases, false is returned on failure or if there are no more rows.
- Rsa97, точно..
У вас как процедура регистрации выгляит? Вы что, прямо вот так храните в базе данных пароль в открытом виде?
Или все-таки храните хэш от пароля, сгенерированный функцией password_hash?
Если храните хэш, то зачем вы пытаетесь найти в базе пароль в том виде, как он был введен в форму?
По поводу принципов регистрации/авторизации вот здесь ознакомьтесь
https://habr.com/ru/articles/665602/
Специально для новичков писал.
Когда я стираю : в запросе к базе данных то выводит id 1 вне зависимости от того что я написал в форму
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, с которой вы столкнулись, может возникать из-за нескольких возможных причин. Давайте разберемся, почему $array=$sql->fetch(PDO::FETCH_ASSOC) возвращает false независимо от введенных данных.
1. Ошибка в SQL запросе: Первым делом стоит проверить правильность написания SQL запроса. Убедитесь, что запрос синтаксически корректен и не содержит ошибок.
2. Отсутствие данных в результате запроса: Если SQL запрос выполнен успешно, но в результате запроса не было найдено ни одной строки, метод fetch() вернет false. Убедитесь, что в базе данных есть данные, соответствующие вашему запросу.
3. Неправильное использование метода fetch(): Возможно, вы неправильно используете метод fetch(). Убедитесь, что после выполнения запроса вы вызываете метод fetch() в цикле, чтобы получить все строки результата.
Пример правильного использования fetch():
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { // обработка данных }
4. Необходимо проверить наличие данных перед вызовом fetch(): Для того чтобы избежать ошибок, связанных с отсутствием данных, рекомендуется проверить наличие данных перед вызовом fetch(). Например, вы можете использовать условие IF для проверки наличия данных перед вызовом fetch().
Пример проверки наличия данных:
if ($sql->rowCount() > 0) { $array = $sql->fetch(PDO::FETCH_ASSOC); } else { echo "Нет данных для извлечения"; }
Проверьте вышеперечисленные возможные причины и убедитесь, что вы правильно используете метод fetch(). Если проблема не решена, попробуйте использовать отладочные инструменты, чтобы узнать, какие данные возвращаются из базы данных перед вызовом fetch().