3

私は、何百ものクライアントがオンラインで製品を販売できるようにする Web サイトを運営しています。顧客が私のクライアントの Web サイトの 1 つにアクセスするとき、彼らは次のフォームでアクセスします。

www.site.com?userid=12345

ランディング ページで、ユーザー ID が 12345 のクライアントに関する情報と、そのクライアントが販売できる製品のリストについて、mysql ルックアップを実行します。私たちは 30 までの製品のスイートのみを提供し、それらを定義して、それらがどのように見えるかを知っていますが、すべてのクライアントが同じ価格で提供できるわけではありません. この情報の mysql テーブルは次のようになります。

userid | category | itemid | price
=================================
12345  |    1     |  1     | 1.00
12345  |    1     |  2     | 2.00
12345  |    1     |  3     | 3.00
12345  |    2     |  4     | 4.00
12345  |    2     |  5     | 5.00
67890  |    1     |  1     | 2.25
67890  |    2     |  4     | 8.00

顧客が www.site.com?userid=12345 にアクセスすると、次の検索が行われます。

SELECT category, itemid, price FROM tablename WHERE userid = 12345

*注 - はい、SQL インジェクションを防ぎます。

私が遭遇する問題は、PHP で後続の配列を構築する方法です。私の最初の考えは次のとおりです。

<?php
...

while ($row = $stmt->fetch()) {
  $products[]['category'] = $row['category'];
  $products[]['itemid'] = $row['itemid'];
  $products[]['price'] = $row['price'];
}


//the array will end up looking like this:
Array
(
    [0] => Array
        (
            [category] => 1
            [itemid] => 1
            [price] => 1
        )
    [1] => Array
        (
            [category] => 1
            [itemid] => 2
            [price] => 2
        )
    [2] => Array
        (
            [category] => 1
            [itemid] => 3
            [price] => 3
        )
    [3] => Array
        (
            [category] => 2
            [itemid] => 4
            [price] => 4
        )
    [4] => Array
        (
            [category] => 2
            [itemid] => 5
            [price] => 5
        )
)

?>

このような情報を取得する必要がある理由: 実際のサイト自体には、2 つの主要なカテゴリ (食べ物と飲み物) があります。クライアントがカテゴリ 1 の $products に商品を持っている場合は、ページに Food html セクションを表示します。クライアントがカテゴリ 2 の $products に商品を持っている場合は、ページに Drinks html セクションを表示します。

次に、すべてのカテゴリで使用できる定義済みの itemid のセットがあります。食品の場合は次の4つです。

  1. ペパロニ
  2. ソーセージ
  3. チーズ
  4. 野菜

ユーザーがこれらの itemid のいずれかを持っていない場合、その商品を販売することはできず、その商品は Food html セクションに表示されません。その商品が売れたら、そのセクション/アイテムの価格を参照して、実際のアイテムの横に表示できるようにしたい.

$products 配列に必要なすべての情報が含まれていることはわかっていますが、構造化の方法が最適かどうか、または説明どおりにページを構築するときに実際に参照する方法がわかりません。

例(このコードが正しくないことはわかっていますが、私が達成しようとしていることを言っています):

  • 「$products カテゴリ配列に 1 の値が存在する場合、食品セクションを表示します。」
  • 「$products itemid カテゴリ配列に 1 の値が存在する場合、ペパロニ ピザをページのオプションとして表示し、その特定のカテゴリ/アイテムの組み合わせに関連付けられた価格を表示します。」

任意のガイダンスをいただければ幸いです。

4

3 に答える 3

2
$products[]['category'] = $row['category'];
$products[]['itemid'] = $row['itemid'];
$products[]['price'] = $row['price'];

これにより、属性ごとに新しい配列が作成されます。使用する

$products[] = $row;

…行の内容を製品配列にコピーします。

于 2012-11-08T17:06:53.240 に答える
1

Zend を使用している場合、 $products = $query->fetchAssoc を itemid を最初の列として実行し、配列 $products[itemid1] => array(itemid1, 'category', 'price'), $products[itemid2] = を取得できます> array(itemid2, 'カテゴリ', '価格').

しかし、カテゴリについては、より良い解決策は次のとおりだと思います。

$products[$row['category']][$row['itemid']] = $row['price'];

したがって、次のように使用できます。

if (!empty($products[$foodid])) {
    echo "Food HTML part";
    if (!empty($products[$foodid][$cheeseid])) {
        echo "Cheese price = {$products[$foodid][$cheeseid]}";
    }
}

私はあなたの質問を理解することを願っています:)私の英語で申し訳ありません

于 2012-11-08T17:34:59.680 に答える
1

私はあなたが尋ねるすべてに従うかどうかはわかりませんが、行をループしているので、そこでカテゴリチェックを行ってみませんか.

//setup some flags
$food  = false;
$drink = false;

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
  $products[] = $row;
  if(!$food AND 1 == $row['category']){ //haven't seen food yet, check for it
    $food = true;
  } elseif (!$drink AND 2 == $row['category']) { //same for drink
    $drink = true;
  }
}

//later
if($food){
  //display food
} 

もちろん、これらのフラグを明示的に追跡するだけでなく、より一般的なアプローチの方が優れているようです。

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
  $products[] = $row;
  $categories[$row['category']] = true;
}

//later
if(in_array(1, $categories)){
  //display food
}

しかし、それはまだ少し望まれています。これはどう:

//use some OOP to make this cleaner (class constants)
define('FOOD' , 1);
define('DRINK', 2);

//setup default values
$categories = array(FOOD => false, DRINK = false);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
  $products[] = $row;
  $categories[$row['category']] = true;
}

//later
if($categories[FOOD]){
  //display food
}

そして、私があなたの質問を正しく理解していれば、製品が利用可能かどうかを (製品 ID を使用して) 確認する必要があるかもしれません。製品ループを変更して、それをキーとして追跡します。

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
  $products[$row['itemid']] = $row;
  $categories[$row['category']] = true;
}

//later
if(isset($products[$searchId])){
  //user has this product
}
于 2012-11-08T17:25:36.953 に答える