我在dashboard.php中有一个表单来创建发票,并将其提交到invoice.php
现在我的invoice.php将发票和客户插入数据库,然后显示发票订单填写表格。
如果我刷新此页面,它会为同一客户插入新发票,我该如何避免这种情况。
我正在阅读我们可以通过重定向避免它,但在我的情况下我如何使用它。有点像PRG(post / redirect / get)如何使用它?
在将项目插入发票之前,我是否需要制作中间页面
答案 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");
}