2012-02-20 8 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に取得していた結果では、私が唯一の注文ページの最後の項目を取得しますが、ない他の過去5。私はここで何か悪いことをしたのですか?あなたの考えは?

答えて

0

あなた:あなたはこのようなものが必要だろう同じnameプロパティを持つ複数のフィールドを_POSTに追加すると、$_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]); 
} 
?> 
+0

良い@ベン。ありがとう! – awongCM

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

+0

ありがとう@Czechnology。それは本当に役立ちます。毎日何か新しいことを学ぶ。 – awongCM