簡體   English   中英

我執行Post / Redirect / Get模式的問題

[英]Problem with my implementation of the Post/Redirect/Get pattern

我總是在表單上使用Post / Redirect / Get方法。 我的表格通常總是提交給自己。 但是,當我在表單中有錯誤時,我不會發送任何新的標題。 這樣我就可以輕松地做這樣的事情

<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />

PHP只是一個處理2個參數的庫函數,$ _ POST鍵和一個默認值(如果不存在)。

這意味着,如果有人在表格中輸入錯誤,則不必再次填寫表格。 缺點是重新加載頁面會在瀏覽器中向其發出POST警告。

無論如何,有沒有避免這種情況的狀態,而不使用某些狀態(即cookie,會話,數據庫等)

我發現最好的方法是使用標頭函數。 您可以將文件發布到所需的任何文件,甚至文件本身也可以進行驗證,然后在失敗時使用標頭重定向返回到表單。 將張貼的值存儲在會話中或其他可訪問的變量中,因此您可以訪問先前輸入的數據。

當使用header(“ location:myscript.php”);時 確保包括一個exit(); 之后,否則您仍然會在刷新時收到POST警告。

myscript.php

if($_POST['submit'])
{
    //check for errrors

    if ($error)
    {
        $_SESSION['myPostVars'] = $_POST;
        header("location: myscript.php");
        exit();
    }
}

<form>
    // your form code
</form>

編輯:我剛剛注意到您編輯了問題以避免使用會話。

您可以序列化要返回的后變量,並將其放入查詢字符串中(通過header()發送

如果不在會話中保存狀態,則無法避免這種情況。 遇到錯誤時,您可能會執行以下操作:

  1. 產生一個唯一的ID
  2. $_POST變量復制到以上面的唯一ID為鍵的會話中
  3. 像現在一樣重定向,但是將唯一ID作為查詢字符串的一部分傳遞
  4. 更新您的庫以在會話中查找此唯一ID(錯誤情況),而不是直接訪問$_POST變量,如果在請求中未傳遞唯一ID或您要查找的名稱不存在,請使用默認值值
  5. 在請求結束時,從會話中刪除唯一ID條目。 這樣可以節省過多的垃圾污染會話。 您也可以在請求開始時執行此操作,具體取決於您的庫

我認為您的意思是這樣的:

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return htmlspecialchars($array);
    }

    return $default;
}

<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />

您可能還需要閱讀本教程

您基本上做對了。 沒有特別好的方法來避免“重新發布”警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM