0

私は単純な Ajax ログインフォームに取り組んでいます。

ログインとパスワードの 2 つのフィールドのみ:

<form id="login-form" action="/login.php" method="post">
   <input type="text" name="username" placeholder="Username" />
   <input type="password" name="password" placeholder="Password" />
   <input type="submit" name="login" id="login" value="Log in" />
</form>

次に、それらを login.php ファイルの変数として設定します。

   $username = $_POST['username'];
   $password = $_POST['password'];

   if(!username_exists_in_my_database()) 
     // HOWTO: ajax displays 'Username doesn't exist next to username field
   if(username_exists_and_password_is_ok) 
     // HOWTO: NO AJAX, just send the form so my custom function logs the user
     // login($username);

フォームの AJAX からのエラーを表示し、ajax なしで通常どおり送信するにはどうすればよいですか? JSON はこれに対して十分に安全でしょうか?

4

2 に答える 2

1

まあ、問題なくエラーのあるjsonを送信し、ログインに成功したときにユーザーをリダイレクトできます(そして彼のSESSION / COOKIEを保存します)。

if(!username_exists_in_my_database()) 
     {
         header("Content-type: application/json");
         echo json_encode(array('error'=>'no such user'));
         die();
     } 

   if(username_exists_and_password_is_ok) 
     login($username);

function login($name){
   // store session etc
   header('Location: /index.php'); // redirect on succesful login
}
于 2013-03-10T21:22:01.617 に答える
1

これを行う良い方法は、 aと aJSONを含むオブジェクトを返すことです。successerrors

は次のJSONようになります。

{
    "success": false
    "errors": ["Username doesn't exist next to username field"]
}

次に、正常に送信されたフォームで、jQuery でsuccessパラメーターを確認し、失敗した場合はerrorメッセージを表示できます。

PHPで:

$errors = [];
$success = false;
$username = $_POST['username'];
$password = $_POST['password'];

if(!username_exists_in_my_database()) 
    $errors[] = "Username doesn't exist next to username field";
    $success = false;

header('Content-type: application/json');
return json_encode(array("errors" => $errors, "success" => $success));

エラーを表示するには、次の jQuery が便利です。

$form = $(this);
$.ajax({
    url: ...
    success: function(result) {
        if (!result.success) {
            if ($form.find('error').size() == 0) {
                $error_msg = $('<div class="error"></div>');
                $form.prepend($error_msg;
            }
            $error_msg.html(result.error).show();
        } else {
            $form.find('error').hide().remove();
        }
    }
});
于 2013-03-10T21:22:22.377 に答える