首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分字符串并排列db以在PHP中显示产品

拆分字符串并排列db以在PHP中显示产品
EN

Stack Overflow用户
提问于 2009-12-27 12:21:19
回答 2查看 773关注 0票数 0

我是php新手。你能帮我找出正确安排以下任务的方法吗:

表"Products“

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,...以一行的形式存储在db中,尽管产品是按尺寸和颜色单独识别的。这就是为什么有些产品可以比其他产品有更多的尺寸和颜色。有时产品只有一种尺寸,但有几种颜色。在这种情况下,这个大小不是以db存储,而是仅以颜色存储。表格填得不规则。详细信息列不是必填的(可以为空)。details列以这种方式组成,例如:

1-30,2-134:6:0;;2-7:55:0,其中主分隔符为';;',因此该字符串将被拆分为:

1-30,2-134:6:0

2-7:55:0

考虑到第一个拆分的行,接下来是要拆分的部分:

1-30 -第一部分

2-134 -第二部分

6-第三部分

0- forth部分

第一部分,第三部分和第四部分总是出现。第二部分有时会出现。第一部分和第二部分可以从1-XXX或2-XXX开始。第三部分是指有库存的产品数量。第四部分不重要,可以忽略不计。

表“类型”

id -值

1-产品

双色

表“参数”

id -值

1- sr20 h12

2- sr21 h13

3-蓝色

。。

30 - sr25 h15

134 -红色

考虑到上面的表格,前面提到的例子意味着:

1-30表示1=product,30=sr25 h15

2-134表示2=color,134=red

你可以帮我准备php脚本,它可以正确地显示产品的方式:

产品1-尺寸: sr25 h15,颜色:红色,现货:6

产品1-尺寸: sr30 h16,颜色:蓝色,现货: 13

产品1-尺寸: sr35 h20,颜色:粉色,现货:2

产品2

产品3-颜色:白色,现货4

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

多亏了Bill的建议,我将文件拆分为:

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

福拉奇...

代码语言:javascript
复制
$fields = explode(":", $products); 
代码语言:javascript
复制
foreach ... 
代码语言:javascript
复制
   $attribs = explode(",", $fields);
代码语言:javascript
复制
   foreach ...

但是,我不知道该如何使用:

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

我也为参数准备了预先加载的关联表,但我不知道如何使用它。

这是我的代码:

$results =mysql_query(“从产品中选择id、名称、详细信息”)或die (‘查询错误’);

如果(mysql_num_rows($results)> 0) {

代码语言:javascript
复制
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>";

}

EN

回答 2

Stack Overflow用户

发布于 2009-12-27 13:20:34

更新:我将为你的问题提供另一个答案,但我将把我最初的回答包含在下面。

您需要使用explode()之类的函数来分隔"details“字符串的元素。例如,假设您已从数据库中提取了行,并且$details包含字符串,则可以将其分隔为各个产品,如下所示:

代码语言:javascript
复制
$products = explode(";;", $details);

然后,您可以像这样分隔产品字段:

代码语言:javascript
复制
$fields = explode(":", $products[0]);

然后,您可以像这样分隔颜色、大小等属性:

代码语言:javascript
复制
$attribs = explode(",", $fields[0]);

然后,您可以像这样获得颜色/大小的键:

代码语言:javascript
复制
($attrib_type, $attrib_value) = explode("-", $attribs[0]);

现在你可以对“颜色”和“大小”使用$attrib_type了。您可以使用$attrib_valueArguments表中查找。我建议通过主键将参数预加载到关联数组中,这样您就可以直接引用它们,而不必运行额外的SQL查询。

这真的是比你应该为这项任务做的工作多得多。

您非常需要数据库规范化。通过使用您所展示的设计,您没有利用RDBMS在强制执行一致的结构化数据方面所能提供的强大功能。

首先,您需要创建一个表来记录每种类型的产品。

代码语言:javascript
复制
CREATE TABLE ProductTypes (
  product_id SERIAL PRIMARY KEY,
  description TEXT
);

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

然后,您需要为每个SKU提供一个表。此表记录常用的产品信息,如库存数量、价格等。

代码语言:javascript
复制
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

对于产品的每个子类型,您还需要一个表来记录特定于相应类型的属性。您可能还需要一些查找表,列出其中一些属性的允许值。

代码语言:javascript
复制
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。这样就不会意外地在Pants中创建引用衬衫SKU的行。

现在,要在PHP中显示裤子信息,您可以执行以下简单操作:

代码语言:javascript
复制
<?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>
票数 1
EN

Stack Overflow用户

发布于 2010-07-02 15:01:56

这是一个很棒的用php分割描述的教程,但是如果字符串中有html标签会发生什么呢?

以下是使用该条件的教程

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1965150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档