如何使用$ .ajax通过隐藏的输入字段发布多维PHP数组?

时间:2013-06-13 13:21:48

标签: php jquery arrays

我意识到还有一些其他问题,我已经阅读过它们并尝试了解决方案,但它们并不适合我。这可能是因为我正在将帖子序列化两次,因为我传递的是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为字符串,在第65行的C:\ wamp \ www \ document \ sqlHandleConflictsDocumentRegister.php中给出数组

我在序列化(在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文件中获取多维数组数据。

3 个答案:

答案 0 :(得分:1)

序列化ajax(涉及的用户)会打开一系列安全漏洞,因为用户可以让你反序列化一个对象并尝试执行它。

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

答案 1 :(得分:1)

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

请使用

echo json_encode($phpArray);

你需要设置$ .post()的最后一个参数是'json'如果你使用的是$ .post()方法,或者你是usig $ .ajax()方法而不是你必须设置

dataType: 'json'

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

答案 2 :(得分:0)

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

解决方案:

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/