【问题标题】:Send JavaScript array to PHP array via jQuery Ajax通过 jQuery Ajax 将 JavaScript 数组发送到 PHP 数组
【发布时间】:2014-09-04 02:20:27
【问题描述】:

我正在尝试通过 jQuery Ajax 将 JavaScript 数组发送到新的 PHP 数组:

var heart = [31,32,33,34,35,36,37,38,39,42,43];

$('#find_btn').click(function(){
    $.ajax({
        type: "POST",
        url: 'scripts/get_specimens_system.php',
        data: {
                system: heart,
        },
        success: function(data) {
            $('#search_list_container').html(data);
        }
    });
});

在 PHP 脚本中,我在 MySQL 查询之前有以下内容:

$system = array($_POST['system']);

如果我硬编码heart 中的数据,例如:

$system = array(31,32,33,34,35,36,37,38,39,42,43);

查询工作正常。我做错了什么?

为了简化问题,我忽略了我通过 system = $(this).attr('data-system'); 将 JS 数组设置为 var system 的事实

数据系统设置为数组,如:

$('#sub_category_box_systems').html("<a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + brain + "'>Brain</a><br /><hr><a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + nerves + "'>Nerves</a><br /><hr><a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + cerebellum + "'>Cerebellum</a>");

现在,如果我在 AJAX 语句之前提醒 system,则提醒会显示整数。

$('#sub_category_box_systems').on('click', '.sub_category_link', function() {
    system = $(this).attr('data-system');
});


$('#find_btn').click(function(){
    alert(system);
    $.ajax({
        type: "POST",
        url: 'scripts/get_specimens_system.php',
        data: {
            system: system,
        },
        success: function(data) {
        }
    });
});

我已将 PHP 文件更新为:

$system = $_POST['system'];

仍然不行,但如果我将 var system 与数组的实际 var(例如,heart)交换,作为 Ajax 数据它可以工作。那么这里有什么问题呢? (抱歉更改此 OP...)。

奇怪,如果我将 var system 更改为如下所示的特定数组,它可以工作,所以使用 jQuery .attr('data-system'); 进行格式化一定有问题

$('#sub_category_box_systems').on('click', '.sub_category_link', function() {
    system = heart;
});

【问题讨论】:

    标签: javascript php jquery ajax


    【解决方案1】:

    默认情况下,jQuery $.ajax 会将您的请求作为表单数据提交。如果您在发送请求时打开浏览器调试器,您会看到以下请求数据:

    system[]:31
    system[]:32
    system[]:33
    system[]:34
    system[]:35
    system[]:36
    system[]:37
    system[]:38
    system[]:39
    system[]:42
    system[]:43
    

    PHP 理解这是一个数组,并默认将其作为数组读入。 您不应将其包装在 array() 标记中。

    您可以将数组分配给您自己的变量,如下所示:$system = $_POST['system'];

    但是,您的工作还没有完全完成。 $system 现在是一个字符串数组。这是$system 中的var_dump

    array(11) {
      [0]=>
      string(2) "31"
      [1]=>
      string(2) "32"
      [2]=>
      string(2) "33"
      [3]=>
      string(2) "34"
      [4]=>
      string(2) "35"
      [5]=>
      string(2) "36"
      [6]=>
      string(2) "37"
      [7]=>
      string(2) "38"
      [8]=>
      string(2) "39"
      [9]=>
      string(2) "42"
      [10]=>
      string(2) "43"
    }
    

    用它把它转换成一个整数数组

    $system = array_map('intval', $system);

    【讨论】:

    • 实际上没有必要将它们转换为整数,因为 PHP 通常会在必要时将字符串转换为数字。
    • 依赖松散类型变量的陷阱很多。我不提倡对简单的网络应用程序使用强类型,但将数字设置为数字并将字符串设置为字符串当然是一种好习惯。如果我是 OP,我会将 POST 的数据类型更改为 application/json,以便 PHP 清楚他的数据是数字还是字符串。
    【解决方案2】:

    您在参数周围添加了一个额外的数组,该数组已经是一个数组。做吧:

    $system = $_POST['system'];
    

    【讨论】:

    • 或者如果尝试发送多维数组,使用 $system[0]
    • 仅当他只想要第一行时。
    • 为了简化问题,我省略了我通过 html 数据标签并使用 system = $(this).attr('data-system') 获取 JS 数组的事实;我应该更新 OP 还是打开一个新问题?
    • 数组的来源无关紧要。数组就是数组。
    • @Barmar,是的。 $system[0] 只会拉取多维数组的第一个索引。在这种情况下,这是 OP 需要的,因为我们看不到其他信息。
    【解决方案3】:

    我将答案授予@Barmar,因为他的解决方案解决了原始 OP。由于使用system = $(this).attr('data-system'),我仍然无法将 JS 数组传递到 PHP 数组。将代码更改为以下解决了该问题:

    $('#sub_category_box_systems').on('click', '.sub_category_link', function() {       
        system = $(this).attr('data-system').split(",");   
    });
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式将其转换为字符串:

      data: {
          system: heart.join(",")
      }
      

      然后在服务器端转换回数组:

      $system = explode(",",$_POST['system']);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 2020-01-25
        • 2017-09-20
        • 2019-06-22
        • 2010-09-22
        • 2018-03-18
        相关资源
        最近更新 更多