【问题标题】:AJAX POST to PHP JSON errorAJAX POST 到 PHP JSON 错误
【发布时间】:2016-01-21 06:12:44
【问题描述】:

首先,我知道 StackOverflow 上有很多非常相似的帖子。我都看过了,还是没能解决这个问题。

我有一个用户填写的表单,并且由于非常严格的 JavaScript 验证(必须保持原位),用户可能会在一两次失败后返回表单。在使用 AJAX 将数据 POST 到 PHP 之前,表单的提交会触发一个执行验证的 JavaScript 函数。

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

在使用 AJAX 发布之前,我正在调试“formData”对象,它成功捕获了我的信息,并且似乎是一个有效的对象。

使用 dataType: 'text' 时,AJAX POST 本身是成功的。但是,我需要数据类型:'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);
            }
        });

#submit 中的 PHP 代码:

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 应用的自动格式有关。

希望这是一个容易被发现的小错误! 任何追踪它的帮助将不胜感激:)

【问题讨论】:

    标签: javascript php jquery json ajax


    【解决方案1】:

    我认为您的问题在于 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,如果不是,则向用户显示错误。

    【讨论】:

    • 感谢您的澄清!我一直认为 dataType 是您发送的内容,而不是您要检索的内容!我暂时把它排除在外,数组仍然是空的。我无法真正更改页眉,因为它也包含表单本身。另外,我绝对可以使用 json_encode 来帮助整理出所需的输出格式,但问题是目前绝对没有返回任何内容,所以遗憾的是,根本没有任何东西可以编码。
    • console.log 在 Ajax 调用之前为您提供了您所期望的?我会尝试从 formData 中的对象键中删除引号。您的情况不需要。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多