Как можно устранить предупреждение "Warning: Undefined array key 'login'" при авторизации в PHP?

Я реализовал функционал регистрации и авторизации на сайте, основываясь на видеоуроке. Процесс регистрации проходит успешно, и данные правильно сохраняются в базе данных. Однако при попытке авторизации возникают ошибки: 

<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/> }
  • 20 февраля 2025 г. 12:14
Ответы на вопрос 3
Предупреждение "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 инъекцию. Очердной пример того, что учить программирование "по видео из интернета" - это пустая трата времени
Похожие вопросы