$idArray = array(1,2,3,4);
我可以用HTML写这行吗?
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$idArray}'>
或者我应该写:
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr[]={$idArray}'>
如何通过?
我应该如何在被调用的页面中处理它?</ p> 谢谢!!
答案 0 :(得分:43)
如果要将数组作为参数传递,则必须为每个元素添加一个参数。您的查询字符串将变为:
?arr[]=1&arr[]=2&arr[]=3&arr[]=4
正如其他人所写,你也可以序列化和反序列化数组。
但是你真的必须再次将数据发送给客户端吗?您似乎只需要一种方法在请求之间保留数据。
在这种情况下,最好使用sessions(docs)。这也更安全,否则客户端可以修改数据。
答案 1 :(得分:8)
使用serialize
和unserialize
PHP函数。
此函数为您提供可存储(字符串)版本的数组类型。
有关使用情况的更多信息,请阅读
http://php.net/manual/en/function.serialize.php
和http://www.php.net/manual/en/function.unserialize.php
答案 2 :(得分:3)
另一个选择(即使看起来不错,我也会说):
<form method='POST'>
<input type="hidden" name="idArray[]" value="1" />
<input type="hidden" name="idArray[]" value="2" />
<input type="hidden" name="idArray[]" value="3" />
<input type="hidden" name="idArray[]" value="4" />
</form>
但当然它会以POST方式发送。我不推荐使用serialize发送它,因为该函数的输出可能会变得很大,并且长度或URL是有限的。
答案 3 :(得分:3)
您可以使用序列化和&amp;与urlencode一起序列化 e.g。
发送时你可以像这样发送:
<?php
$array1 = Array(["key1"]=>"value1",["key2"]=>"value2");
$array2 = Array(["key1"]=>"value1",["key2"]=>"value2");
$data1="textdata";
$urlPortion= '&array1='.urlencode(serialize($array1)).
'&array2='.urlencode(serialize($array2)).
'&data1='.urlencode(serialize($data1));
//Full URL:
$fullUrl='http://localhost/?somevariable=somevalue'.$urlPortion
?>
在接收时,您可以按以下方式访问它们:
<?php
$destArray1=unserialize($_GET['array1']);
$destArray2=unserialize($_GET['array2']);
$destData1=unserialize($_GET['data1']);
?>
而且,Voila,您可以将该网址附加到ajax请求或普通浏览器页面上。
答案 4 :(得分:3)
答案 5 :(得分:2)
使用parse_str函数
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;
答案 6 :(得分:1)
http://snipplr.com/view/4444/passing-an-array-through-get-request/
$str=serialize($idArray);
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr=$str'>
要在接收页面中获取数据,您首先必须:
<?PHP
$idArray = unserialize($_GET["arr"]);
?>
答案 7 :(得分:0)
在您提到的特定情况下,我会将数组内爆为字符串,然后在发布表单时将其展开。
$str = rawurlencode(implode(",",$idArray));
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$str}'>
然后进行后期处理:
$idArray = explode(",",rawurldecode($_POST['arr']));
答案 8 :(得分:0)
serialize()
你的数组然后通过它。然后在其上调用unserialize()
。 http://ie.php.net/serialize
答案 9 :(得分:0)
会话是一种更安全,更清洁的方法。通过以下方式开始您的会话:
session_start();
然后将序列化数组添加为会话变量,如下所示:
$_SESSION["venue"] = serialize($venue);
只需在需要时调用会话变量即可。
答案 10 :(得分:0)
Felix's answer很好地回答了这个问题,但我认为缺少示例。
此答案由对Felix答案的评论提示。
您可以使用此方法指定密钥吗? – Qwerty 2014年4月27日,0:05
首先,说明费利克斯的答案:
<input type="hidden" name="array[]" value="val1" />
<input type="hidden" name="array[]" value="val2" />
<input type="hidden" name="array[]" value="val3" />
请求发送到服务器后,其类型为Array
。
以下是带有键的示例。这将为您提供一个包含两个键的数组,每个键两个值。
<input type="hidden" name="array['first']" value="val1" />
<input type="hidden" name="array['first']" value="val2" />
<input type="hidden" name="array['second']" value="val3" />
<input type="hidden" name="array['second']" value="val4" />
最后,这是VueJS的示例,这是我撰写本文时使用的示例,这使我想到了这个问题。
<input v-for="(value, key) in data" type="hidden" :name="'array[' + key + ']'" :value="value">
我希望这对任何路人都有帮助。
答案 11 :(得分:0)
另一种选择是先 json_encode 然后 base64_encode 然后 urlencode 然后将其传递到get请求中。
$idArray = [1,2,3,4];
$urlArray = urlencode(base64_encode(json_encode($idArray)));
$fullURL = 'https://myserver/mypath/myscript.php?arr=' . $urlArray;
收到后,您可以通过 urldecode 然后 base64_decode 然后 json_decode 返回原始数组。
$idArray = json_decode(base64_decode(urldecode($_GET["arr"])));
就像其他人提到的那样,您可以使用 serialize 和 unserialize ,但是使用 json_encode 和 json_decode认为更安全。从PHP7开始, unserialize 还有第二个参数,有关更多信息,请参见https://github.com/kalessil/phpinspectionsea/blob/master/docs/security.md#exploiting-unserialize
您可能不需要使用 base64_encode 和 base64_decode ,但我建议您使用。这将花费您一些处理资源,但会导致URL较短,从而节省了网络资源。请记住,如果您使用大型阵列,则可能会超出服务器的get请求所允许的长度限制。