AJAX POST to PHP JSON error


AJAX POST to PHP JSON error

首先,我知道在StackOverflow上有很多非常相似的帖子。我已经把它们都看了一遍,但还是不能解决这个问题。

我有一个用户填写的表单,由于非常严格的JavaScript验证(必须保持在适当的位置),用户很可能在一两次失败后不得不返回表单。表单的提交触发一个JavaScript函数进行验证,然后使用AJAX将数据POST到PHP。

基本上,这些都发生在一个页面上。页面上有一个隐藏的div,在AJAX请求发出后通过jQuery加载,同时,表单本身随后被隐藏。页面根据从AJAX POST(通过$_POST)接收到的数据设置PHP变量,并通过cURL将此信息发送给API。

我正在调试'formData'对象之前张贴它与AJAX,它成功地捕获了我的信息,似乎是一个有效的对象。

当使用dataType: 'text'时,AJAX POST本身是成功的。但是,我需要dataType: 'json'。在将dataType: 'json'添加到我的AJAX POST后,它立即返回以下错误:
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
我的代码如下:

JAVASCRIPT/AJAX/JQUERY:

        formData = {
            "fname": $('#fname').val(),
            "middle": $('#middle').val(),
            "lname": $('#lname').val(),
            "sex": gender,
            "email": $('#email').val(),
            "address1": $('#address1').val(),
            "city": $('#city').val(),
            "state": $('#state').val(),
            "zip": $('#zip').val(),
            "phone": $('#phone').val(),
            "altphone": $('#altphone').val(),
            "email": $('#email').val(), 
            "year": $('#year').val(),
            "month": $('#month').val(),
            "day": $('#day').val(),
            "pass": $('#pass').val(),
            "pin": $('#pin1').val() + $('#pin2').val() + $('#pin3').val() + $('#pin4').val(),
            "ssn": $('#ssn1').val() + $('#ssn2').val() + $('#ssn3').val(),
            "username": $('#username').val()
        }
        console.debug(formData);
        // AJAX POST to the same page
        $.ajax({
            type: "POST",
            url: 'index.php',
            data: formData,
            dataType: 'json',
            success: function (data, textStatus, jqXHR) {
                // Switch divs
                $('#submit').addClass('visible');
                $('#form').addClass('invisible');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ': ' + errorThrown);
            }
        });

PHP代码#submit:

session_start();
// Variables
$fname = $_POST['fname'];
...
// Testing
var_dump($_POST);
echo "<br /><br />";
var_dump($_GET);
echo "<br /><br />";
var_dump($_REQUEST);
// cURL Stuff

$_POST, $_GET和$_REQUEST在使用dataType: 'text'时都返回空数组,尽管我很确定一旦JSON被修复,$_POST将正确通过。

我看不出JSON语法有什么问题,但它可能与AJAX应用的自动格式化有关。

希望这是一个微不足道的错误,有人可以很容易地发现!如果你能帮我找到,我将不胜感激:)

我认为您的问题是使用dataType和您实际输出的内容。dataType选项是告诉jQuery期望返回什么类型的数据。就我个人而言,我不喜欢它,因为jQuery可以很容易地猜出这一点。

第二,您实际上没有从PHP脚本输出任何JSON。PHP中的数组不会自动转换为JSON。你需要转换它。此外,您应该告诉浏览器使用标头会发生什么。在PHP中:

header("Content-Type: application/json");   //so jQuery knows what to expect
echo json_encode( $myArray );
exit;

json_encode ()

另一方面,省略dataType的好处是它可以让您更好地控制误差。而不是调用JSON.parse (jQuery为您使用dataType设置为json),您可以检查字符串是否是有效的json,如果不是,则向用户显示错误。

我找到解决方案了!实际上,我并没有返回到同一页面,而是返回到同一页面的刷新版本。因此,$_POST中不存在任何数据。我通过发布到一个单独的页面来解决这个问题,在那里设置内容类型,然后从该页抓取结果。