【问题标题】:Passing array from Javascript to PHP via POST通过 POST 将数组从 Javascript 传递到 PHP
【发布时间】:2012-06-23 19:39:21
【问题描述】:

我已经查看了有关此问题的其他几个建议,但由于某种原因,我的数据未发布。这是我的代码的相关部分:

<input type="button" id="map_submit" value="Map Selection" />
<?php var_dump($_POST); ?>  // display the posted variables

<script type="text/javascript">
    $(document).ready(function(){
        $('#map_submit').click(function(){

            /*  this part is from the slickgrid plugin, in which
             *  selectedData is an array that I want to post to the page
             *  and read via php
             */
            var selectedData = [], selectedIndexes;
            selectedIndexes = grid.getSelectedRows();
            jQuery.each(selectedIndexes, function (index, value) {
                 selectedData.push(grid.getData()[value]);
            });

            $.post("mapper.php", {dataArray: selectedData});
        });
    });
</script>

根据我从其他问题中看到的情况,$.post 应该可以工作。但是,当我单击按钮时,var_dump 没有显示任何内容。作为健全性检查,如果我将其添加到 javascript:

for (var i = 0; i < selectedData.length; i++) {
     document.write(selectedData[i].questionID + "<br />");
}

它将打印我在网格中选择的questionID 值(当然是新的空白页)。

【问题讨论】:

  • Pass Javascript Array -> PHP 的可能重复项
  • 如果你 console.log(selectedData);在 .post 之前?
  • 等等,这些代码是在同一个文件中吗?如果是,那么您似乎期望一段 PHP 运行客户端。它不是那样工作的。您需要在 $.post 上进行回调以对返回的数据进行处理。
  • 是的,给我们看看文件结构和var_dump()在哪里...
  • 使用 JSON 将您的 JS 数据编码为字符串,然后使用 PHP 中的json_decode 函数将其解码为 php 对象。

标签: php javascript jquery .post


【解决方案1】:
$.post("mapper.php", {dataArray: selectedData});

这条线很好。我不知道为什么每个人都建议使用 JSON,因为这里没有必要。您可以正常 POST 对象/数组而不使用 JSON。

注意:这不会重新加载页面。它将通过 AJAX 发布到mapper.php,因此不会在页面上的任何地方看到任何内容。您需要查看您的开发工具以查看 AJAX 调用返回的内容。

或者,您可以检查 POST 返回的数据。

$.post("mapper.php", {dataArray: selectedData}, function(data){
    console.log(data); // check your console, you should see some output
});

【讨论】:

  • 啊,是的。控制台打印了整个 html 页面。所以,基本上,我不能在同一页面中将数组从 jquery 发送到 php 对吗?
  • @Aaron:PHP 在服务器上运行。它输出浏览器呈现的 HTML 页面。一旦页面在您的浏览器中,PHP 就完成了运行。因此,您需要加载一个新页面来发送 POST 数据。由于您使用的是 AJAX,我建议创建一个新的 PHP 页面,在那里发布数据,然后将数据返回到您的页面。
  • 好的,我可以把我所有的数据库连接代码放到一个单独的 PHP 页面中,所以当它 POST 时它会更新数据库(设置 selectedData 时),获取新结果,然后 jquery 将必须接受该结果并更新网格?
  • 一个快速的后续问题:我无法读取 php.ini 中的数组。我将连接代码放入mapconnect.php。我也有这行 if (isset($_POST['dataArray']) 但是当 jquery 发布到该页面时它不会返回 true。有什么想法吗?
  • @Aaron:尝试var_dump($_POST)。我假设selectedData 实际上包含一些东西。 console.log(selectedData).
【解决方案2】:

您必须先序列化对象 pre-post,然后在服务器上反序列化(大概在 PHP 中),然后才能使用它。

以下示例(需要 json2.js):

<script type="text/javascript">
    $(document).ready(function(){
        $('#map_submit').click(function(){

            /*  this part is from the slickgrid plugin, in which
             *  selectedData is an array that I want to post to the page
             *  and read via php
             */
            var selectedData = [], selectedIndexes;
            selectedIndexes = grid.getSelectedRows();
            jQuery.each(selectedIndexes, function (index, value) {
                 selectedData.push(grid.getData()[value]);
            });

            $.post("mapper.php", JSON.stringify({dataArray: selectedData}));
        });
    });
</script>

<input type="button" id="map_submit" value="Map Selection" />
<?php var_dump(json_decode($_POST, true)); ?>  // display the posted variables

【讨论】:

  • 为什么需要JSON.stringify?仅使用正常的 POST 数据有什么问题?另外,我不确定json_decode($_POST, true) 是否会起作用。您需要阅读原始 POST 数据。 json_decode(file_get_contents('php://input'), true)
  • 我也不确定$.post 是否会让你发送这样的 JSON 字符串。
  • @Rocket:JSON.stringify 是将 JavaScript 对象序列化为 JSON 编码的字符串,然后可以将其发布到服务器。虽然 jQuery 有一个 $.parseJSON 函数,但出于某种原因,jQuery 开发团队忽略了包含一个 stringify 函数。 json_decode($_POST, true) 来自 php.net/manual/en/function.json-decode.php 的示例,展示了如何获取 JSON 编码的字符串并在服务器端反序列化它。
  • JSON 在这里仍然是错误的工具。为什么不使用 normal 后数组(查询字符串)将数据发送到 POST? $.post("mapper.php", {dataArray: selectedData}); Plus json_decode($_POST, true) 仍然不对。 $_POST 永远是一个数组。
猜你喜欢
  • 2014-04-30
  • 2014-03-15
  • 2013-01-06
  • 1970-01-01
  • 2010-11-25
  • 2018-02-17
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多