2

当我尝试检索 JSON 中的值时收到未定义的错误。我是 ajax / js 等的新手,并试图创建一个“优雅的”下拉登录。

我尝试了各种方法并阅读了我在这里找到的一些帖子,但我注意到布局发生了一些变化,我也注意到我正在使用成功,现在已弃用。

因此,我是否可以寻求帮助,首先了解问题是什么以及我如何解决未定义的问题,其次是什么是实现这一目标的最佳方法。如果我能提供帮助,我宁愿不使用已弃用的代码。

我还注意到,自从更改代码以使其进入 ajax 调用的“成功”公园后,下拉框不再回滚或显示错误消息。-.-

提前致谢。

阿贾克斯

function validLogin(){
$('.error').hide();
var username = $('#username').val();
if(username == ""){
    $('label#usernameError').show();
    $('input#username').focus();
    return false;
}
$('.error').hide();
var password = $('#password').val();
if(password == ""){
    $('label#passwordError').show();
    $('input#password').focus();
    return false;
}

var params = {username: username, password: password};
var url = "../js/loginProcessAjax.php";

$("#statusLogin").show();
$("#statusLogin").fadeIn(400).html('<img src="images/loading.gif" />');

$.ajax({
    type: 'POST',
    url: url,
    data: params,
    datatype: 'json',
    beforeSend: function() {
        document.getElementById("statusLogin").innerHTML= 'checking...' ;
    },

    success: function(data) {
        alert("success Area ofAjax");

        $("#statusLogin").hide();

        if(data.success == true){
            alert("if data.success Area of Ajax");
            alert(data.message);

        }else{
            alert("data.message... " + data.message);//undefined
            $("#errorConsole").html(data.message);
        }

    },
    error: function( error ) {
        console.log(error);
    }
}, 'json');
}

PHP

<?php

if($_POST){

 if($users->userExists($username) === false){
    $data['message'] = "User doesn't exist";
    $data['success'] = false;

}else if($users->userExists($username) === false){
    $data['message'] = 'That username does not exist';
    $data['success'] = false;

}else if($users->emailActivated($username) === false){
    $data['message'] = 'You need to activate the account, please check your email.';
    $data['success'] = false;

}else{

    $login = $users->login($username, $password);

    if($login === false){

        $data['message'] = 'Incorrect Password or username';
        $data['success'] = false;
    }else{
        $data['success'] = true;
        //destroy old session and create new - prevents session fixation attacks
        session_regenerate_id(true);
        //all details are correct - the method returns the id to be sotred as a session
        $_SESSION['id'] = $login;
    }

    echo json_decode($data);
}

}

标记:

<form method="post" action="" id="ourLoginFormID_JS">
                    <div class="ourContactFormElement2">
                        <label for="username">Username:</label>
                        <input type="text" id="username"  name="username" autocomplete="off" class="required" value="<?php if(isset($_POST['username'])) echo htmlentities($_POST['username']); ?>"  />
                    </div>

                    <div class="ourContactFormElement2">
                        <label for="password">Password:</label>
                        <input type="password" id="password" name="password" autocomplete="off" class="required"/>
                    </div>

                    <div class="ourContactFormElement2">
                        <label> &nbsp; </label>
                        <input type="submit" name="loginButton" id="loginButton" value="Login!" onclick="validLogin(); return false;"/>
                    </div>

                    <div id="statusLogin"></div>
                </form>
4

3 回答 3

2

else如果最后一个块执行,您的 if/else/else/else 链仅输出 json 。您需要将 json_encode 调用移到块外:

if (...) {
} else if (...) {
} else if (...) {
} else {
 ...
}
echo json_encode($data);

这样,无论实际执行的各种 if() 子句中的哪一个,您的代码都将输出编码的 $data。

于 2013-07-19T15:18:44.543 回答
1

您的未定义错误的问题是:

datatype: 'json',

Javascript 区分大小写,而属性dataType则不datatype。因此,不会告诉 jQuery 自动解析 JSON,因此您只是获取 JSON 字符串,从而导致data.message.

另外,我看不到您访问$_POST['username']的位置或实例化$users对象的位置,我看到$username但没有$_POST['username']

于 2013-07-19T15:25:52.760 回答
-1

有几件事。您可能希望在contentType此处显式使用 application/json 参数,以便清楚地知道您正在发送和接收 JSON。

主要问题是,当向 PHP 发送非表单编码的 POST 数据时,$_POST不会自动填充。您需要像这样阅读 http 原始输入:

$json = file_get_contents('php://input');

if(!empty($json)) { // replace your if($_POST) with this
    $object = json_decode($json);
    $username = $object->username;
    $password = $object->password;

    // the rest of your code

}
于 2013-07-19T15:21:59.110 回答