我意识到还有一些其他问题,我已经阅读过它们并尝试了解决方案,但它们并不适合我。这可能是因为我正在将帖子序列化两次,因为我传递的是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文件中获取多维数组数据。
答案 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'
答案 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/