将JavaScript数组传递到PHP

79
假设我有一个 JavaScript 数组,其中包含许多元素(从50到200个不等)。我希望使用 AJAX 将其发送到 PHP(准备好的语句)。目前,我在循环内部多次 .load 一个 PHP 文件,但我想将其转换为一个数组,并一次发送该数组,仅加载一次 PHP 文件而不是 50-200 次。 array[i] = variable;

14
JSON 是你的朋友 :-) - Ben Everard
1
我们能够提供的建议质量受到您回答含糊不清的限制。您能否发布一些使用的循环的示例代码? - user229044
1
我如何通过JSON发送数据并在另一端检索它? - switz
5个回答

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

19
别忘了对你的输入进行清理,否则你就会很惨! :D - Stephen
14
您应该假设您 PHP 脚本的任何输入都有可能被恶意人员篡改。请通过 mysql_real_escape_string() 函数处理任何计划放入数据库查询的变量,并通过 htmlentities() 函数处理任何将显示在屏幕上的内容。 - Gareth
1
@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); 检索它。 - Gareth
我认为如果你想将动态JavaScript数据发送到PHP,则不能使用此函数或任何其他函数,因为您需要刷新页面以使PHP接受新数据。 - Yosra MH
通过 $.post 发送的 JSON.stringify(array) 会将引号替换为 ",因此 json_decode 在处理它时无法正常工作,除非您使用 $array=json_decode(htmlspecialchars_decode($_POST['jsondata']));。 - klm123
显示剩余2条评论

41

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序列化是一种更普遍的解决方案。


2
我不知道为什么这个答案没有被接受,因为它正好回答了问题,而且还能减少麻烦,特别是一些框架会自动展开POST数组。 - zakius

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('&');
    }

前缀是一个参数名称。

编辑:

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中找到您喜欢的ajax引擎,以提供调用script.php的url。


1
什么是any2url? - Alex

0
使用客户端循环构建一个包含你的数组的二维数组,并将整个数组一次性发送到PHP。
在服务器端,您需要另一个循环来为每个子数组执行常规的插入/更新操作。

@Switz 我假设你正在使用 $.get$.post 调用的 data 参数。 - user229044

-1

你可以将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();}
    else{xmlhttp = 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);

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接