我在dashboard.php 中有一个表单来创建发票,并将其提交给invoice.php
现在我的 invoice.php 将发票和客户插入数据库,然后向我显示发票订单填写表格。
如果我刷新此页面,它会为同一客户插入一张新发票,我该如何避免这种情况。
我读到我们可以通过重定向来避免它,但就我而言,我该如何使用它。PRG(post/redirect/get)之类的东西如何使用它?
在将项目插入发票之前,我是否需要制作中间页面
我在dashboard.php 中有一个表单来创建发票,并将其提交给invoice.php
现在我的 invoice.php 将发票和客户插入数据库,然后向我显示发票订单填写表格。
如果我刷新此页面,它会为同一客户插入一张新发票,我该如何避免这种情况。
我读到我们可以通过重定向来避免它,但就我而言,我该如何使用它。PRG(post/redirect/get)之类的东西如何使用它?
在将项目插入发票之前,我是否需要制作中间页面
您听说过的模式是这样的:Post/Redirect/Get。一般来说,POST 用于操作,GET 用于视图。因此,您永远不会在 POST 请求中向用户显示页面。相反,您将他们重定向到他们将使用 GET 请求的页面,这不会导致您的数据库发生任何更改。
成功提交表单后,重定向到同一页面,并可选择指示提交成功
示例: 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";
}
让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,因此当用户返回浏览器时它不再可用。
这是一个示例代码:
# 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");
}