php订单使用多维会话

时间:2012-02-20 04:18:21

标签: php multidimensional-array session-state

例如,我在主页上有这段代码。

<?php
session_start();
$_SESSION['order']=array();

?>
<form name="orderform" method="post" action="e.php">
Product Catalog
<table border="1">
<tr>
    <td>Product</td>
    <td>Price</td>
    <td>Quantity</td>
</tr>
<?
    for($i=0;$i<6;$i++){
        echo '<tr>';
        echo '<td><input type=hidden name="product" value="'.$i.'"> Product     '.$i.'</td>';
        $price=rand(1,10);
        echo '<td><input type=hidden name="price"     value="'.$price.'">$'.$price.'</td>';
        echo '<td><input type=text name="quantity"></td>';
        echo '<tr>';        
    }
?>
</table>
<br>
<input type="submit" name="submit" value="submit">
</form>

我有一个多维会话数组,$ _SESSION ['order']我正在尝试保存这个6个产品项目的订单形式,以及它的价格和数量,所以它可以在POST后的下一页上检索方法已被采取行动。

即在e.php文件

<?php

session_start();

$_SESSION['order'][] = array('product'=>$_POST['product'],
                                'price'=>$_POST['price'],
                                'quantity'=>$_POST['quantity']);
var_dump($_SESSION['order']);

if(count($_SESSION['order'])>0){
    foreach($_SESSION['order'] as $order){
        echo "<p>Product = ".$order['product']."</p>";
        echo "<p>Price = ".$order['price']."</p>";
        echo "<p>Quantity = ".$quantity['quantity']."</p>";
    }
}
?>

但是我在e.php上得到的结果是我只得到订单页面的最后一项,而不是其他前五项。我在这里做错了吗?你有什么想法?

2 个答案:

答案 0 :(得分:0)

问题是您有多个具有相同名称的表单字段。你需要这样的东西:

for($i=0; $i<6; $i++){
    $price = rand(1,10);
    printf('<tr>'.
             '<td><input type=hidden name="product[%1$d]" value="%1$d" />Product %1$d</td>'.
             '<td><input type=hidden name="price[%1$d]" value="%2$f" />$ %2$f</td>'.
             '<td><input type=text name="quantity[%1$d]" /></td>'.
           '</tr>',
           $i, $price);
}

for ($i = 0; $i < count($_POST['product']; $i++) {
    $_SESSION['order'][] = array('product'=>$_POST['product'][$i],
                                 'price'=>$_POST['price'][$i],
                                 'quantity'=>$_POST['quantity'][$i]);

(对于生产,你应该检查POST变量,如果它们确实存在,并且数组的大小正确。)

答案 1 :(得分:0)

_POST多个字段具有相同的name属性,因此$_POST变量将仅包含您要发布的最终唯一名称。您可以为每个输入创建唯一的名称,也可以将字段作为数组发布。唯一名称如下所示:

<?
    for($i=0;$i<6;$i++){
        echo '<tr>';
        echo '<td><input type=hidden name="product'.$i.'" value="'.$i.'"> Product     '.$i.'</td>';
        $price=rand(1,10);
        echo '<td><input type=hidden name="price'.$i.'"     value="'.$price.'">$'.$price.'</td>';
        echo '<td><input type=text name="quantity'.$i.'"></td>';
        echo '<tr>';        
    }
?>

然后你需要遍历post数组并将其添加到会话数组中:

<?php
$i=0;
while(isset($_POST['product'.$i])){
   $_SESSION['order'][] = array('product'=>$_POST['product'],
                                'price'=>$_POST['price'],
                                'quantity'=>$_POST['quantity']);
   $i++;
}
?>

您也可以将其作为数组发送:

<?
    for($i=0;$i<6;$i++){
        echo '<tr>';
        echo '<td><input type=hidden name="product[$i]" value="'.$i.'"> Product     '.$i.'</td>';
        $price=rand(1,10);
        echo '<td><input type=hidden name="price[$i]"     value="'.$price.'">$'.$price.'</td>';
        echo '<td><input type=text name="quantity[$i]"></td>';
        echo '<tr>';        
    }
?>

并且像这样得到它:

<?php
foreach($_POST['product'] as $key => $value){
   $_SESSION['order'][] = array('product'=>$_POST['product'][$key],
                                'price'=>$_POST['price'][$key],
                                'quantity'=>$_POST['quantity'][$key]);
} 
?>