我有dashboard.php形式創建發票的形式重新提交和這個提交給invoice.php如何避免在PHP
現在我invoice.php插入發票和客戶到數據庫中,然後向我顯示發票訂單填寫表格。
如果我刷新此頁面,它會爲同一個客戶插入一張新發票,我該如何避免這種情況。
我在閱讀,我們可以通過重定向來避免它,但在我的情況下,我該如何使用它。有些事情像PRG(post/redirect/get)如何使用它?
我是否需要纔去插入項目發票
我有dashboard.php形式創建發票的形式重新提交和這個提交給invoice.php如何避免在PHP
現在我invoice.php插入發票和客戶到數據庫中,然後向我顯示發票訂單填寫表格。
如果我刷新此頁面,它會爲同一個客戶插入一張新發票,我該如何避免這種情況。
我在閱讀,我們可以通過重定向來避免它,但在我的情況下,我該如何使用它。有些事情像PRG(post/redirect/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";
}
看來我的工作不能刷新頁面,但是你能否告訴我一個熱門用法get和獲取一些變量,這些變量已經發布在表單中,而不是放入數據庫中,而是將在頁面中用於其他一些事情,比如說。我想在這裏顯示稅務信息,這是現在未知的..如何使用得到這裏..! – azzaxp 2012-04-14 20:03:47
您可以將這些值存儲在會話 – 2012-04-14 20:06:12
中,如第一個塊$ _SESSION ['tax'] = $ _POST ['tax'];並在第二個塊echo $ _SESSION ['tax'];要做這個工作,你必須調用session_start();一次即。在您的文件的頂部 – 2012-04-14 20:07:50
你聽說過的模式,使中間頁是這樣的:Post/Redirect/Get。 通常,POST用於操作,GET用於視圖。所以你永遠不會在POST請求中向用戶顯示一個頁面。相反,您將它們重定向到它們將使用GET請求的頁面,這不會導致數據庫發生任何更改。
你能分享我一個例如。代碼如何從get中請求,何時已經發布變量。 – azzaxp 2012-04-14 20:05:04
@azzaxp:你好像從@ zolex的回答中得到了這個結論......重定向用戶瀏覽器以通過GET請求下一個(或同一個)頁面的方式是使用'header('Location:/ page/');' – grossvogel 2012-04-14 20:19:15
下面是一個示例代碼爲您提供:
# 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");
}
讓dashboard.php將表單數據發佈到insert.php,它將處理數據,然後forwa rd發送到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();
?>
header();和exit();將刷新$ _POST,所以當用戶點擊瀏覽器時不再可用。
你的意思是說再次有一箇中間頁面..我想ZOLEX已經給出了一個好主意,似乎工作。 – azzaxp 2012-04-14 20:16:20
是的,他的想法很有效,但可能是因爲您希望將數據轉發到您不想在網址中顯示的發票,並且這些數據將在invoice.php中處理。例如,您可能會授予用戶一張優惠券,並且您不希望他選擇代碼從您的URL中創建該優惠券,因爲那麼他將爲invoice.php?coupon = 9823897453添加書籤,並一次又一次地將其調用爲從你的錯誤中獲利;-) – 2012-04-14 20:23:11
嗯..!這也是令人激動的。可能是我可以在其他一些模塊中使用它。謝謝.. – azzaxp 2012-04-15 06:16:15
請參閱 - http://stackoverflow.com/questions/3923904/preventing-form-resubmission – 2012-04-14 19:52:49