Остановите вставку данных в базу данных дважды

Вы можете попробовать:

library(tidyverse)

list(df2, df1) %>%
  map(rownames_to_column) %>%
  bind_rows %>%
  group_by(rowname) %>%
  summarise_all(sum, na.rm = TRUE)

# A tibble: 2 x 5
  rowname     A     B     C     D
  <chr>   <int> <int> <int> <int>
1 1           2     1     2     1
2 2           4     2     4     2
25
задан casperOne 27 July 2012 в 14:30
поделиться

15 ответов

Я называю это золотым правилом веб-программирования:

Никогда не отвечают телом к запросу POST. Всегда делайте работу и затем отвечайте Местоположением: заголовок для перенаправления к обновленной странице так, чтобы браузер запросил это с, ДОБИРАЕТСЯ.

Таким образом, обновление не будет делать Вам ничего плохого.

кроме того, относительно обсуждения здесь в комментариях. Для защиты от двойной регистрации от, скажем, случайного двойного щелчка по Кнопке отправки сохраните md5 () формы в текстовом файле и сравните новый form’s md5 с сохраненным. Если они равны, у Вас есть двойное сообщение.

40
ответ дан Ilya Birman 28 November 2019 в 18:19
поделиться

Можно использовать маркер, чтобы препятствовать тому, чтобы страница была обработана снова! Такая процедура используется в большом количестве веб-платформ!

шаблон, который необходимо использовать, является "Маркерным Шаблоном Синхронизатора"! Если у Вас есть приложение для обслуживания широкого круга запросов, можно сохранить состояние в Базе данных.

данные могут быть, отправляют через JavaScript или скрытым полем формы.

необходимо также взглянуть на libaries с из поддержки поля вещей как это! Grails является таким!

См.: http://www.grails.org/1.1-Beta3+Release+Notes ...

<g:form useToken="true">

...

withForm {
   // good request
}.invalidToken {
   // bad request
}

..

0
ответ дан Martin K. 28 November 2019 в 18:19
поделиться

Добавьте скрытое поле со случайной строкой (произведенный md5(uniqid()), например), сделайте поле в базе данных для той строки и сделайте это УНИКАЛЬНЫМ.

0
ответ дан Patrick Glandien 28 November 2019 в 18:19
поделиться

Ну, в первую очередь, для уменьшения необходимо сделать его так, они должны сделать сообщение формы для вставки данных. Тот путь, по крайней мере, они получат то миленькое диалоговое окно подтверждения, спрашивающее, хотят ли они действительно повторно отправить его.

Для получения более сложными, чем это Вы могли поместить в скрытый один раз ключ использования в каждой форме, и как только форма с тем ключом была отправлена, отобразите ошибку, когда они пытаются отправить форму с тем же ключом. Для создания этого ключа Вы, вероятно, хотите использовать что-то как GUID.

0
ответ дан Kibbee 28 November 2019 в 18:19
поделиться

Я обычно полагаюсь на sql Ограничение Уникального индекса. http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html

1
ответ дан Carlo 28 November 2019 в 18:19
поделиться

Вы могли бы хотеть проверить шаблон POST/перенаправления/получать самая современная реализация веб-приложений, видеть http://en.wikipedia.org/wiki/Post/Redirect/Get

2
ответ дан jmoz 28 November 2019 в 18:19
поделиться

Для утверждения очевидного (я не видел его здесь еще...): Никогда не используйте, ДОБИРАЮТСЯ, чтобы отправить данные, всегда использовать POST, тот способ, которым пользователь, по крайней мере, получает предупреждение, если он пытается обновить/re-post страницу (по крайней мере, в Firefox, но я предполагаю в других браузерах также).

Между прочим, если Вы не можете позволить себе иметь те же данные дважды, необходимо также рассмотреть решение для MySQL с уникальным ключом (может быть комбинация полей), и:

    INSERT INTO ... ON DUPLICATE KEY UPDATE ...
4
ответ дан jeroen 28 November 2019 в 18:19
поделиться

Я согласился бы с Ilya там и добавил бы, что необходимо использовать некоторый клиент JavaScript для отключения 'отправлять' кнопки, как только это было нажато или представляет модальное диалоговое окно (css, может помочь Вам здесь) избегать, чтобы несколько нажали на кнопку отправки.

Наконец, если Вы не хотите данные в своей базе данных дважды тогда также, проверяют Вашу базу данных на данные, прежде чем Вы попытаетесь вставить его. Если бы Вы позволяете дублирующиеся записи, но не хотите быстрые повторные вставки от единственного источника тогда, я использовал бы метку времени и даты и поля IP-адреса для обеспечения основанного на времени 'локаута' в моем коде представления, т.е. если IP является тем же, и прошлый раз представления был меньше чем 5 минут назад, тогда не вставляют новую запись.

Hope, которая дает Вам некоторое представление.

2
ответ дан Lazarus 28 November 2019 в 18:19
поделиться

Обработайте форму, затем перенаправьте к странице результатов. Перезагрузка тогда только восстанавливает изображение страницы результатов.

7
ответ дан chaos 28 November 2019 в 18:19
поделиться

Мои два цента:

  • Перенаправьте пользователя к той же странице после передающих данных и проверьте if(isset($_POST['submit'])

Другая полезная информация для подобных случаев:

0
ответ дан 28 November 2019 в 18:19
поделиться

В дополнение к хорошим предложениям, уже упомянутым об устранении пользователя от страницы регистрации, таким образом, кнопка Обновить и кнопка "Назад" безопасны, другой слой в улучшении Вашего хранения данных состоит в том, чтобы использовать UUID в качестве ключей в Вашей таблице и позволять Вашим приложениям генерировать их.

Они также известны как GUID в мире Microsoft и в PHP, который можно генерировать один через uniqid () в PHP. Это - 32 символьных шестнадцатеричных значения, которые необходимо сохранить в формате шестнадцатеричного числа/столбца двоичных данных, но если таблица не будет в большой степени используемой, чем CHAR (32) будет работать.

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

Дополнительная премия к этому при генерации UUID в коде, затем после выполнения вставки, Вы никогда не должны будете использовать расточительные запросы, получающие ключ, который был сгенерирован, потому что Вы будете уже знать это. Это - хорошее преимущество, когда необходимо ВСТАВИТЬ дочерние объекты в другие таблицы.

Хорошее программирование основано на разделении на уровни Вашей работы, не полагаясь на 1 вещь работать. Несмотря на то, насколько распространенный это для кодеров для доверия возрастающим идентификаторам, они - один из самых ленивых способов создать таблицу.

2
ответ дан TravisO 28 November 2019 в 18:19
поделиться

Лучший способ избежать дублирующейся рекордной вставки на обновлении страницы после вставки записей в базе данных по нажатию кнопки, просто добавьте эту строку:

Response.Write("<script>location.href='yourpage.aspx'</script>");
0
ответ дан Pang 28 November 2019 в 18:19
поделиться

Попытайтесь включая что-то в Ваших формах предотвратить двойное представление, предпочтительно одновременно защищающее от подделки запроса перекрестного сайта. Я рекомендую использовать то, что я называю formkey, который является полем с одним использованием, которое однозначно определяет представление формы, связывая его с отдельным пользователем в отдельном адресе. Понятие идет под другими именами также, но короткое примечание, с которым я связался, объясняет это достаточно хорошо.

0
ответ дан Keith Gaughan 28 November 2019 в 18:19
поделиться

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

Если повторная отправка опасна (возврат и повторная отправка, перезагрузка страницы результатов [если вы не воспользовались советом Ильи] и т. д.) Я использую "одноразовый номер", чтобы убедиться, что форма может быть пройдена только один раз.

На странице формы:

<?php
@session_start(); // make sure there is a session

// store some random string/number
$_SESSION['nonce'] = $nonce = md5('salt'.microtime());
?>
// ... snip ...
<form ... >
<input type="hidden" name="nonce" value="<?php echo $nonce; ?>" />
</form>

На странице обработки:

<?php
if (!empty($_POST)) {
@session_start();

// check the nonce
if ($_SESSION['nonce'] != $_POST['nonce']) {
    // some error condition
} else {
    // clear the session nonce
    $_SESSION['nonce'] = null;
}

// continue processing

После Форма была отправлена ​​один раз, она не может быть отправлена ​​снова, если пользователь намеренно не заполнил ее повторно.

5
ответ дан 28 November 2019 в 18:19
поделиться

POE (Post Once Exactly) - это шаблон HTTP, предназначенный для предупреждения клиента о блокировке двойных отправок с использованием проприетарного заголовка ...

GET /posts/new HTTP/1.1
POE: 1
...

... но он все еще в спецификации.

http://www.mnot.net/drafts/draft-nottingham-http-poe-00.txt

Я думаю, что приведенный выше одноразовый номер - хорошее решение. Хотя сохранение одноразового номера в виде дискретной переменной сеанса приведет к некоторым ошибкам, если клиент пытается выполнять одновременные публикации с нескольких вкладок. Может, лучше ...

$_SESSION['nonces'][] = $nonce;

... и ...

if (in_array($_POST['nonce'], $_SESSION['nonces'])) {

... разрешить несколько одноразовых номеров (nonci? Noncei?).

0
ответ дан 28 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: