0

私はphpが初めてです。次のタスクを適切に配置する方法を見つけるのを手伝ってくれませんか:

テーブル「製品」
ID - 詳細
1 - 1-30,2-134:6:0;;2-7:55:0;;1-2,2-8:25:0 - この文字列は非常に長くなる可能性があります
2 -
3 - 1-360:17:0;;1-361:185:0

すべての製品 1、2、3、... は 1 行で db に格納されますが、製品はさらにサイズと色ごとに個別に認識されます。そのため、一部の製品は他の製品よりも多くのサイズと色を持つことができます. 場合によっては、商品のサイズが 1 つだけで、色がいくつかある場合があります。このような場合、この 1 つのサイズは db には格納されず、色のみが格納されます。テーブルが不規則に埋まっています。詳細列は必須ではありません (空にすることもできます)。詳細列は次のように構成されます。例:
1-30,2-134:6:0;;2-7:55:0 ここで、メインのセパレータは ';;' であるため、この文字列は次のように分割されます:
1-30 ,2-134:6:0
2-7:55:0

最初に分割された行を考慮すると、次に分割される部分があります:
1-30 - 最初の部分 2-134
- 2番目の部分
6 - 3番目の部分
0 - 4番目の部分
たまに第二弾が出ます。前編と後編は、1-XXX または 2-XXX から開始できます。3 番目の部分は、在庫のある製品の数を意味します。4 番目の部分は重要ではないため、無視できます。

テーブル「タイプ」
ID - 値
1 - 製品
2 - 色

テーブル「引数」
id - 値
1 - sr20 h12
2 - sr21 h13
3 - 青
..
30 - sr25 h15
134 - 赤

上記の表を考慮すると、前述の例は次のことを意味します
。1-30 は 1=製品、30=sr25
h15 を意味します。2-134 は 2=色、134=赤を意味します。

方法で製品を適切に表示する php スクリプトを準備するのを手伝ってくれませんか:
製品 1 - サイズ: sr25 h15、色: 赤、在庫あり: 6
製品 1 - サイズ: sr30 h16、色: 青、在庫あり: 13
製品1 - サイズ: sr35 h20, 色: ピンク, 在庫あり: 2
製品 2
製品 3 - 色: ホワイト, 在庫あり 4

############################

Bill の提案のおかげで、次のようにファイルを分割しました

foreach ...
$fields = expand(":", $products);
foreach ...
$attribs = expand(",", $fields);
foreach ...

ただし、どのように使用すればよいかわかりません:
($attrib_type, $attrib_value) = expand("-", $attribs[0]);

事前にロードされた引数用の関連付けテーブルも用意しましたが、それをどのように使用できるかわかりません。

これは私のコードです:

$results = mysql_query("SELECT id, name, details FROM products") or die ('query error');

if(mysql_num_rows($results) > 0) {

echo "<table width='780' cellpadding='2' border='1' rules='rows'>";
    echo "<th width=50 align='left'>ID</th>";
    echo "<th width=350 align='left'>Name</th>";
    echo "<th width=380 align='left'>Details</th>";

    while($r = mysql_fetch_array($results))
    {
        echo "<tr>";
            echo "<td width=50 align='left'>".$r[0]."</td>";
            echo "<td width=350 align='left'>".$r[1]."</td>";
            //echo "<td width=350 align='left'>".$r[2]."</td>";

            $string = "$r[2]";
            $products = explode(';;', $string);
            foreach ($products as $p)
            {
                $fields = explode(':', $p);
                foreach ($fields as $f)
                {

                    $attribs = explode(',', $f);
                    foreach ($attribs as $a)
                    {

                        $attrib_type_value = explode('-', $a);
                        foreach ($attrib_type_value as $t)
                        {

                            if ($t[0] == 1 or $t[0] == 2)
                            {
                                $query1 = mysql_query("SELECT products_type.id FROM products_type WHERE products_type.id ='$t'")
                                or die('error query1: ' . mysql_error());

                                $query2 = mysql_query("SELECT products_arguments.value FROM products_arguments WHERE products_arguments.id = '$t'")
                                or die('errur query2: ' . mysql_error());

                                if(mysql_num_rows($query1) > 0)
                                {
                                    while($r2 = mysql_fetch_array($query1))
                                    {
                                         echo "<tr>
                                            <td width=350 align='left'>".$r2[0]."</td>";
                                         echo "</tr>";
                                    }
                                }
                            }
                        }
                    }
                 }
            }
        echo "</tr>";
     }
echo "</table>";

}

4

2 に答える 2

1

更新:あなたの質問に対して別の回答を提供するつもりですが、元の回答を以下に含めておきます。

explode()「詳細」文字列の要素を区切るような PHP 関数を使用する必要があります。たとえば、データベースから行をフェッチし$details、文字列が含まれていると仮定すると、次のように個々の製品に分けることができます。

$products = explode(";;", $details);

次に、次のように製品フィールドを分離できます。

$fields = explode(":", $products[0]);

次に、色、サイズなどの属性を次のように分離できます。

$attribs = explode(",", $fields[0]);

次に、次のように色/サイズのキーを取得できます。

($attrib_type, $attrib_value) = explode("-", $attribs[0]);

$attrib_type「色」対「サイズ」に使用できるようになりました。$attrib_value表の検索に使用できArgumentsます。主キーによって引数を連想配列にプリロードすることをお勧めします。これにより、余分な SQL クエリを実行することなくそれらを参照することができます。

これは、このタスクのためにしなければならないよりもはるかに多くの作業です。


データベースの正規化がどうしても必要です。あなたが示す設計を使用することにより、一貫性のある構造化されたデータを強制することに関して、RDBMS が提供できる機能を利用していません。

まず、各タイプの製品を記録するテーブルを作成する必要があります。

CREATE TABLE ProductTypes (
  product_id SERIAL PRIMARY KEY,
  description TEXT
);

INSERT INTO ProductTypes (product_id, description) VALUES
  (1234, 'Pants'), 
  (3456, 'Shirts');

次に、SKU ごとにテーブルが必要です。このテーブルには、在庫数や価格などの一般的な製品情報が記録されます。

CREATE TABLE ProductSkus (
  product_sku CHAR(15) PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT NOT NULL,
  price DECIMAL(9,2) NOT NULL,
  UNIQUE KEY (product_id, product_sku),
  FOREIGN KEY (product_id) REFERENCES ProductTypes(product_id)
);

INSERT INTO ProductSkus (product_sku, product_id, quantity, price) VALUES
  ('B001CKD28O', 1234, 33, 36.99), -- pants
  ('B001CKD270', 1234, 17, 34.99), -- pants
  ('B002DLD410', 3456,  8, 17.50); -- shirt

製品のサブタイプごとに、それぞれのタイプに固有の属性を記録するテーブルも必要です。また、これらの属性の一部に許可されている値をリストしたルックアップ テーブルが必要になる場合もあります。

CREATE TABLE PantsSizes (
  size VARCHAR(20) PRIMARY KEY
);
INSERT INTO PantsSizes VALUES ('sr25 h15'), ('sr20 h12'), ('sr21 h13');

CREATE TABLE PantsColors (
  color VARCHAR(20) PRIMARY KEY
);
INSERT INTO PantsColors VALUES ('red'), ('blue');

CREATE TABLE Pants (
  product_sku CHAR(15) PRIMARY KEY,
  product_id INT NOT NULL CHECK (product_id = 1234) -- pants
  size VARCHAR(20) NOT NULL,
  color VARCHAR(20) NOT NULL,
  FOREIGN KEY (product_id, product_sku) REFERENCES ProductSkus(product_id, product_sku),
  FOREIGN KEY (size) REFERENCES PantsSizes(size),
  FOREIGN KEY (color) REFERENCES PantsColors(color)
);

INSERT INTO Pants (product_id, product_sku, size, color) VALUES
  (1234, 'B001CKD28O', 'sr25 h15', 'blue');

product_idこの表の がCHECK制約によってどのように制限されているか、および ProductSkus への外部キーが複合キーであることに注意してください。そのため、商品タイプが Pants の SKUのみを参照できます。こうすることで、シャツ SKU を参照するパンツの行を誤って作成することがなくなります。

PHP でズボンの情報を表示するには、次のように簡単に実行できます。

<?php

$pdo = new PDO(...connection...);
$stmt = $pdo->query("SELECT * FROM ProductSkus s
                     JOIN ProductTypes t USING (product_id)
                     JOIN Pants p USING (product_id, product_sku)");
?>
<table>
<tr>
 <th>Product</th>
 <th>Size</th>
 <th>Color</th>
 <th>Quantity</th>
 <th>Price</th>
</tr>
<?php while ($row = $stmt->fetch()) { ?>
<tr>
 <td><?php echo $row['description']; ?></td>
 <td><?php echo $row['size']; ?></td>
 <td><?php echo $row['color']; ?></td>
 <td><?php echo $row['quantity']; ?></td>
 <td><?php echo $row['price']; ?></td>
</tr>
<?php } ?>
</table>
于 2009-12-27T05:20:34.253 に答える
0

これは、phpを使用した分割記述の優れたチュートリアルですが、文字列にhtmlタグが含まれているとどうなりますか。

これがその条件で動作するためのチュートリアルです

http://phpschools.freehostia.com/other-stuff/split-html-description-in-php

于 2010-07-02T07:01:56.367 に答える