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

フォームの送信が成功した後、同じページにリダイレクトし、オプションで送信が成功したことを示します

例:請求書.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();

?>

ヘッダ(); および 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 に答える