防止在刷新浏览器时重新提交提交

时间:2010-06-29 19:24:32

标签: php mysql

以下代码都很有效。在名为submit.php的文件上,用户可以通过表单输入提交。表单转到submit2.php,其中一些代码将提交内容插入MySQL数据库。到目前为止一切都很好。

问题在于:一旦用户登陆了submit2.php,如果用户刷新浏览器,则会出现“确认表单重新提交”弹出框。然后,如果用户在弹出窗口中点击“继续”,则提交将重新提交到MySQL数据库。

如何在submit2.php上执行以下操作:

  1. 如果刷新浏览器,则不会显示弹出窗口。

  2. 提交不会重新提交到数据库。

  3. 提前致谢,

    约翰

    在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();
    }
    

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:0)

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

该方法的工作原理如下:

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

其次,您有数据处理页面:info_submit.php 此页面只处理数据并使用数据库。根本没有输出显示给浏览器。处理完数据并将其插入数据库后,此页面将用户重定向到第三页,通过GET发送所需的任何信息(即重定向:info_confirm.php?success = 1)

第三,您有确认页面:info_confirm.php 此页面通过GET从第二页到查询字符串收到有关所需提交过程的任何信息。

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

相关问题