2012-04-14 81 views
0

我有dashboard.php形式創建發票的形式重新提交和這個提交給invoice.php如何避免在PHP

現在我invoice.php插入發票和客戶到數據庫中,然後向我顯示發票訂單填寫表格。

如果我刷新此頁面,它會爲同一個客戶插入一張新發票,我該如何避免這種情況。

我在閱讀,我們可以通過重定向來避免它,但在我的情況下,我該如何使用它。有些事情像PRG(post/redirect/get)如何使用它?

我是否需要纔去插入項目發票

+0

請參閱 - http://stackoverflow.com/questions/3923904/preventing-form-resubmission – 2012-04-14 19:52:49

回答

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"; 
} 
+0

看來我的工作不能刷新頁面,但是你能否告訴我一個熱門用法get和獲取一些變量,這些變量已經發布在表單中,而不是放入數據庫中,而是將在頁面中用於其他一些事情,比如說。我想在這裏顯示稅務信息,這是現在未知的..如何使用得到這裏..! – azzaxp 2012-04-14 20:03:47

+1

您可以將這些值存儲在會話 – 2012-04-14 20:06:12

+1

中,如第一個塊$ _SESSION ['tax'] = $ _POST ['tax'];並在第二個塊echo $ _SESSION ['tax'];要做這個工作,你必須調用session_start();一次即。在您的文件的頂部 – 2012-04-14 20:07:50

4

你聽說過的模式,使中間頁是這樣的:Post/Redirect/Get。 通常,POST用於操作,GET用於視圖。所以你永遠不會在POST請求中向用戶顯示一個頁面。相反,您將它們重定向到它們將使用GET請求的頁面,這不會導致數據庫發生任何更改。

+0

你能分享我一個例如。代碼如何從get中請求,何時已經發布變量。 – azzaxp 2012-04-14 20:05:04

+1

@azzaxp:你好像從@ zolex的回答中得到了這個結論......重定向用戶瀏覽器以通過GET請求下一個(或同一個)頁面的方式是使用'header('Location:/ page/');' – grossvogel 2012-04-14 20:19:15

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"); 
} 
1

讓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,所以當用戶點擊瀏覽器時不再可用。

+0

你的意思是說再次有一箇中間頁面..我想ZOLEX已經給出了一個好主意,似乎工作。 – azzaxp 2012-04-14 20:16:20

+0

是的,他的想法很有效,但可能是因爲您希望將數據轉發到您不想在網址中顯示的發票,並且這些數據將在invoice.php中處理。例如,您可能會授予用戶一張優惠券,並且您不希望他選擇代碼從您的URL中創建該優惠券,因爲那麼他將爲invoice.php?coupon = 9823897453添加書籤,並一次又一次地將其調用爲從你的錯誤中獲利;-) – 2012-04-14 20:23:11

+0

嗯..!這也是令人激動的。可能是我可以在其他一些模塊中使用它。謝謝.. – azzaxp 2012-04-15 06:16:15