私はPHPで作業しており、フォームが投稿するアクションページを作成しています。ページはエラーをチェックし、すべてが正常であれば、データが投稿されたページにエラーをリダイレクトします。そうでない場合は、エラーとPOST変数を含むページにリダイレクトする必要があります。これがどのように機能するかの要点です。
HTMLは次のようになります...
<form name="example" action="action.php" method="POST">
<input type="text" name="one">
<input type="text" name="two">
<input type="text" name="three">
<input type="submit" value="Submit!">
</form>
action.phpは次のようになります...
if(error_check($_POST['one']) == true){
header('Location: form.php');
// Here is where I need the data to POST back to the form page.
} else {
// function to insert data into database
header('Location: posted.php');
}
エラーの場合、POST最初のページに戻る必要があります。入力が大きすぎるため、GETを使用できません。可能であれば、SESSIONを使用したくありません。これは可能ですか?
セッションを使用したくない場合、できることは同じページへのPOSTだけです。とにかく、どのIMOが最適なソリューションです。
// form.php
<?php
if (!empty($_POST['submit'])) {
// validate
if ($allGood) {
// put data into database or whatever needs to be done
header('Location: nextpage.php');
exit;
}
}
?>
<form action="form.php">
<input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
...
</form>
これはよりエレガントにすることができますが、アイデアを得る...
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
POSTを別の場所にリダイレクトすることはできません。要求をPOSTすると、ブラウザはサーバーから応答を取得し、POSTが実行されます。それ以降はすべて新しいリクエストです。そこに場所ヘッダーを指定すると、ブラウザーは常にGETメソッドを使用して次のページを取得します。
Ajaxを使用して、バックグラウンドでフォームを送信できます。そうすれば、フォームの値はそのままになります。サーバーが受け入れた場合でも、他のページにリダイレクトできます。サーバーが受け入れない場合は、エラーメッセージを表示し、ユーザーに入力を修正して再度送信させることができます。
ものにsmartyテンプレートを使用し、POST配列をsmarty配列として設定し、テンプレートを開きます。テンプレートでは、配列をエコーアウトするだけなので、合格した場合:
if(correct){
header("Location: passed.php");
} else {
$smarty->assign("variables", $_POST);
$smarty->display("register_error.php");
exit;
}
私はまだこれを試していませんが、解決策として試してみるつもりです。ただし、もちろんこの方法は、smartyを使用していることを前提としています。
そうでない場合は、エラーページでフォームを再作成し、情報をフォームにエコーするか、取得および取得で重要でないデータを送り返すことができます
例.
register.php?name=mr_jones&address==......
echo $_GET[name];
フォームをPOSTで送信する前に、フォームのデータを検証することは有益です。 JavaScript関数を作成してフォームのエラーを確認し、フォームを送信する必要があります。これにより、データが繰り返し送信されることを防ぎ、ブラウザの速度を低下させ、サーバー上の転送ボリュームを使用する可能性があります。
編集:
セキュリティが懸念される場合は、AJAXリクエストを実行してデータを検証するのが最善の方法です。 AJAXリクエストからの応答により、フォームを送信するかどうかが決まります。