POST REDIRECT获取提交数据库中重复条目的表单


POST REDIRECT GET in form that submits to itself duplicate entries in database

由于不理解提交给自己的表单中的POST REDIRECT GET模式的基础知识,我正经历着一生中最艰难的时刻。主要问题是,当用户返回或刷新页面时,会在数据库中得到重复的条目所以基本上我有一个包含两个表单的页面,每个表单都提交给自己。我有一些关于PRG模式实现的代码,但它似乎不起作用。我将发布一个简短的例子,我将尝试解释我在做什么。

    <?php
    function saveUser1($UserName_1)
    {
    include 'db_conn.php';
    //MySQL code etc...    
        if($result) return 1; //registro correcto
        else return -2; //error
        header('Location: samepage.php' , true, 303);
    exit();
    }
    function saveUser2($UserName_2)
    {
    include 'db_conn.php';
    //MySQL code etc...    
        if($result) return 1; //registro correcto
        else return -2; //error
        header('Location: samepage.php' , true, 303);
    exit();
    }
    $error1 = 0;
    $error2 = 0;
    if(isset($_POST['userForm1']))
    {
        $error1 = saveUser1(clean_form($_POST['txtUserName_1']);
    }
    if(isset($_POST['userForm2']))
    {
        $error2 = saveUser2(clean_form($_POST['txtUserName_2']);
    }
    ?>
现在HTML
    <form action="" name="userForm1" method="POST">
    <label for="data">Some Data</label>
    <input type="text" value="some test data to post" name="txtUserName_1" id="txtUserName_1" /><br />
    <input type="submit" name="userForm1" id="userForm1"/>
    </form>
    <form action="" name="userForm2" method="POST">
    <label for="data">Some Data</label>
    <input type="text" value="some test data to post" name="txtUserName_2" id="txtUserName_2" /><br />
    <input type="submit" name="userForm2" id="userForm2"/>
    </form>

我刚刚创建了这个代码的例子,我试图完成,但我没有任何运气与PGR模式。你们能告诉我错误在哪里吗?或者重定向给我(不是开玩笑)一些关于这个主题的好教程?我一直在寻找很多问题/答案,博客,但我找不到任何真正可靠的(从我的角度来看)。

下面是示例代码,如果你想尝试。

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    Name: <input type="text" name="name">
    Email: <input type="text" name="email">
    Password: <input type="password" name="password">
    <input type="submit" value="submit" name="send">
</form>

PHP代码和common.php是数据库连接文件

<?php
   require_once "common.php";
   if(isset($_REQUEST['send']))
   {
      $name = $_POST['name'];
      $email = $_POST['email'];
      $password = $_POST['password'];
      $check = "SELECT * FROM user WHERE name = '".$name."' AND email = '".$email."' AND password = '".$password."'";
      $check_result = mysql_query($check) or die(mysql_error());
      if(mysql_num_rows($check_result) > 0)
      {
        header('Location : post.php');
      }
      else
      { 
        $sql = "INSERT INTO user (name,email,password) VALUES ('$name','$email','$password')";
        $result = mysql_query($sql) or die(mysql_error());
      } 
   }    
?>

不检查表单名称本身,而是检查表单中是否有唯一字段。例如如果收取($ _POST [txtUserName_1 "]))

表单名称本身在post中不存在。

查看发布的内容:

print_r ($ _POST);退出;

也许你必须将post action设置为同一页面。
你的表单不应该和你的提交按钮有相同的名字(不确定)。

<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >    
<label for="data">Some Data</label>
<input type="text" value="some test data to post" name="data" id="data" /><br />
<input type="submit" name="submit1" id="userForm1"/>
</form>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" name="form2" method="POST">
<label for="data">Some Data</label>
<input type="text" value="some test data to post" name="data" id="data" /><br />
<input type="submit" name="submit2" id="userForm2"/>
</form>

对于php:

if(isset($_POST['submit1']))
{
    $error1 = saveUser1(clean_form($_POST['txtUserName_1']);
}
if(isset($_POST['submit2']))
{
    $error1 = saveUser1(clean_form($_POST['txtUserName_2']);
}

你可以添加一个隐藏字段来检查它是否被执行:

<input type="hidden" name="executed" value="0"/>

,当你执行mysql查询

时,你可以将它设置为0。
function saveUser1($UserName_1)
{
if($_POST['executed'] == 0)
{
include 'db_conn.php';
//MySQL code etc...    
    if($result) $_POST['executed'] = 1; //registro correcto
    header('Location: samepage.php' , true, 303);
exit();
}
}