将数组传递到另一页(表单)

时间:2016-11-22 22:15:15

标签: php arrays

我在page1.php上有以下数组和表单:

$my_array = array("Volvo", "BMW", "Toyota");

echo  " <form id=\"my_form\" action=\"page2.php\" method=\"post\" enctype=\"multipart/form-data\"> 
<input type=\"hidden\" name=\"id\" value=\"10\"> 
<input type=\"hidden\" name=\"input_name\" value=\"".serialize($my_array)."\" />

<a href=\"javascript:{}\" onclick=\"document.getElementById('my_form').submit(); return false;\">Send</a> </form>";

在page2.php上我想print_r数组:

$id = $_POST['id'];
$passed_array = unserialize($_POST['input_name']);

print_r($passed_array);

为什么我无法在第2页上收到my_array?我看不出我犯的错误!

PS:我在第2页收到 id

4 个答案:

答案 0 :(得分:3)

我很高兴@ksealey指出了一个更合适的方法,但是为了回答这个问题......它不起作用的原因是单独的序列化不足以阻止无效的html。查看序列化在html中留下的结果:

enter image description here

所以你需要确保你生成的html是有效的。您可以使用类似base64的编码来生成安全的html:

echo  " <form id=\"my_form\" action=\"\" method=\"post\"";
echo "enctype=\"multipart/form-data\">";
echo "<input type=\"hidden\" name=\"id\" value=\"10\">";
echo "<input type=\"hidden\" name=\"input_name\" ";

echo "value=\"".base64_encode(serialize($my_array))."\" />";

enter image description here

然后您可以将解码添加到输出中:

$passed_array = unserialize(base64_decode($_POST['input_name']));
print_r($passed_array);

答案 1 :(得分:2)

如果要在页面之间传递数据,请使用会话

<?php
 //Page 1
 session_start();
 $value = 'Value from page 1';
 $_SESSION['page_1_value'] = $value;
?>


<?php 
//Page 2
session_start();
echo 'Value from page 1: '.$_SESSION['page_1_value'];
$_SESSION = array(); //If you want to wipe the session data after


OR, pass as value params that get cleaned, JSON object maybe?

<form id="my_form" action="page2.php" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="id" value="10"> 
    <input type="hidden" name="input_name" value="<?php echo json_encode($my_array); ?>" />
    <a href="javascript:{}" onclick="document.getElementById('my_form').submit(); return false;">Send</a
</form>

<?php
//Page 2
$object = json_decode(strip_tags(stripslashes($_POST['input_name'])));
var_dump($object);

我会说第一个答案更安全。

答案 2 :(得分:0)

这是您的第一页生成的HTML:

<input type="hidden" name="input_name" value="a:3:{i:0;s:5:" volvo";i:1;s:3:"bmw";i:2;s:6:"toyota";}"="">

一个简单的解决方案是在

中替换双引号
value=\"".serialize($my_array)."\"

单引号如下:

value='" . serialize($my_array) . "'

或者您可以转义序列化数组中的引号,如下所示:

value=\"". htmlspecialchars(serialize($my_array))."\" 

答案 3 :(得分:0)

我将在这里加上我的2美分:)

您可能希望使用某种类型的框架,因为这样可以在这种情况下(或类似情况)为您轻松完成工作。例如,使用Codeigniter框架,您可以拥有一个表单(视图),将数据发送到控制器,在控制器中,您只需抓取整个数组:

$data = $this->input->post('array');
$data[0] should == 'Volvo'

所以观点:

<?php $my_array = array("Volvo", "BMW", "Toyota"); ?>
<form id="my_form" action="<?php echo site_url(controller_name/controller_function)" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="id" value="10"> 
    <input type="hidden" name="input_name" value="".serialize($my_array)."" />

控制器:

public function foo() {
    $data = $this->input->post('array');
    for($i=0; $i<sizeof($data); $i++) {
        echo $data[$i];
    }    
}