Как сделать так, чтобы данные, введенные форму не заносились в БД повторно после перезагрузки страницы и допустимо ли такое поведение на сайте?
Есть таблица users в БД по имени temp1.
В users есть два столбца: name и surname.
Через форму вводятся имя и фамилия. Данные успешно заносятся в БД. Но обратил внимание, что если перезагрузить страницу и принять повторную отправку формы, то данные еще раз заносятся в БД.
Насколько это поведение приемлемо для сайта? Считается ли это багом? Как это исправить?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style rel="stylesheet">
label {
width: 150px;
}
.input-area {
margin-bottom: 15px;
}
</style>
</head>
<body>
<form action="" method="POST">
<div class="input-area">
<label>Имя</label>
<input type="text" name="name">
</div>
<div class="input-area">
<label>Фамилия</label>
<input type="text" name="surname">
</div>
<div class="input-area">
<input type="submit" value="Занести данные в базу">
</div>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$pdo = new PDO("mysql:host=localhost;dbname=temp1", "root", "");
$name = htmlentities(trim($_POST["name"]));
$surname = htmlentities(trim($_POST["surname"]));
$stmt = $pdo->prepare("INSERT INTO users(name, surname) VALUES(?, ?)");
$stmt->execute([$name, $surname]);
?>
</body>
</html>
Ответы (1 шт):
Автор решения: JustLearn
→ Ссылка
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$pdo = new PDO("mysql:host=localhost;dbname=temp1", "root", "");
$name = htmlentities(trim($_POST["name"]));
$surname = htmlentities(trim($_POST["surname"]));
$pdo->query("BEGIN");
$stmt = $pdo->prepare("INSERT INTO users(name, surname) VALUES(?, ?)");
$stmt->execute([$name, $surname]);
$result = $pdo->query("SELECT LAST_INSERT_ID()");
$user_id = $result->fetch()[0];
echo $user_id . " ";
if (isset($_SESSION["id"])) {
echo $_SESSION["id"];
}
if ($user_id - 1 == $_SESSION["id"]) {
$pdo->query("ROLLBACK");
echo "<script>alert('Не надо отправлять форму еще раз!')</script>";
$_SESSION["id"] = $user_id;
die();
}
$_SESSION["id"] = $user_id;
$pdo->query("COMMIT");
}
?>