Я использую следующий код для отправки поля в базе данных (используя 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'>×</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>
Отправьте форму следующим образом:
<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 будет повторяться. Затем вам нужна такая страница, чтобы не выполнять перезагрузку. Для этого вам нужно, чтобы страница с паролями никогда не отображалась в браузере:
Вы достигаете этого, проверяя, что есть запрос, и если да, то после выполнения вставки базы данных вы перенаправляетесь на ту же страницу без 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']}"));
}
name=submit
. Измените это, если вам нужно проверить это.