0

我正在处理简单的 Ajax 登录表单。

只有两个字段,登录名和密码:

<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

我经常做的一个好方法是返回一个JSON包含 asuccess和 a的对象errors

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 回答