0

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

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

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

我读到我们可以通过重定向来避免它,但就我而言,我该如何使用它。PRG(post/redirect/get)之类的东西如何使用它?

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

4

4 回答 4

4

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

于 2012-04-14T19:53:11.567 回答
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";
}
于 2012-04-14T19:53:57.133 回答
1

让dashboard.php 将表单数据发布到insert.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();

?>

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

于 2012-04-14T20:14:12.530 回答
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");
}
于 2012-04-14T19:58:01.413 回答