2012-02-20 109 views
0

例如,我在主頁上有此代碼。使用多維會話的PHP訂單

<?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 [「秩序」],我試圖挽救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結果是我只拿到訂單頁面的最後一個項目,而不是其他的前五年。我在這裏做錯了什麼?你怎麼看?

回答

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>';   
    } 
?> 

然後你需要遍歷數組後,並將其添加到會話陣列:

<?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]); 
} 
?> 
+0

看起來不錯@Ben。謝謝! – awongCM 2012-02-22 04:39:30

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變量,如果他們在正確的大小真的出現,陣列)

+0

一些注意事項:您可能要考慮使用'(s)printf'來格式化較長的輸出(請參閱我的編輯代碼);在void元素的末尾添加一個斜槓,例如'';你在循環中有一個小的錯字,你不是關閉表格行,而是打開一個新的(添加一個斜槓)。 – Czechnology 2012-02-20 04:38:59

+0

謝謝@Czechnology。這真的有幫助。每天學習新東西。 – awongCM 2012-02-22 04:37:36