如何在php中避免Form Re提交

时间:2012-04-14 19:49:52

标签: php

我在dashboard.php中有一个表单来创建发票,并将其提交到invoice.php

现在我的invoice.php将发票和客户插入数据库,然后显示发票订单填写表格。

如果我刷新此页面,它会为同一客户插入新发票,我该如何避免这种情况。

我正在阅读我们可以通过重定向避免它,但在我的情况下我如何使用它。有点像PRG(post / redirect / get)如何使用它?

在将项目插入发票之前,我是否需要制作中间页面

4 个答案:

答案 0 :(得分:4)

您听说过的模式是:Post/Redirect/Get。 通常,POST用于操作,GET用于视图。因此,您永远不会在POST请求中向用户显示页面。相反,您将它们重定向到他们将使用GET请求的页面,这不会导致数据库中的任何更改。

答案 1 :(得分:1)

成功提交表单后,重定向到同一页面,并可选择表明提交成功

示例: invoice.php

if (count($_POST)) {

    if (/*post data is valid*/) {

        /*do whatever is needed*/
        header('Location: invoice.php?success');
    }
} else if (isset($_GET['success'])) {

     echo "Form successfuly submitted";
}

答案 2 :(得分:1)

让dashboard.php将表单数据发布到insert.php,它将处理数据然后转发到invoice.php。使用会话将数据从一个文件传输到另一个文件。这是insert.php:

<?php

session_start();

if (session_is_registered("invoiceVars"))
    session_unregister("invoiceVars");

if (!session_is_registered("errors"))
    session_register("errors");

$errors = array();

if (!session_is_registered("formVars"))
    session_register("formVars");

foreach($_POST as $f_varname => $f_value)
    $formVars[$varname] = trim(EscapeShellCmd(stripslashes($value)));

// process your data and write it to the database or return to dashboard.php with errors, then:

session_unregister("errors");

session_register("invoiceVars");

$invoiceVars = array();
foreach ($formVars as $i_varname => $i_value)
    $invoiceVars[$i_varname] = $i_value;

session_unregister("formVars");

// add additional variables
$invoiceVars["coupon"] = 'unique_coupon_code';

// invoice.php will process the data and display it
// it has session_start(); at the top, to have $invoiceVars available
header('Location: invoice.php');
exit();

?>

头();和exit();将刷新$ _POST,因此当用户回到浏览器时它将不再可用。

答案 3 :(得分:0)

以下是您的示例代码:

# database.php
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
session_start();

# dashboard.php
require_once("database.php");

function getSavedValue() {
    global $db;
    $sql = "SELECT input_text FROM temp_table WHERE sess_key='?'";
    $query = $db->prepare($sql);
    $query->bindParam(session_id());
    $query->execute();
    if ($query->rowCount() == 1)
        return $query->fetch();
    else
        return " ";
}

<form action="invoice.php" method="POST">
  <input type="text" name="getThisInfo" value="<?php echo getSavedValue(); ?>"/>
  <input type="submit" value="Send"/>
</form>

# invoice.php
if (isset($_POST["getThisInfo"]) && /* validation check */ 1) {
    require_once("database.php");
    $textInput = $_POST["getThisInfo"];
    $sql = "INSERT INTO perm_table(invoice_info) VALUES('?');";
    $query = $db->prepare($sql);
    $query->bindParam($textInput);
    $query->execute();
    $rows = $query->rowCount();
    echo "$rows invoices were inserted.";
    unset($_POST["getThisInfo"]);
    header("success.php");
} else {
    header("dashboard.php");
}