Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax-使用jQuery发送对象数组_Javascript_Php_Jquery_Ajax - Fatal编程技术网

Javascript Ajax-使用jQuery发送对象数组

Javascript Ajax-使用jQuery发送对象数组,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我正在从表单数据构建一个对象数组,以便发送到处理脚本,然后该脚本将数据发送到API。API不允许CORS ajax请求,因此需要首先发送到外部脚本 我可以返回简单的字符串,但是当我对我拥有的数据进行字符串化时,服务器的响应总是POST或GET(两个都尝试过)数据只是一个空数组 JS $('#enrol').submit(function(e) { e.preventDefault(); var collection = []; $('#enrol .form-row'

我正在从表单数据构建一个对象数组,以便发送到处理脚本,然后该脚本将数据发送到API。API不允许CORS ajax请求,因此需要首先发送到外部脚本

我可以返回简单的字符串,但是当我对我拥有的数据进行字符串化时,服务器的响应总是POST或GET(两个都尝试过)数据只是一个空数组

JS

$('#enrol').submit(function(e) {
    e.preventDefault();

    var collection = [];

    $('#enrol .form-row').each(function() {
        var email = $(this).find('input[type="email"]').val();
        var c1Val = $(this).find('.c1').is(':checked') ? 'true' : 'false';
        var c2Val = $(this).find('.c2').is(':checked') ? 'true' : 'false';
        var c3Val = $(this).find('.c3').is(':checked') ? 'true' : 'false';
        var c4Val = $(this).find('.c4').is(':checked') ? 'true' : 'false';
        var c5Val = $(this).find('.c5').is(':checked') ? 'true' : 'false';
        var c6Val = $(this).find('.c6').is(':checked') ? 'true' : 'false';
        var c7Val = $(this).find('.c7').is(':checked') ? 'true' : 'false';

        var person = {
            'email'   : email,
            'course1' : c1Val,
            'course2' : c2Val,
            'course3' : c3Val,
            'course4' : c4Val,
            'course5' : c5Val,
            'course6' : c6Val,
            'course7' : c7Val,
        }
        collection.push(person);

    });

    var dataString = JSON.stringify(collection);

    $.ajax({
        url: 'http://www.example.com/script.php',
        data: dataString,
        crossDomain: true,
        success: function(response) {
            console.log(response);
        },
        error: function(response) {
            console.log(response);
            alert(response.responseText);
        }
    });
})
PHP

header("Access-Control-Allow-Origin: URLHERE");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

var_dump($_GET);

我没有得到的是,如果我只是JSON.stringify一个简单的字符串,我会得到返回的数据,但是对象数组似乎以空数组的形式到达php脚本——或者至少这是console.log所建议的。我已经输出了dataString变量,以确保它有数据—它有数据。

我自己的项目中也有类似的内容。 这对我很有用:

jsonObj = new Object();
jsonObj['email'] = email;
jsonObj['course1'] = c1Val;
.
.
.

 $.ajax({
            type: 'POST',
            url: 'http://www.example.com/script.php',
            data: {"data": JSON.stringify(jsonObj)},
            dataType:'JSON',
            cache: false,
.
.
.
});
PHP:

var_dump($_REQUEST['data']);

当数据以JSON格式到达时,PHP不会自动填充superglobals
$\u GET
$\u POST
。在PHP方面,您需要做两件事:

  • 手动捕获输入
  • JSON将其解码为PHP数据结构

    // capture your raw JSON
    $datastring = file_get_contents("php://input");
    // decode it into a PHP array
    $collectionArray = json_decode($datastring, true);
    
  • 在jQuery方面,可能不需要以下内容,但我将明确说明发送到服务器的内容类型:

    $.ajax({
        url: 'http://www.example.com/script.php',
        data: dataString,
        contentType : "application/json",
        ...
    

    解决方案很简单,我没有为post数组提供密钥-

    data: dataString
    
    应该是

    data: { data: dataString }
    

    然后,
    var\u dump($\u GET['data'))
    的输出包含了我发送的数据。

    我没有得到的是什么问题?这一位—“我可以返回简单的字符串,但是当我对我拥有的数据进行字符串化时,服务器的响应总是POST或GET(已经尝试了这两种)数据只是一个空数组。”您尝试了
    data:{mydata:collection},
    不带stringify@RiggsFolly这起作用(与stringify一起)-虽然我以前总是这样构造它,但这很愚蠢!如果你在回答中加上解释,我会标记为正确的
    dataType
    参数在这个上下文中没有任何作用。它告诉jQuery服务器将返回什么类型的数据;它不会改变jQuery发送数据或PHP接收数据的方式。这因为通过使用
    {“data”:JSON.stringify(jsonObj)}
    ,您不再发送JSON,而是发送一个查询字符串。如果打开浏览器控制台查看发送到服务器的内容,您将看到类似
    data=“”
    哪一个不是JSONstructure@BeetleJuice…是的,关于数据类型参数,你是对的-在这个上下文中是无用的。但是问题仍然应该像这样解决…在它内部仍然是JSON-->$\u请求['data']是有效的JSON,可以被解码和进一步处理。