[英]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()發送
如果不在會話中保存狀態,則無法避免這種情況。 遇到錯誤時,您可能會執行以下操作:
$_POST
變量復制到以上面的唯一ID為鍵的會話中 $_POST
變量,如果在請求中未傳遞唯一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.