ユーザー登録用の基本的な HTML/PHP フォームに取り組んでいます。正常に動作しますが、解決したい問題があります。テスト中に、送信を押してパスワードが一致しない場合、(設計上) エラー ページが表示され、登録にリダイレクトされて、すべてをもう一度入力する必要があることに気付きました。フィールドにユーザーの入力を入力したままにしておく方法はありますか?
4 に答える
最善の方法は、AJAX を使用して、最初からページを離れる必要がないようにすることです。
それができない場合history.back()
、ユーザーを送り返すために使用すると、フォーム情報が保持されます。
それができない場合は、フォーム データを$_SESSION
変数に保存し、それを使用してフォームを再設定します。
セッションで送信されたデータを保存できます。
- によってphpセッションを開始し<?php session_start(); ?>
ます。この関数はタグの前に表示する必要があります
-次のように変数をセッションに保存します。$_SESSION['myVar']=$myVar;
-次の方法で(別のページで)取得します。$myVarFromSession = $_SESSION['myVar'];
-最後に、セッションとそのコンテンツを破棄します:<?php session_destroy(); ?>
ユーザーのパスワードをセッションに保存したり、クエリ パラメーターで渡したりすることは、セキュリティに問題があります。そのデータをリダイレクトして失うことを避けるために、同じフォーム ページにエラーを表示する必要があります。そうすれば、エラーは引き続き表示され、スクリプトには $_POST からのユーザーの入力データが引き続き含まれます。もちろん、フレームワークを使用するという Dan Schmidt の推奨事項は優れています。このフレームワークの目的は、あなたが現在経験している頭痛からあなたを救うことです。
エラーページにリダイレクトしたい場合は、ユーザー名をセッションに保存できますが、前述のようにパスワードを保存しないことを強くお勧めします.
クイック — 汚い
- クエリ文字列でユーザー名/パスワードを送り返します (?username=...&password=...)
- リダイレクトする前に SESSION 変数を設定する
より良い — ロジックをクラスにカプセル化する
要求、フォーム、検証、エラー メッセージ、およびレンダリング/ルーティング ロジックを処理するクラスに、さまざまな可動部分をカプセル化することを強くお勧めします。これは、手動でエラー メッセージやデータをスクリプト間でやり取りするよりもはるかに簡単です。サイトやアプリが大きい場合、またはベスト プラクティスに従ってより優れた開発者になりたい場合は、クラスが最適です。
さまざまなフレームワークがこの問題をどのように処理するかを見てみましょう。Yii、Laravel、Symfony2 は良い例です。箱から出してすぐに、この問題を迅速かつ簡単に解決できます。
サンプルコード
class LoginForm
{
public $password;
public $username;
public function validate()
{
// Perform validation
}
}
class HttpRequest
{
public function getIsPostRequest()
{
return 'POST' === $_SERVER['REQUEST_METHOD'];
}
public function getPost($name, $default=null)
{
return isset($_POST[$name]) ? $_POST[$name] : $default;
}
}
// This code processes the request to your login page.
// View::renderFile() renders a "view", which is a mix
// of HTML/PHP code that gets served back to the browser.
$request = new HttpRequest();
$form = new LoginForm();
if ($request->getIsPostRequest()) {
$form->username = $request->getPost('username');
$form->password = $request->getPost('password');
if ($form->validate()) {
// Login the user...
}
}
View::renderFile('login.php', array(
'form' =>$form,
));