Как я могу предотвратить повторную отправку моей формы php при обновлении

1

Я использую следующий код для отправки поля в базе данных (используя oracle), но после успешной подачи формы, если я обновляю форму, форма возвращается повторно. Я не использую ни одну сессию здесь.

Пожалуйста помоги

<div class="col-xs-5">
    <?php
    $note=$_REQUEST['note'];
    $order = "INSERT INTO ec_note (nid, idno, note, flag, ec_date)
            VALUES
            (a_seq.nextval,'$id',
            '$note',1,sysdate)";
        if ($note)
        {
        $result = dbi_query($conn, $order); //order executes
        }
        if($result){
            echo("<div class='alert alert-success alert-dismissible' role='alert'>Your Note has been successfully uploaded
            <button type='button' class='close' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'>&times;</span></button>
            </div>");
            }

    ?>
    <form method="post" action="">
        <textarea class="form-control" name="note" rows="15" placeholder="Maximum 4000 characters "></textarea> <br>
        <button type="submit" name="submit" onSubmit="window.location.reload()" class="btn btn-primary btn-lg btn-block">Add Note</button>
    </form>
</div>
  • 1
    Выполните перенаправление после обработки отправленных данных.
  • 0
    Вы перезагружаете перед отправкой. НИКОГДА не вызывайте ничего в форме name=submit . Измените это, если вам нужно проверить это.
Теги:
forms

1 ответ

1

Отправьте форму следующим образом:

<form method="post" action="">
    <textarea class="form-control" name="note" rows="15" placeholder="Maximum 4000 characters "></textarea> <br>
    <button type="submit" name="confirm" class="btn btn-primary btn-lg btn-block">Add Note</button>
</form>

Теперь проблема в том, что если вы перезагрузите страницу, которую вы только что поставили, POST будет повторяться. Затем вам нужна такая страница, чтобы не выполнять перезагрузку. Для этого вам нужно, чтобы страница с паролями никогда не отображалась в браузере:

  • вы открываете страницу (это GET)
  • страница отображается, но не автоматически отправляется
  • вы отправляете страницу (это POST)
  • страница снова появляется через GET <-
  • страница отображается, но не автоматически отправляется
  • (повторение)

Вы достигаете этого, проверяя, что есть запрос, и если да, то после выполнения вставки базы данных вы перенаправляетесь на ту же страницу без POST. Это необходимо сделать, прежде чем какой-либо вывод будет отправлен в браузер, если не используется буферизация:

$note=$_REQUEST['note'];
$order = "INSERT INTO ec_note (nid, idno, note, flag, ec_date)
    VALUES
    (a_seq.nextval,'$id',
    '$note',1,sysdate)";
if ($note)
{
    $result = dbi_query($conn, $order); //order executes, allowing SQL injection.
    // This reloads without allowing resubmit, unless button is pressed again
    // No other output must have been sent, or this WILL cause an error.
    die(Header("Location: {$_SERVER['PHP_SELF']}"));
}

ВАЖНО. Вы доверяете, что поле "примечание" приходит POST и не содержит ничего плохого. Это может быть не всегда так.

Поэтому либо используйте запрос с подготовленными значениями, либо используйте экранирование, чтобы предотвратить $_REQUEST['note'] от вызова страшных таблиц Бобби.

Лучшая реализация:

if (isset($_POST)
    && array_key_exists('note', $_POST)
) {
    // I am not familiar with dbi_query. I suppose there exists a dbi_escape function?
    $note = YOUR_ESCAPE_FUNCTION($_POST['note'];)
    $order = "INSERT INTO ec_note (nid, idno, note, flag, ec_date)
    VALUES
    (a_seq.nextval,'$id',
    '$note',1,sysdate)";
    $result = dbi_query($conn, $order);

    // CHECK ERRORS AND DISPLAY THE APPROPRIATE RESPONSE

    // If no error, reload the form with a redirect and quit.
    // No output must have been sent to the browser up to now, or
    // this will cause an error.
    die(Header("Location: {$_SERVER['PHP_SELF']}"));
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню