Перенаправление не останавливает повторную подачу?
PHP
$thisfile=$_SERVER["REQUEST_URI"];
if(isset($_POST['comment'])&&!empty($_POST['comment'])){
if($id!=0){
$comment=$_POST['comment'];
if ($comment_query=mysql_query("INSERT INTO `photosite`.`comments` VALUES ('$id', '', '$firstname', '$surname', '$photo_id', '$comment', '$time')")){
header('Location: photopage.php?photo_id='.$photo_id.'', true, 303);
exit;
}else {
echo 'Could not add comment';
}
}else {
echo'Please Log In to add a Comment';
}
}
Я не понимаю, почему мой
header('Location: photopage.php?photo_id='.$photo_id.'', true, 303);
exit;
Тем не менее, пользователь может повторно отправить данные? Это ссылка на ту же страницу, потому что она предназначена для добавления комментариев, поэтому, когда пользователь добавляет комментарий, страница обновляется до той же страницы. Но если вы обновляете снова, контент передается повторно, есть идеи, почему?
ОБНОВЛЕНИЕ: У меня действительно есть материал, отраженный перед всем этим кодом в том же документе. Это проблема?
Хорошо, я изменил действие формы на другую страницу для обработки. Были предыдущие вещи, выводящие на страницу, которая была проблемой!
3 ответа
Хорошо, похоже, я выяснил вашу проблему... Я думаю, что ваши отчеты об ошибках отключены, поэтому вы не видите предупреждение о заголовках: "Не удается изменить информацию заголовка - заголовки уже отправлены...".
Вы не можете отправлять заголовки или изменять их, так как они отправлены, поэтому вы должны включить буферизацию. использование ob_start()
в верхней части вашего кода. Это должно выглядеть так
<?php
ob_start();
..
Не используйте пробелы раньше <?php
,
И удалите параметр true, 303 из функции заголовка.
header('Location: photopage.php?photo_id='.$photo_id);
exit();
Пытаться
...
header('Location: /photopage.php?photo_id='.$photo_id.'', true, 303);
...
header('Location: photopage.php?photo_id='.$photo_id.'&added='.time());
exit;
должно сработать. Код, который вы предоставили, также должен работать. Header->location удаляет содержимое POST, поэтому, если вы обновите страницу впоследствии, она не должна повторно отправляться.
Нажатие кнопки НАЗАД - это отдельная история, вы не можете решить ее, если не используете уникальный токен для каждого запроса формы.
Пример:
//check if the token in the session matches the token in the post
if( isset( $_POST['token'], $_SESSION['token'])
&& $_SESSION['token'] == $_POST['token'] ){
//handle your post data
[...]
}
//set the token
$_SESSION['token'] = sha1(time().mt_rand());
//process your form
?>
[...]
<input type='hidden' name='token' value='<?php echo $_SESSION["token"];?>'/>
[...]