Как предотвратить множественные вставки при отправке формы в PHP?

Измените конструктор следующим образом

Circle::Circle(const Point& center, double radius) 
    : center_pt( center ), radius_size( radius )  
{
}

Проблема заключается в том, что если вы не будете явно вызывать конструктор с параметрами для класса Point, то компилятор пытается вызвать конструктор по умолчанию класса для создания члена данных center_pt класса Circle, прежде чем вы сможете назначить точку внутри тела конструктора класса Circle. Но вы не определили конструктор по умолчанию класса Point, и компилятор выпустил ошибку.

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

Учтите, что по дизайну класса Point вы не можете изменять элементы данных coord_x и coord_y созданного объекта. Возможно, вы должны перепроектировать класс.

29
задан Russell 11 March 2010 в 04:46
поделиться

14 ответов

Используйте JavaScript, чтобы остановить его отправку

-1
ответ дан Simon 11 March 2010 в 04:46
поделиться

Используйте JavaScript, чтобы отключить кнопку, как только она нажата.

onclick="this.disabled=true;forms[0].submit();"
0
ответ дан Asaph 11 March 2010 в 04:46
поделиться

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

1
ответ дан mst 11 March 2010 в 04:46
поделиться

Предотвращение дублирования отправки формы показывает способ сделать это без JavaScript.

2
ответ дан ErikE 11 March 2010 в 04:46
поделиться

Я делаю следующее на action.php

if(

Я делаю следующее на action.php

[110]

Примечание: всегда инициируйте свои сеансы в заголовке с помощью session_start ();

SESSION && isset(

Я делаю следующее на action.php

[110]

Примечание: всегда инициируйте свои сеансы в заголовке с помощью session_start ();

SESSION['already_submitted'])) { # If already submitted just redirect to thank you page } else { # If first submit then assign session value and process the form

Я делаю следующее на action.php

[110]

Примечание: всегда инициируйте свои сеансы в заголовке с помощью session_start ();

SESSION['already_submitted'] = true; # Process form }

Примечание: всегда инициируйте свои сеансы в заголовке с помощью session_start ();

0
ответ дан Robert Sinclair 11 March 2010 в 04:46
поделиться

Двойное нажатие кнопки «Отправить» довольно редко приводит к множественным вставкам, но если вы хотите получить простое решение, используйте

onsubmit="document.getElementById('submit').disabled = true"

в теге формы, если вы дадите кнопку «Отправить» id="submit"

0
ответ дан raveren 11 March 2010 в 04:46
поделиться

Отключите кнопку отправки с использованием Javascript после отправки формы (onsubmit).

Обратите внимание, что если пользователь отключил Javascript, он все равно может отправить дважды. Будет ли это происходить достаточно часто, чтобы оправдать проверку вашего кода (как вы предложили в своем вопросе), зависит от вас.

1
ответ дан Aistina 11 March 2010 в 04:46
поделиться

Используйте уникальный токен с постом, чтобы каждый пост / постбэк обрабатывался только один раз.

Отключение кнопки отправки не очень хорошее решение, так как люди могут отключить JavaScript или делать другие странные вещи. Проверка на стороне клиента - хорошее начало, но ее всегда следует подкреплять обработкой на стороне сервера.

30
ответ дан Mats Fredriksson 11 March 2010 в 04:46
поделиться

Я использую это:

$form_token = $_SESSION['form_token'] = md5(uniqid());

Отправить $ form_token с формой, то ...

Я проверяю form_token:

if($_SESSION['form_token'] != $_POST['form_token']) {
   echo 'Error';
}
1
ответ дан CSSJediEsck21 11 March 2010 в 04:46
поделиться

Еще один способ создать страницу подтверждения, где пользователь может, наконец, нажать кнопку отправки. Это может уменьшить возможности такого рода.

0
ответ дан Diwakar Kumar Singh 11 March 2010 в 04:46
поделиться

Создайте уникальный одноразовый ключ для отправки с помощью формы.

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

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

5
ответ дан Dana the Sane 11 March 2010 в 04:46
поделиться

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

            // reset session token
            

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'])) { if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'])) { if (

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] !=

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token']) { echo '<h3>Oops! You already submitted this request.</h3>'; } else { // process form // reset session token

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] . time() ); } } else { echo 'post token not set';

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5( $somevariable . time() ); } }

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'])) { if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'])) { if (

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] !=

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token']) { echo '<h3>Oops! You already submitted this request.</h3>'; } else { // process form // reset session token

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] . time() ); } } else { echo 'post token not set';

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5( $somevariable . time() ); } }

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] . time() );

мои последние сценарии выглядят так:

if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'])) { if (isset(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'])) { if (

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] !=

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token']) { echo '<h3>Oops! You already submitted this request.</h3>'; } else { // process form // reset session token

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5(

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

POST['token'] . time() ); } } else { echo 'post token not set';

Арон Роттвил включает в себя уникальный токен на каждом посте , сработавшем для меня. Однако моя форма все еще отправляется, когда пользователь обновляет страницу (F5). Мне удалось решить эту проблему, добавив сброс:

[110]

мои последние сценарии выглядят так:

[111]

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

SESSION['token'] = md5( $somevariable . time() ); } }

о! не забудьте добавить session_start(); до <!DOCTYPE>

Я новичок в PHP, поэтому, пожалуйста, исправьте меня, если вы обнаружите ошибки.

-1
ответ дан Pabile 11 March 2010 в 04:46
поделиться

Существует несколько решений этой проблемы:

  1. Используйте JavaScript, чтобы отключить кнопку отправки формы, когда она опубликована. Недостаток этого является то, что это абсолютно не является надежности. Очень легко отправлять формы, не нажав на кнопку, и это также не будет работать для пользователей с помощью JavaScript отключена. Я бы определенно не рекомендовал этот метод.

    Пример:

     
     
     
     
    <тип ввода = "текстовое" name = "bar" /> <Тип ввода = «Отправить» значение = «Сохранить» onclick = "Отключить передачу ();">
  2. Используйте сеансы PHP , чтобы установить переменную сеанса (например, $ _Session [«PostTimer») к текущему временному времени на пост. Перед фактическим обработкой формы в PHP проверьте, существует ли переменная $ _SESSION ['POSTTIMER'] и проверяет определенную разницу времени времени (т. Е.: 2 секунды). Таким образом, вы можете легко отфильтровать двойные подачи.

    Пример:

     // form.html
     
      <тип ввода = "текстовое" name = "bar" />
      <Тип ввода = «Отправить» значение = «Сохранить»>
     
    
     // foo.php.
    Если (Isset ($ _ Post) &&! Пусто ($ _ post))
     {
      Если (Isset ($ _ Session ['PostTimer']))
      {
      Если ((время () - $ _session ['posttimer']) <= 2)
      {
      // менее 2 секунд с последнего сообщения
      }
      еще
      {
      // более 2 секунд с последнего сообщения
      }
      }
      $ _Session ['posttimer'] = time ();
     }
     
  3. Включите уникальный токен на каждом посте. В этом случае вы также установили переменную сеанса в токен, который вы хотите включить, а затем рендерируйте токен в форме. Как только форма представлена, вы повторно генерируете токен. Когда представленный токен не соответствует токену на вашем сеансе, форма была перенесена и должна быть объявлена ​​недействительной.

    Пример:

     // form.php
     
     
      <тип ввода = «скрытое» имя = «токен» значение = «« />
      <тип ввода = "текстовое" name = "bar" />
      <Тип ввода = «Отправить» значение = «Сохранить» />
     
    
     // foo.php.
    If (Isset ($ _ Session [«токен»)))))
     {
      Если (Isset ($ _ post ['токен']))
      {
      Если ($ _POST [«токен»]! = $ _Session [«токен»]))
      {
      // Дважды отправьте
      }
      }
     }
     
50
ответ дан Aron Rotteveel 11 March 2010 в 04:46
поделиться

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

Например,

<input type="submit" onclick="this.disabled=true" />
.
0
ответ дан Marius 11 March 2010 в 04:46
поделиться
Другие вопросы по тегам:

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