【问题标题】:How to POST a multi-dimensional PHP array via a hidden input field using $.ajax?如何使用 $.ajax 通过隐藏的输入字段发布多维 PHP 数组?
【发布时间】:2013-06-09 21:41:15
【问题描述】:

我意识到对此还有一些其他问题,我已经阅读并尝试了解决方案,但它们对我不起作用。这可能是因为我将帖子序列化了两次,因为我传递了由 jQuery/JavaScript 序列化的整个表单。

我的 PHP 数组是二维的?一个包含文件名的:

$aDocumentFilesArrayFileName[0][0];

我的 PHP 中通常有一维数组,所以我使用以下方法传递它们:

<input type="hidden" name="arrayName[]" value="$value[$i]"> // (while in a loop

我不确定当我根据名称引用第一个数组时应该使用什么语法以及应该使用什么值。

我尝试将该值用作:serialize($aDocumentFilesArrayFileName) 并在另一端解码,但我收到错误消息,提示字符串预期找到数组?

** 编辑 **

我想我本可以更清楚地说明问题,但只是为了澄清。这是我的 jQuery Ajax 提交函数:

var conflictData = $("input, select", conflictsTable.fnGetNodes()).serialize(); // fnGetNodes is just a datatables function to go through every row in a table - don't worry about that

$.ajax(
{
    type: 'POST',
    url: 'sqlHandleConflictsDocumentRegister.php?node='+nodeType+'&id='+nodeId,
    cache: false,
    data: conflictData,
    success: function(result)
    {
        // Do stuff here
    }
});

我已经尝试了使用 json_encode 而不是对我的 PHP 输入语句进行序列化的解决方案。那是行不通的。这是我在 PHP 表单中使用的确切代码。请注意,此行在表单中表格的每一行发生的循环内。

<input type="hidden" name="arrayFileName[]" value="<?php echo json_encode($aDocumentFilesArrayFileName[$i]); ?>">

这是我在 PHP ajax 脚本中使用的代码:

$fileNames = json_decode($_POST['arrayFileName']);

错误是: json_decode() 期望参数 1 是字符串,数组在 C:\wamp\www\document\sqlHandleConflictsDocumentRegister.php 第 65 行给出

问题是我(在 JavaScript 中)序列化不同维度的数组数据吗? 我的其他输入来自具有简单数组数据(每行一个值)的行,它们工作正常。这个特定的数组输入与每个表行关联的文件名数量不受限制,因此输入值是一个数组。

我还在另一个输入中传递了文件数量(每个表格行)的值。也许我可以用它来帮助提取另一边的数组。

<input type="hidden" name="quantityFiles[]" value="<?php echo $aDocumentQuantityFiles[$i]; ?>">

** 更新 **

我使用了 alert(conflictData) 并发现数组数据很好,除了 arrayFileName 字段为空。 如果我回显 json_encode($aDocumentFilesArrayFileName[$i]) 那么我会得到预期的结果。

因此,看起来 jQuery serialize() 正在破坏这些数据。也许有一种方法可以更好地为 ajax 提交准备数据变量?

** 更新 2 **

感谢大家对答案的帮助和贡献。我已经在使用 json_encode 将数据导入到 javascript 中进行操作,所以我放弃了使用输入字段来序列化和发送数据,而是直接使用 $.ajax 的 data 参数来发送数组进行处理。

由于没有提供明显正确的解决方案,我在下面发布了一个解决方案并将其标记为正确答案,因为我现在能够在目标 PHP 文件中获取多维数组数据。

【问题讨论】:

标签: php jquery arrays


【解决方案1】:

通过 ajax 进行序列化(涉及用户)会打开一系列安全漏洞,因为用户可以让您反序列化对象并尝试执行该对象。

尝试使用合适的函数json,http://php.net/manual/en/book.json.php。 Json 是与 Ajax(Javascript) 一起使用的方式。

【讨论】:

  • 我已经编辑了这个问题。我不确定通过 ajax 进行序列化如何容易受到攻击?它一直用于stackoverflow的解决方案中。
  • owasp.org/index.php/PHP_Object_Injection 你去。这是一个扩展的演示文稿:turbochaos.blogspot.nl/2013/06/… 另请注意,您使用 json_decode 而不是 json_encode 会为您提供预期的字符串,但会给出数组错误,因为 json_decode 将字符串“解码”为原始形式。 json_encode 将变量/数组等“编码”成字符串(但我想你已经知道了)
  • 谢谢 - 我会读一读。至于 json_encode / json_decode 我想你可能看错了。我在源端编码并在目的地解码,这确定是正确的吗?
  • 是的,这是正确的,但是当您收到错误“错误是:json_decode() 期望参数 1 是字符串,给定数组”时,函数没有得到正确的 Json 字符串。但是你已经修复了我刚刚读过的问题。关于被销毁的数据,你使用Json有同样的结果吗?
  • 由于文件格式,我无法阅读演示文稿,但是我已经阅读了第一个链接,这似乎更多地是指代码注入、SQL 注入和其他因素,而不是序列化函数。不是批评,而是很多关于 SO 的回答从最初的问题多样化,以指出安全漏洞。然而,通常在不知道软件将在何处使用、用户以及是否从示例中删除额外的卫生代码的情况下给出建议。这对我来说似乎更为关键。仍然编码是一个+
【解决方案2】:

您可以使用 php 的 json_encode 函数将 php 数组发送到 javascript。

请使用

回声 json_encode($phpArray);

如果您使用 $.post() 方法或使用 $.ajax() 方法,则必须设置 $.post() 的最后一个参数为 'json',而不是必须设置

数据类型:'json'

http://api.jquery.com/jQuery.post/

【讨论】:

  • 我已经用我迄今为止用 json_encode 尝试过的内容更新了这个问题。我认为 $.ajax 无论如何都会自动检测类型,并且我正在使用 javascript 序列化数据来推送其他值,所以也许这就是导致该方法失败的原因?
  • 尝试 php 反序列化而不是 json_decode。 php.net/manual/en/function.unserialize.php
  • @ahbi - 仍然得到 unserialize() 期望参数 1 是字符串,给定数组
  • 谢谢 - 我已经阅读了那篇文章,但我需要更好地了解如何管理我的多维数组。这些是常规数组,$.ajax 数据变量的格式没有考虑到我正在传递其他几个序列化输入值(也是基本数组)。
【解决方案3】:

jQuery 序列化适用于常规数组,但在这种情况下不适用于多维数组。混合来自各种数组的数据时似乎会损坏。

解决方案:

json_encode 多维 PHP 数组数据并使用以下代码传递给 javascript:

<script>
    var aQuantityFiles = <?php echo json_encode($aDocumentQuantityFiles); ?>; // this is a regular array which is also related to the multidimensional array
    var aDocumentFilesArrayFileName = <?php echo json_encode($aDocumentFilesArrayFileName); ?>; // this is a multidimensional array
</script>

使用$.ajax请求中的data参数单独传递准备好的javascript变量:

$.ajax(
{
    type: 'POST',
    url: 'sqlHandleConflictsDocumentRegister.php?node='+nodeType+'&id='+nodeId,
    cache: false,
    data: 
    {
        aQuantityFiles: aQuantityFiles,
        aDocumentFilesArrayFileName: aDocumentFilesArrayFileName 
    },
    success: function(result)
    {
         //Do Something
    }
});

在目标 PHP 端,它现在非常简单(无需解码)

<?php

    $aQuantityFiles = $_POST['aQuantityFiles'];
    $fileNames = $_POST['aDocumentFilesArrayFileName'];

    for ($i = 0; $i < $numberRows; $i++)
    {
        // This is the bigger loop cycling through the rows of data which contain the multiple files
        for ($j = 0; $j < $quantityFiles; $j++)
        {
            // Echo to illustrate that data is extracted multidimensionally as expected
            echo $fileNames[$i][$j];                 
            echo "<br/>";
        }
    }
?>

可选

现在目标 PHP 文件接受了多维数组数据,但您可能需要在使用 $.ajax 发送之前将附加表单数据与扩展数组数据捆绑在一起。我发现了如何使用下面网站的 $.param 函数来做到这一点。 http://www.jblotus.com/2011/07/12/combine-serialized-form-post-data-with-arbitrary-object-in-jquery/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2022-01-05
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多