Почему данные автоматически отправляются в базу данных

при перезагрузке страницы данные автоматически отправляются в базу данных(если поля пустые, то отправляются пустые строки)

register.php:

  $email = $_POST['email'];
  $login = $_POST['login'];
  $password = $_POST['password'];
if(isset($_POST['button']))
{
    if(isset($email) && isset($login) && isset($password))
    {
        $STH = $DBH->query("INSERT INTO data(email,login,password) VALUES('$email','$login','$password')");
    }
}

connection.php:

<?
$host = "localhost";
$dbname = "data";
$user = "root";
$pass = "root";
$options = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);

try {   
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass, $options); 
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}  
catch(PDOException $e) {  
    echo $e->getMessage();
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);  
}

форма:

<form action="index.php" method="POST">
        <input type="email" name="email" placeholder="email">
        <input type="text" name="login" placeholder="login">
        <input type="password" name="password" placeholder="password">
        <input type="submit" name="button">
    </form>

как это исправить?


Ответы (3 шт):

Автор решения: Ein
Почему форма отправляется при обновлении?

Обновление страницы повторяет последний запрос, т.е. если последним была отпрака формы(POST), то браузер честно отправит запрос ещё раз.

Как избежать?

Можно отдавать редирект на ту же страницу, т.к. при редиректе будет уже GET запрос. Так же, можно отправить форму на js.

Почему пропускается проверка isset($email) /* AND ... */?

Поля, если не были заполнены, но указаны в форме, содержат пустую строку. Т.к isset($var) это аналог $var !== null, то ваша проверка будет пропускаться т.к. идёт сравнение "" !== null.

Как избежать?

Можно проверять просто как if($email){}, т.к. "" == false и null == false(внмание на количество =). Но лучше явно проверить на длину и содержание

→ Ссылка
Автор решения: Meow

Сделайте редирект после обработки формы.

if (
    !empty($_POST['email'])
    && !empty($_POST['login'])
    && !empty($_POST['password'])
) {
    // Делаем какие-то действия с данными из формы
    // Далее, переадресуем пользователя на другую страницу
    header('Location: /otherPage.php');
} else {
    throw new Exception('Ой, ошибочка вышла!');
}
→ Ссылка
Автор решения: Евгений Паникоровскй

Потому что кнопка обновить в браузере, повторяет последнее выполненное действие, в вашем случае это отправка формы, вот она и отправляет пустые данные, вам правильно советуют с редиректом, либо сделайте в register.php проверку что бы данные были не пустые

→ Ссылка