Php 从JSON返回未定义的Ajax-登录系统&;最佳做法

Php 从JSON返回未定义的Ajax-登录系统&;最佳做法,php,javascript,jquery,html,ajax,Php,Javascript,Jquery,Html,Ajax,当我尝试在JSON中检索值时,收到一个未定义的错误。我是ajax/js等的新手,尝试创建一个“优雅”的下拉登录 我尝试过各种方法,读了一些我在这里找到的帖子,但是我注意到布局有所改变,我也注意到我正在使用success,现在已经不推荐了 因此,我可以寻求帮助,首先了解问题是什么,如何解决未定义的问题,其次是什么是实现这一目标的最佳方法。如果可以的话,我不想使用不推荐使用的代码 我还注意到,自从更改代码以使其进入ajax调用的“成功”区后,下拉框不再回滚或显示错误消息- 提前谢谢 阿贾克斯 fun

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

我尝试过各种方法,读了一些我在这里找到的帖子,但是我注意到布局有所改变,我也注意到我正在使用success,现在已经不推荐了

因此,我可以寻求帮助,首先了解问题是什么,如何解决未定义的问题,其次是什么是实现这一目标的最佳方法。如果可以的话,我不想使用不推荐使用的代码

我还注意到,自从更改代码以使其进入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');
}
函数validLogin(){
$('.error').hide();
var username=$('#username').val();
如果(用户名==“”){
$('label#usernamererror').show();
$('input#username').focus();
返回false;
}
$('.error').hide();
var password=$('#password').val();
如果(密码==“”){
$('label#passwordError').show();
$('input#password').focus();
返回false;
}
var params={username:username,password:password};
var url=“../js/loginProcessAjax.php”;
$(“#statusLogin”).show();
$(“#statusLogin”).fadeIn(400.html(“”);
$.ajax({
键入:“POST”,
url:url,
数据:params,
数据类型:“json”,
beforeSend:function(){
document.getElementById(“statusLogin”).innerHTML='checking…';
},
成功:功能(数据){
警报(“AJAX的成功区域”);
$(“#statusLogin”).hide();
if(data.success==true){
警报(“Ajax的if data.success区域”);
警报(数据、消息);
}否则{
警报(“data.message…”+data.message);//未定义
$(“#errorConsole”).html(data.message);
}
},
错误:函数(错误){
console.log(错误);
}
}“json”);
}
PHP


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

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

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

。您可能希望在这里显式地使用application/json的
contentType
参数,这样就可以清楚地看到您正在发送和接收json

主要问题是,当向PHP发送未进行表单编码的POST数据时,
$\u 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

}

未定义错误的问题是:

datatype: 'json',
Javascript区分大小写,属性是
dataType
而不是
dataType
。正因为如此,jQuery没有被告知自动解析JSON,因此您只需要获取JSON字符串,从而导致
data.message
上出现未定义的错误


此外,我看不到您在哪里访问
$\u POST['username']
,也看不到您在哪里实例化
$users
对象,我看到的是
$username
,但看不到
$\u POST['username']

FFS!睡眠剥夺--但仍然没有定义。正如这个答案所示,您应该对json进行编码,而不是解码;)抱歉,这两天太长了。更改为编码,清除缓存,重新加载,仍然未定义。错误处理程序中的console.log(错误)不能未定义。。。这就是xhr。不需要设置响应的内容类型,jQuery可以很好地确定响应数据类型。此外,jQuery的ajax函数会自动使用表单编码的内容类型进行post请求。从原始流读取不会解决javascript错误。。。这个答案似乎根本没有解决问题中描述的错误。就其本身而言,这并不是“错”,只是不是这里的解决方案(甚至不是相关的)。问题在于缺少
json\u encode
,而不是
$\u POST
@Chris的问题。响应数据类型已由其参数指定为json,因此在这种情况下不会尝试自动检测。contentType默认为
application/x-www-form-urlencoded
,这是正确的。我只是想说明一下您在处理请求时使用的数据类型。从代码片段中,我不清楚他是否真的试图访问$\u POST变量,因为在使用表单编码的contentType时会填充这些变量。感谢您指出错误。我改变了这一点,没有未定义的消息,但目前它没有做很多其他事情。在控制台中,我看到了对象及其所有方法,但它似乎没有得到任何结果。用户名和密码是在调用ajax之前从一开始就获得的。或者,我有什么地方完全错了吗?在ajax成功函数中,它是进入if还是else?目前它没有进入成功部分。它似乎冻结在:beforeSend:function(){document.getElementById(“statusLogin”).innerHTML='checking…';},不,没有。在控制台中,我看到对象及其函数列表。没有别的
$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

}
datatype: 'json',