0
// current session id
$sid = session_id();

// get current cart session
$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";
$r = dbQuery($query);

//Cycle through the cart and compare each cart item to the cars to determine
  if the cart contains a car in it.
         while($cart = dbFetchAssoc($result)){
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product['pd_id']. "<br>";
    }
}

dbFetchAssoc()は、基本的に(mysql_fetch_assoc)であるカスタムデータベースレイヤーです。

クエリから行を取得し、その情報を使用して比較しようとしています。上記のechoステートメントを含むコードは、デバッグ目的でエコーしているだけです。whileループがネストされたループの後に終了する特別な理由はありますか?

4

1 に答える 1

2

はい。dbFetchAssoc($r)電話をかけるたびにカーソルが進んでいるため、クエリを再度実行する必要があります。

$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";

while($cart = dbFetchAssoc($result)){
    $r = dbQuery($query);
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product['pd_id']. "<br>";
    }
}

これは、データベースにあまり影響を与えない最適化されたバージョンです。ただし、これはこの特定の質問に固有であり、クエリセットが特に大きい場合は、同様に悪い選択になります。速度の問題ではなく、メモリの問題が発生します。

$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";
$r = dbQuery($query);

// cache the product results into an array
$products = Array();
while($product = dbFetchAssoc($r)){
    $products[] = $product['pd_id']
}

while($cart = dbFetchAssoc($result)){
    $index = 0;
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product[$index]. "<br>";
        $index++;
    }
}

この2番目のコードはテストしていませんが、アイデアは十分に明確であるはずです。

于 2012-08-31T15:17:53.333 に答える