传递 Javascript 数组 -> PHP

Posted

技术标签:

【中文标题】传递 Javascript 数组 -> PHP【英文标题】:Pass Javascript Array -> PHP 【发布时间】:2011-06-29 11:08:18 【问题描述】:

假设我有一个包含一堆元素的 javascript 数组(从 50 到 200 个)。

我想使用 ajax 将它发送到 php(准备好的语句)。目前,我在循环中多次.load 一个 php 文件,但我想将其转换为数组并发送一次数组,加载 PHP 文件一次而不是 50-200 次。

array[i] = variable;

【问题讨论】:

JSON 是你的朋友 :-) 我们可以提供的建议质量受限于您的回答含糊不清。你能发布一些你正在使用的循环的示例代码吗? 如何通过 JSON 发送数据/在另一端检索数据? 【参考方案1】:

您可以使用 JSON.stringify(array) 在 JavaScript 中对数组进行编码,然后在 PHP 脚本中使用 $array=json_decode($_POST['jsondata']); 来检索它。

【讨论】:

别忘了清理你的输入,否则你就完蛋了! :D 您应该假设您的 PHP 脚本的任何输入都可能被有恶意的人破坏。运行您计划通过mysql_real_escape_string() 放入数据库查询的任何变量,以及通过htmlentities() 将放入屏幕的任何变量 @Gareth 使用 JSON.stringify(array) 后,是否必须将其插入 JSON 对象文字中,例如 datavar = array: array ?或者您可以在 .getJSON() 请求的参数中传递 array 代替 datavar 吗?例如.get(script.php, array, function(data) ...。另外,你的 $_POST 中是否总是 jsondata @Gnuey 您可以这样做:.get(script.php, JSON.stringify(array), function(data...,然后使用$postvars=file_get_contents('php://input');$array=json_decode($postvars, true); 检索它,或者您可以使用:.get(script.php, array: JSON.stringify(array), function(data... 并使用$array=json_decode($_POST['array'], true); 检索它。 只是为了确保,如果我有一个 $array 整数,stringify 也可以工作,并且在 SQL 查询中我需要将 $array(整数数组)与属性列中的整数相匹配?我读到整数没有特别区分,但我只是想确保在这种情况下。【参考方案2】:

AJAX 请求与通过<form> 元素发起的 GET 和 POST 请求没有什么不同。这意味着您可以使用 $_GET 和 $_POST 来检索数据。

当您发出 AJAX 请求时(jQuery 示例):

// JavaScript file

elements = [1, 2, 9, 15].join(',')
$.post('/test.php', elements: elements)

这(几乎)等同于发布此表单:

<form action="/test.php" method="post">
  <input type="text" name="elements" value="1,2,9,15">
</form>

在这两种情况下,在服务器端,您都可以从 $_POST 变量中读取数据:

// test.php file

$elements = $_POST['elements'];
$elements = explode(',', $elements);

为了简单起见,我在这里用逗号连接元素。不过,JSON 序列化是一种更通用的解决方案。

【讨论】:

我不知道为什么这不是被接受的答案,因为这正是 OP 所要求的并且减少了麻烦,尤其是某些框架会自动为您分解 POST 数组【参考方案3】:

这里有一个函数将js数组或对象转换成php兼容的数组作为http get请求参数发送:

function obj2url(prefix, obj) 
        var args=new Array();
        if(typeof(obj) == 'object')
            for(var i in obj)
                args[args.length]=any2url(prefix+'['+encodeURIComponent(i)+']', obj[i]);
        
        else
            args[args.length]=prefix+'='+encodeURIComponent(obj);
        return args.join('&');
    

prefix 是参数名。

编辑:

var a = 
    one: two,
    three: four
;

alert('/script.php?'+obj2url('a', a)); 

会产生

/script.php?a[one]=two&a[three]=four

这将允许您在 script.php 中使用 $_GET['a'] 作为数组。您需要通过提供从 js 调用 script.php 的 url 来进入您最喜欢的 ajax 引擎。

【讨论】:

什么是any2url?【参考方案4】:

因此,使用客户端循环来构建数组的二维数组,并在一个请求中将整个内容发送到 PHP。

在服务器端,您需要有另一个循环来定期插入/更新每个子数组。

【讨论】:

@Switz 我假设您使用的是$.get$.post 调用的data 参数。【参考方案5】:

您可以将数组从 javascript 传输到 PHP...

Javascript...ArraySender.html

<script language="javascript">

//its your javascript, your array can be multidimensional or associative

plArray = new Array();
plArray[1] = new Array(); plArray[1][0]='Test 1 Data'; plArray[1][1]= 'Test 1'; plArray[1][2]= new Array();
plArray[1][2][0]='Test 1 Data Dets'; plArray[1][2][1]='Test 1 Data Info'; 
plArray[2] = new Array(); plArray[2][0]='Test 2 Data'; plArray[2][1]= 'Test 2';
plArray[3] = new Array(); plArray[3][0]='Test 3 Data'; plArray[3][1]= 'Test 3'; 
plArray[4] = new Array(); plArray[4][0]='Test 4 Data'; plArray[4][1]= 'Test 4'; 
plArray[5] = new Array(); plArray[5]["Data"]='Test 5 Data'; plArray[5]["1sss"]= 'Test 5'; 

function convertJsArr2Php(JsArr)
    var Php = '';
    if (Array.isArray(JsArr))  
        Php += 'array(';
        for (var i in JsArr)
            Php += '\'' + i + '\' => ' + convertJsArr2Php(JsArr[i]);
            if (JsArr[i] != JsArr[Object.keys(JsArr)[Object.keys(JsArr).length-1]])
                Php += ', ';
            
        
        Php += ')';
        return Php;
    
    else
        return '\'' + JsArr + '\'';
    



function ajaxPost(str, plArrayC)
    var xmlhttp;
    if (window.XMLHttpRequest)xmlhttp = new XMLHttpRequest();
    elsexmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.open("POST",str,true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send('Array=' + plArrayC);


ajaxPost('ArrayReader.php',convertJsArr2Php(plArray));
</script>

和 PHP 代码... ArrayReader.php

<?php 

eval('$plArray = ' . $_POST['Array'] . ';');
print_r($plArray);

?>

【讨论】:

以上是关于传递 Javascript 数组 -> PHP的主要内容,如果未能解决你的问题,请参考以下文章

Laravel JavaScript 将数组从后端传递到 JavaScript 中的数组

将 C# 数组传递给 Javascript

将javascript数组传递给servlet

将 C# ASP.NET 数组传递给 Javascript 数组

将 C# ASP.NET 数组传递给 Javascript 数组

Javascript 是不是通过引用或值将数组传递给函数?