Обновление PHP, как я могу остановить повторный вызов предыдущей функции при обновлении страницы?

#php #function #refresh

#php #функция #обновить

Вопрос:

У меня есть функция, которая импортирует содержимое файлов в MySQL и возвращает результаты. Если я обновлю страницу и нажму «да», она сделает это снова, удвоив вывод с тем же содержимым.

Как я могу остановить это? В данном конкретном случае URI в адресной строке отсутствует, но в других функциях он есть.

Комментарии:

1. Ваш скрипт проверяет, есть ли эта запись уже в базе данных?

2. Можно было бы сделать, но единственный способ проверить — это имя файла, и если имя файла уже существует, оно переименовывает его и добавляет в любом случае.

Ответ №1:

Вы должны просто проверить, существует ли содержимое в базе данных, если это не так, заполните их. В противном случае не запускайте функцию.

псевдокод:

 if !database.containsRecords
  fillDatabase()
end
  

Кроме того, всегда рекомендуется перенаправлять после запроса POST. Итак, вы хотели бы:

 fillDatabase();
header("Location page.php");
exit();
  

Комментарии:

1. Могу ли я передать сообщение об успешном завершении вместе с этим?

2. @Ezra: Пусть на целевой странице будет написано «успех».

3. Не совсем самый динамичный из процессов.

4. @Ezera, да. Просто сохраните сообщение в переменной сеанса. Посмотрите php.net/manual/en/ref.session.php

5. Я мог бы просто спросить, после отображения переменной сеанса и обновления старое сообщение сообщения все еще будет там. Здесь я немного придираюсь, но есть ли способ заставить сообщение отображаться только один раз?

Ответ №2:

Запрашивайте базу данных при каждой загрузке страницы и смотрите, была ли она уже заполнена. Если она была заполнена, не пытайтесь заполнить ее снова.

Ответ №3:

Вы должны использовать шаблон ПОЛУЧЕНИЯ ПОСЛЕ перенаправления.

После обновления базы данных отправьте HTTP-перенаправление на отдельную страницу, которая отображает результаты.
Обновление браузера перезагрузит эту отдельную страницу.

Комментарии:

1. И использование кнопки возврата браузера в любом случае приведет к сбоям. Да, некоторые современные браузеры предотвращают повторную отправку данных POST, но не все.

2. Да, вы действительно должны сделать перенаправление при успешном выполнении. На самом деле вы должны сделать это для всех форм. Это лучшая практика.

3. @Oliver: Неправильно. Перенаправления не создают отдельных записей в истории; возврат приведет к возврату на страницу, которая отправила форму.

4. Да, если вы все сделаете правильно. Некоторые перенаправления действительно создают объекты, а иногда плохие перенаправления даже заманивают вас на страницу.

5. @Oliver: Перенаправления Javascript ( location.href = ... ) могут приводить к появлению записей в истории, а отскоки при мета-обновлении HTML могут (не уверен в этом). Перенаправления HTTP 30x обычно этого не делают (за исключением исключительно плохо написанных браузеров, ни один из которых не используется повсеместно).

Ответ №4:

Я предполагаю, что вы используете форму POST для загрузки файла. Вы можете включить в свою форму скрытое поле ввода с псевдослучайным уникальным идентификатором. Если пользователь повторно отправляет данные через POST, вы можете проверить, обработали ли вы уже этот запрос. Скрытые поля не сохраняются, потому что пользователь может их отредактировать, но вы можете обнаружить случайные повторные отправки.