2

我意识到还有其他一些关于此的问题,我已经阅读了它们并尝试了解决方案,但是它们对我不起作用。这可能是因为我将帖子序列化了两次,因为我传递了由 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 的数据参数来发送数组进行处理。

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

4

3 回答 3

1

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

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

于 2013-06-13T13:28:58.757 回答
1

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

请用

回声 json_encode($phpArray);

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

数据类型:'json'

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

于 2013-06-13T13:32:11.707 回答
0

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/

于 2013-06-14T15:34:47.363 回答