Я реализовал функционал регистрации и авторизации на сайте, основываясь на видеоуроке. Процесс регистрации проходит успешно, и данные правильно сохраняются в базе данных. Однако при попытке авторизации возникают ошибки:
<br/> Warning: Undefined array key "login" in D:\xampp\htdocs\login.php on line 4
<br/> Warning: Undefined array key "pass" in D:\xampp\htdocs\login.php on line 5
Можете помочь разобраться с этой проблемой?
<br/><br/> Вот полный код:
<br/> <?php
<br/> require_once('db.php');
<br/><br/> $login = $_POST['login'];
<br/> $pass = $_POST['pass'];
<br/><br/> if(empty($login) || empty($pass))
<br/> {
<br/> echo "Ошибка: заполните все поля";
<br/><br/> }else {
<br/> $sql = "SELECT * FROM `user` WHERE login = '$login' AND pass='$pass'";
<br/> $result=$conn->query($sql);
<br/><br/> if ($result->num_rows > 0){
<br/> while($row=$result->fetch_assoc()){
<br/> echo "Успешная авторизация!". $row ['login'];
<br/> }
<br/> } else {
<br/> echo "Ошибка: пользователь не существует.";
<br/> }
<br/> }
Предупреждение "Undefined array key 'login'" возникает, когда вы пытаетесь получить доступ к элементу массива (в данном случае массива `$_POST`), который не существует. Это происходит, когда форма отправляется без заполнения полей `login` и `pass`.
Чтобы устранить это предупреждение, вы можете использовать функцию `isset()`, чтобы проверить существует ли элемент в массиве `$_POST`, прежде чем к нему обращаться. Вот как можно изменить ваш код:
```php
<?php
require_once('db.php');
// Используем isset() для проверки существования ключей перед их использованием
$login = isset($_POST['login']) ? $_POST['login'] : '';
$pass = isset($_POST['pass']) ? $_POST['pass'] : '';
if (empty($login) || empty($pass)) {
echo "Ошибка: заполните все поля";
} else {
$sql = "SELECT * FROM `user` WHERE login = '$login' AND pass='$pass'";
$result = $conn->query($sql);
if ($result->num_rows > 0){
while($row = $result->fetch_assoc()){
echo "Успешная авторизация! " . $row['login'];
}
} else {
echo "Ошибка: пользователь не существует.";
}
}
```
В этом исправлении:
- Мы проверяем, существует ли `$_POST['login']` и `$_POST['pass']` с помощью `isset()`. Если ключ существует, мы присваиваем его значение переменной, в противном случае присваиваем пустую строку.
- Теперь предупреждение не должно возникать, так как мы всегда присваиваем значение, даже если оно пустое.
Кроме того, настоятельно рекомендую использовать подготовленные выражения (prepared statements) для выполнения запросов к базе данных. Это не только улучшит безопасность вашего приложения (защита от SQL-инъекций), но и может повысить производительность, если вы будете использовать одно и то же выражение несколько раз.
Пример использования подготовленных выражений с MySQLi:
```php
<?php
require_once('db.php');
$login = isset($_POST['login']) ? $_POST['login'] : '';
$pass = isset($_POST['pass']) ? $_POST['pass'] : '';
if (empty($login) || empty($pass)) {
echo "Ошибка: заполните все поля";
} else {
// Подготовка запроса
$stmt = $conn->prepare("SELECT * FROM `user` WHERE login = ? AND pass = ?");
$stmt->bind_param("ss", $login, $pass); // "ss" означает, что оба параметра строковые
$stmt->execute();
$result = $stmt->get_result(); // Получаем результат
if ($result->num_rows > 0){
while($row = $result->fetch_assoc()){
echo "Успешная авторизация! " . $row['login'];
}
} else {
echo "Ошибка: пользователь не существует.";
}
$stmt->close(); // Закрываем подготовленный запрос
}
```
С помощью таких изменений вы сделаете свой код более безопасным и устойчивым к ошибкам.
У вас походу php 8.
Ошибка говорит, в $_POST login не существует. вы пытаетесь обратиться к ключам, которых нет.
1. Проверяйте, отправляется ли форма.
2. Если форма отправлена, попробуйте выводить $_POST['login'] в echo.
3. Если в echo будет результат, тогда вам нужно подавить ошибку, но это не самый лучший вариант.
4. Нужно убедиться в том, что отправляется действительно форма, а не json данные.
5. Если вы отправляете форму через js, нужно проверить, не конвертируете ли вы её в json.
6. Если вы отправляете форму как json данные, тогда $_POST будет всегда пуст. Вам нужно будет обратиться к php://input .
Помните, подавление ошибок не всегда выход из ситуации.
Данная ошибка может возникать в двух случаях:
- если вы обращаетесь к этому скрипту напрямую, а не как к обработчику формы
- если в форме были ошибки, и она тупо не передаёт поля login и pass методом POST.
Чтобы исправить первый вариант, и вообще для порядка, надо добавить проверку на метод POST.
Чтобы получить помощь для второго варианта, надо догадаться добавить в свой вопрос код формы.
В целом же, эта авторизация будет бессмысленной, даже когда заработает. Поскольку любой придурок легко авторизуется без пароля, тупо через SQL инъекцию. Очердной пример того, что учить программирование "по видео из интернета" - это пустая трата времени