2010-06-29 190 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

您的数据准备是可怕的。在mysql_real_escape_string之后进行stripslashes是很奇怪和没有意义的 – 2010-06-29 19:37:38

+0

是啊...我的大部分代码都很丑陋。我只是想拼凑一些有用的东西。 – John 2010-06-29 19:49:43

回答

7
+0

我已经尝试了“if($ _ SERVER ['REQUEST_METHOD'] ==”POST“){header('Location:http://www.domain。com/sample/submit2.php');}在submit2.php的顶部,但是当我这样做时,提交不能被添加到数据库中。 – John 2010-06-29 19:46:05

+0

确保在 '''大括号之外不存在空格或空行。任何空白空间都将被发送,并且会导致标题被发送。 – RedFilter 2010-06-29 21:28:26

0

什么第一个答案/文章试图描述是许多网站/应用程序解决您遇到的问题,使用的方法。

的方法的工作原理如下:

首先,你有一个表单页面:info_form.php 这是将包含表单的页面。它会通过POST将这个表单数据提交到你的第二页。

其次,你有你的数据处理页面:info_submit.php 这个页面除了处理数据和处理数据库外,什么都不做。根本没有输出显示给浏览器。一旦数据被处理并插入到数据库中,该页面将用户重定向到第三页,通过GET发送任何所需信息(即重定向:info_confirm.php?success = 1)

第三,您有确认页面:info_confirm.php 此页面通过GET从第二页接收查询字符串,以获取它需要的提交过程的任何信息。

这意味着用户从不会注意到第二个页面存在。就他们(更重要的是浏览器)而言,第二页不存在。因此,当用户刷新第三个确认页面时,加载的唯一变量是GET变量,并且没有信息会重新提交给您的数据库。

+0

好的,谢谢。我将如何重定向submit2.php? – John 2010-06-29 20:18:57

+0

<?php sql insert delete update;/*(不输出任何内容或不会重定向)*/Header(“Location:submit3.php?infovar1 = data1&infovar2 = data2”); ?> – BinaryTox1n 2010-06-29 20:29:05