POST REDIRECT GET以提交自身重复数据库条目的形式

时间:2013-01-22 19:33:08

标签: php html forms

我生命中最艰难的时刻是不理解提交给自己的表格中的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模式没有任何好运。 你能告诉我错误在哪里吗?或者重定向我(不开玩笑)关于这个主题的一些好的教程? 我一直在寻找很多问题/答案,博客,但我找不到任何真正可靠的东西(从我的角度来看)。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

不检查表单名称本身,而是检查表单中的唯一字段。例如。如果(isset($ _ POST [txtUserName_1 '']))

表单名称本身不会存在于帖子中。

要查看发布内容,请尝试:

的print_r($ _ POST); 出口;

答案 1 :(得分:0)

也许您必须将发布操作设置为同一页面 并且您的表单不应与提交按钮具有相同的名称(不确定)。

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

答案 2 :(得分:0)

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

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