<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css" rel="stylesheet">
table {
border-collapse: collapse;
}
</style>
</head>
<body>
<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="POST">
<label for="species">Вид</label>
<input type="text" name="species" id="species"><br>
<label for="name">Имя</label>
<input type="text" name="name" id="name"><br>
<label for="age">Возраст</label>
<input type="text" name="age" id="age"><br>
<input type="hidden" name="check" value="yes">
<input type="submit" value="Внести данные">
</form>
<?php
echo $_POST["species"] . " " . $_POST["name"] . " " . $_POST["age"] . "<br>";
require_once "../reg file/login.php";
$connection = new mysqli($hn, $un, $pw, $db);
function get_post($connection, $var) {
return $connection->real_escape_string($_POST[$var]);
}
//Код проверки на существование таблицы
$query = "SELECT * FROM cats LIMIT 1";
if (!$connection->query($query)) {
$query = "CREATE TABLE cats(species VARCHAR(128) NOT NULL,"
. "name VARCHAR(20) NOT NULL,"
. "age INT UNSIGNED NOT NULL,"
. "id SMALLINT NOT NULL AUTO_INCREMENT,"
. "PRIMARY KEY(id))";
$result = $connection->query($query);
if (!$result) {
die("Не удалось создать таблицу.");
}
mysqli_query("SET NAMES 'utf8'");
mysqli_query("SET CHARACTER SET 'utf8'");
mysqli_query("SET SESSION collation_connection = 'utf8_general_ci'");
}
//Проверка отправки формы
if (isset($_POST["check"])) {
$species = get_post($connection, "species");
$name = get_post($connection, "name");
$age = get_post($connection, "age");
}
//Проверка корректности введенных данных
if (!empty($species) && !empty($name) && !empty($age)) {
echo $species . " " . $name . " " . $age . "<br>";
$query = "INSERT INTO cats(species, name, age)"
. "VALUES('$species', '$name', $age)";
$result = $connection->query($query);
if (!$result) {
die("Не удалось выполнить запрос к БД.");
}
}
else if (isset($_POST["check"]) && (isset($species) xor isset($name) xor isset($age))) {
echo "Вы не ввели одно или несколько полей.<br>";
}
//////Вывод таблицы
echo "<table>";
echo "<tr><th>Вид</th><th>Имя</th><th>Возраст</th><th>ID</th></tr>";
$query = "SELECT * FROM cats";
$result = $connection->query($query);
$rows = $result->num_rows;
for ($i = 1; $i <= $rows; $i++) {
$row = $result->fetch_array(MYSQLI_ASSOC);
echo "<tr>";
<?php
echo "<td>" . $row["species"] . "</td>" . " ";
echo "<td>" . $row["name"] . "</td>" . " ";
echo "<td>" . $row["age"] . "</td>" . " ";
echo "<td>" . $row["id"] . "</td>";
echo "</tr>";
}
echo "</table>";
///Сброс данных
unset($_POST["species"], $_POST["name"], $_POST["age"]);
echo $_POST["species"] . " " . $_POST["name"] . " " . $_POST["age"] . "<br>";
$result->close();
$connection->close();
?>
</body>
</html>
Я пишу unset() в конце скрипта, чтобы избежать повторной записи данных в таблицу при перезапуске страницы. Если отправить данные из формы, а потом перезапустить страницу, то эти данные запишутся в таблицу еще раз.
После сброса данных я вывожу их и, как и ожидалось, генерируются ошибки. Но если перезапустить страницу, то инструкции echo в начале скрипта сработают без ошибок и данные повторно запишутся в таблицу. Почему так? Ведь я же сбросил данные элементы массива $_POST
и в конце скрипта даже генерировались ошибки о том, что таких индексов не существует.
Почему мой способ не работает и как сделать так, чтобы предотвратить повторную запись данных в таблицу?
Нужно следить за формой, а не за POSTом, потому что если после POST запроса к примеру нажать f5(обновить страницу), то от вас улетит еще один POST запрос с теми же данными. Можно к примеру чистить форму поле успешной операции, либо использовать редирект на нужную страницу. А то что вы пишите unset() в конце скрипта особо не поможет. Почему - потому что PHP скрипт запускается, отрабатывает и "умирает". Если речь шла бы о сессии, то unset() еще был бы полезен.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть рубрики и страницы нужно по выбору выводить заголовок и картинку поста в слайдер, сделать чекбокс для каждой записи по которой будет...
Как можно получать уведомления на почту с групп социальных сетей (vk facebook insta) c чужих группТекст поста картинки
Собственно вопрос в заголовке, например мне число 123456789 нужно вывести как 123456