2010-06-29 3 views
3

Код, приведенный ниже, отлично работает. В файле с именем submit.php пользователь может ввести представление через форму. Форма отправляется в submit2.php, где некоторый код вставляет представление в базу данных MySQL. Все идет нормально.Предотвращение отправки от повторного представления при обновлении браузера

Возникла проблема: после того, как пользователь приземлился на submit2.php, если пользователь обновит браузер, появится всплывающее окно «Подтвердить заполнение формы». Затем, если пользователь нажимает «Продолжить» на этом всплывающем окне, представление будет повторно отправлено в базу данных MySQL.

Как сделать это сделать следующее на submit2.php:

  1. Всплывающее не появится, если браузер обновляется.

  2. Представления не будут повторно отправлены в базу данных.

Спасибо заранее,

Джон

На submit.php:

echo '<form action="http://www.domain.com/sample/submit2.php" method="post"> 
    <input type="hidden" value="'.$_SESSION['loginid'].'" name="uid"> 

    <div class="submissiontitle"><label for="title">Story Title:</label></div> 
    <div class="submissionfield"><input name="title" type="title" id="title" maxlength="1000"></div> 

    <div class="urltitle"><label for="url">Link:</label></div> 
    <div class="urlfield"><input name="url" type="text" id="url" maxlength="500"></div> 

    <div class="submissionbutton"><input name="submit" type="submit" value="Submit"></div> 
</form> 
'; 

На submit2.php:

if (isLoggedIn() == true) 
{ 

$remove_array = array('http://www.', 'http://', 'https://', 'https://www.', 'www.'); 
$cleanurl = str_replace($remove_array, "", $_POST['url']); 
$cleanurl = strtolower($cleanurl); 
$cleanurl = preg_replace('/\/$/','',$cleanurl); 
$cleanurl = stripslashes($cleanurl); 

$title = $_POST['title']; 
$uid = $_POST['uid']; 
$title = mysql_real_escape_string($title); 
$title = stripslashes($title); 
$slug = str_replace(' ', '-', $title); 

echo '-'.$site1.'-'; 

$cleanurl = mysql_real_escape_string(trim($cleanurl)); 

$site1 = 'http://' . $cleanurl; 

$displayurl = parse_url($site1, PHP_URL_HOST); 

function isURL($url1 = NULL) { 
     if($url1==NULL) return false; 

     $protocol = '(http://|https://)'; 
     $allowed = '[-a-z0-9]{1,63}'; 

     $regex = "^". $protocol . // must include the protocol 
         '(' . $allowed . '\.)'. // 1 or several sub domains with a max of 63 chars 
         '[a-z]' . '{2,6}'; // followed by a TLD 
     if(eregi($regex, $url1)==true) return true; 
     else return false; 
} 



if(isURL($site1)==true) 
    mysql_query("INSERT INTO submission VALUES (NULL, '$uid', '$title', '$slug', '$cleanurl', '$displayurl', NULL)"); 
else 
    echo "<p class=\"topicu\">Not a valid URL.</p>\n"; 

} else { 
    // user is not loggedin 
    show_loginform(); 
} 
+0

Ваша подготовка данных ужасна. делать stripslashes после mysql_real_escape_string странно и бессмысленно –

+0

Да ... большинство моего кода довольно уродливое. Я просто пытаюсь объединить что-то, что работает. – John

ответ

7

записей пользователей POST/Redirect/GET модель.

http://www.andypemberton.com/engineering/the-post-redirect-get-pattern/

+0

Я уже пробовал иметь "if ($ _ SERVER ['REQUEST_METHOD'] ==" POST ") {header ('Местоположение: http: //www.domain.com/sample/submit2.php ');} наверху submit2.php, но когда я это делаю, представление не может быть добавлено в базу данных. – John

+0

Убедитесь, что нет пустого места или пустых линий, за пределами '' брекеты. Любое пустое пространство будет отправлено и вызовет отправку заголовков. – RedFilter

0

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

Метод работает следующим образом:

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

Во-вторых, у вас есть страница обработки данных: info_submit.php Эта страница ничего не делает, кроме данных процесса и работы с базой данных. В браузере вообще не отображается вывод. После того как данные будут обработаны и вставлены в базу данных, эта страница перенаправляет пользователя на третью страницу, отправляя любую информацию, необходимую через GET (например, Redirect: info_confirm.php? Success = 1)

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

Это означает, что пользователь никогда не замечает, что существует вторая страница. Что касается (и, что более важно, браузера), то эта вторая страница не существует. Поэтому, когда пользователь обновляет третью страницу подтверждения, единственными переменными, которые загружаются, являются GET-вары, и никакая информация не возвращается в вашу БД.

+0

Хорошо, спасибо. Как мне перенаправить submit2.php? – John

+0
Смежные вопросы