2012-02-17 16 views
0
<?php 
$transactionOutput = ""; 
$sql = mysql_query("SELECT * FROM transactions WHERE emailaddress='$email'"); 
$productCount = mysql_num_rows($sql); 
if($productCount > 0) { 
while($row = mysql_fetch_array($sql)) { 
    $item_id = $row["item_id"]; 
    $quantity = $row["quantity"]; 
    $size = $row["size"]; 
    $price = $row["price"]; 

    $sql = mysql_query("SELECT * FROM products WHERE id='$item_id'"); 
    $productCount = mysql_num_rows($sql); 
    while($row = mysql_fetch_array($sql)) { 
    $product_name = $row["product_name"]; 
    } 

    $transactionOutput .= "<tr>"; 
    $transactionOutput .= "<td align='center'>" .$product_name. "</td>"; 
    $transactionOutput .= "<td align='center'>" .$quantity. "</td>";  
    $transactionOutput .= "<td align='center'>" .$size. "</td>"; 
    $transactionOutput .= "<td align='center'>" .$price. "</td>"; 
    $transactionOutput .= "</tr>"; 
} 

    } else { 
$transaction_list = "You have made no transactions yet"; 
} 


?> 

私は2つの異なるテーブルからデータにアクセスし、次に製品テーブルのidを一致させて各アイテムの製品名を返しますトランザクションテーブルから返されたitem_id。これは、私が知っている、これはまた、おそらく恐ろしくすぎ2つのテーブルからデータを選択し、データを返し、アイテムIDから製品名を取得

+0

uは、なぜそれらが起こっているのか理解できるかどうかを確認するためにそれらのSQLを手動で実行しましたか? – DarthVader

+0

LEFT JOINを読んでください。さらに、 '$ email'と' $ item_id'はソースではありません(あなたが '$ _GET'、' $ _POST'、 '$ _REQUEST'などから抽出しないことを望みます)。次の問題は、クエリパラメータがサニタイズされず、SQLインジェクション攻撃に対して脆弱になることです。最後に、関数のmysqlファミリは廃止予定とみなされるべきであるため、PDOを使用してください。 – Kenaniah

+0

$ emailの値は私が持っているユーザーセッションのもので、$ item_idはデータベースのトランザクションテーブルのものです –

答えて

1

プログラムされている問題は、結果セットを格納するために同じ変数$sqlを使用していることであることを出力正しい情報がしかし、それは唯一の最初のトランザクションなし他人を示しているようですん両方のクエリからそれでは、ここで起きている可能性があることはこれです:

  1. トランザクションクエリが実行され、結果セットが最初のレコードが最初の取引記録、製品のクエリのトランザクションのResultSet
  2. から読み込まれ
  3. $ SQLで保存されています実行され、結果セットが$ SQLで再び保存されている出力は$ transactionOutputに格納され
  4. 次のレコードのトランザクション結果セット
から読み込まれます

手順5が問題です。元のトランザクションの結果セット - $sql - が製品の結果セットによって上書きされたためです。

製品のクエリのための別の変数を使用してみてください:

$rsProduct = mysql_query("SELECT * FROM products WHERE id='$item_id'"); 
    $productCount = mysql_num_rows($rsProduct); 
    while($row = mysql_fetch_array($rsProduct)) { 
    $product_name = $row["product_name"]; 
} 

は、上記の希望は理にかなっています!

EDIT:追加の提案として、JOINクエリを使用して、同じクエリでトランザクションと商品の両方を取得することをおすすめします。ここをクリック:

SELECT `t`.*, `p`.`product_name` 
FROM `transactions` `t` 
LEFT JOIN `products` `p` ON `t`.`item_id` = `p`.`id` 
WHERE `t`.`emailaddress` = '$email'; 

結果セットをループするだけで完了です。

+0

のように、クエリ入力のサニタイズを忘れないでください。 mysql_real_escape_string()を読む – Abhay

0
<?php 
$transactionOutput = ""; 
$sql = mysql_query("SELECT * FROM transactions WHERE emailaddress='$email'"); 
$productCount = mysql_num_rows($sql); 
if($productCount > 0) { 

while($row = mysql_fetch_array($sql)) { 
    $item_id = $row["item_id"]; 
    $quantity = $row["quantity"]; 
    $size = $row["size"]; 
    $price = $row["price"]; 

    $sql = mysql_query("SELECT * FROM products WHERE id='$item_id'"); 
    $productCount = mysql_num_rows($sql); 

    #I suggest you use a different variable (i.e. not $row) here; 
    #at this point $row from the first while is still in scope 
    #and clobbering it may be causing the problem you see with 
    #only the first transaction showing.   
    while($row = mysql_fetch_array($sql)) { 
    #If you only need the first product_name, then you don't need the loop, just 
    #$row2=mysql_fetch_arrqy($sql); 
    #$product_name = $row2["product_name"]; 

    $product_name = $row["product_name"]; 
    } 

    $transactionOutput .= "<tr>"; 
    $transactionOutput .= "<td align='center'>" .$product_name. "</td>"; 
    $transactionOutput .= "<td align='center'>" .$quantity. "</td>";  
    $transactionOutput .= "<td align='center'>" .$size. "</td>"; 
    $transactionOutput .= "<td align='center'>" .$price. "</td>"; 
    $transactionOutput .= "</tr>"; 
} 

    } else { 
$transaction_list = "You have made no transactions yet"; 
} 


?> 
+0

ありがとうございます。これはうまくいきましたが、私は以下の左の結合クエリを使用することにしました! –

+0

優れている、私はまた、参加したクエリが行く方法であることに同意します。ちなみに、 – Roadmaster

関連する問題