0

我得到了以下 ajax 调用,它似乎正在工作(如表单提交、加载程序显示等)

<?PHP
session_start();

include('includes/class.login.php');

$login = new Login();

$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true));

if ($_POST['ajax']) {
    exit($login->getStatus());
}

?>
<style>
    #message { display: none; cursor: pointer; }
    .loader { display: none; }
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("#loginForm").submit(function(e) {
        $(this).fadeOut(300);
        $('.loader').delay(300).fadeIn(100);
        $.post("<?=$_SERVER['PHP_SELF'];?>", { username: $('#username').val(), password: $('#password').val(), ajax: true }).done(function(data) {
            if (data.logged_in == 1) {
                // Redirect with javascript
                $('.loader').delay(2000).fadeOut(100);
                $('#message').html('<p>Success! We\'ll redirect you in a minute...</p>'+data.logged_in).delay(2200).fadeIn(200);
            } else {
                // Inject errors to html
                // data.errors
                $('.loader').delay(2000).fadeOut(100);
                $('#message').html('<p>Failed... Click to try again!'+data.errors+data.logged_in).delay(2200).fadeIn(200);
                $('#message').on('click', function(){
                    $(this).fadeOut(200);
                    $('#loginForm').delay(350).fadeIn(200);
                });
            }
        }); 
        return false;
    });
});
</script>
<form id="loginForm" method="POST" action="">
    <table>
        <tr><td>Username:</td><td><input type="text" name="username" id="username"/></td></tr>
        <tr><td>Password:</td><td><input type="password" name="password" id="password"/></td></tr>
    </table>
    <input type="hidden" name="token" value="<?=$token;?>"/>
    <input type="submit" name="login" value="Log In"/>
</form>
<div class="loader">
    <img src="loader.gif"/>
</div>
<div id="message"></div>

您将在我的消息输出中看到我尝试附加 data.errors 和 data.logged_in 以找出它们所持有的值,但是它们都只是以未定义的形式返回。

我的 php 类中的 JSON 代码是这样的:

public function getStatus()
    {
        return json_encode(
            array(
                'logged_in' => $this->isLoggedIn(), 
                'errors' => $this->showErrors()
            )
        );
    }

整个 PHP 类:

<?PHP

class Login 
{
    private $_id;
    private $_username;
    private $_password;
    private $_passmd5;

    private $_errors;
    private $_access;
    private $_login;
    private $_token;

    public function __construct()
    {
        $this->_errors = array();
        $this->_login  = isset($_POST['login']) ? 1 : 0;
        $this->_access = 0;
        $this->_token  = $_POST['token'];

        $this->_id     = 0;
        $this->_username = ($this->_login) ? $this->filter($_POST['username']) : $_SESSION['username'];
        $this->_password = ($this->_login) ? $this->filter($_POST['password']) : '';
        $this->_passmd5  = ($this->_login) ? md5($this->_password) : $_SESSION['password'];

    }

    public function isLoggedIn()
    {
        ($this->_login) ? $this->verifyPost() : $this->verifySession();

        return $this->_access;
    }

    public function filter($var)
    {
        return preg_replace('/[^a-zA-Z0-9]/','',$var);
    }

    public function verifyPost()
    {
        try
        {
            if(!$this->isTokenValid())
                throw new Exception('Invalid form submission');

            if(!$this->isDataValid())
                throw new Exception('Invalid form data entered');

            if(!$this->verifyDatabase())
                throw new Exception('Invalid username/password combination');

        $this->_access = 1;
        $this->registerSession();
        }
        catch(Exception $e)
        {
            $this->_errors[] = $e->getMessage();
        }
    }

    public function verifySession()
    {
        if($this->sessionExist() && $this->verifyDatabase())
            $this->_access = 1;
    }

    public function verifyDatabase()
    {
        include('dbConfig.php');

        $data = mysql_query("SELECT user_id FROM users WHERE user_username = '{$this->_username}' AND user_password = '{$this->_passmd5}'");

        if(mysql_num_rows($data))
        {
            list($this->_id) = @array_values(mysql_fetch_assoc($data));
            return true;
        }
        else 
        {
            return false;
        }
    }

    public function isDataValid()
    {
        return (preg_match('/^[a-zA-Z0-9]/', $this->_username) && preg_match('/^[a-zA-Z0-9]/', $this->_password)) ? 1 : 0;
    }

    public function isTokenValid()
    {
        return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token']) ? 0 : 1;
    }

    public function registerSession()
    {
        $_SESSION['id'] = $this->_id;
        $_SESSION['username'] = $this->_username;
        $_SESSION['password'] = $this->_passmd5;
    }

    public function sessionExist()
    {
        return (isset($_SESSION['username']) && isset($_SESSION['password'])) ? 1 : 0;
    }

    public function showErrors()
    {
        echo "<h3>Errors</h3>";
        foreach($this->_errors as $key=>$value)
            echo $value."<br>";
    }

    public function getStatus()
    {
        return json_encode(
            array(
                'logged_in' => $this->isLoggedIn(), 
                'errors' => $this->showErrors()
            )
        );
    }   
}

?>

isLoggedIn 应该显示 0 或 1 并且 showErrors 显示错误数组,但我什么也没得到:(

4

2 回答 2

1

我看不到您实际输出 json 数组的位置。当您输出 JSON 时,请尝试在其前面放置以下行,或使用您的框架基本上确保您输出的是 JSON 标头。

if ($_POST['ajax']) {
    header('Content-Type: application/json');
    echo $login->getStatus();
    exit();
}
于 2013-04-26T22:03:33.450 回答
0

尝试在静态文件中制作非 AJAX 表单并将其提交到您的 PHP 脚本。你得到你期望的 JSON 数据了吗?

查看数据的另一种方法是使用浏览器开发者工具中的网络选项卡(我习惯使用 Chrome,但其他浏览器也有类似的工具)。这将告诉您故障是在客户端上的 Javascript 中还是在服务器上的 PHP 中。

于 2013-04-26T21:01:24.023 回答