2009-12-27 4 views
0

Я новичок в php. Не могли бы вы помочь мне найти способ, чтобы правильно организовать следующую задачу:Split Strings и организовать db для отображения продуктов в 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, ... хранятся в db в одном ряду, хотя продукт дополнительно распознается отдельно по размеру и цвету. Вот почему некоторые продукты могут иметь больше размеров и цветов, чем другие. Иногда продукт имеет только один размер, но в некоторых цветах. В таком случае этот один размер не сохраняется в db, а только цвета. Таблица нерегулярно заполнена. Столбец сведений не является обязательным (может быть пустым). Эта колонка сведений состоит, таким образом, например:
1-30,2-134: 6: 0 ;; 2-7: 55: 0 где главный разделитель равен ';;', поэтому эта строка будет разделена на:
1-30,2-134: 6: 0
2-7: 55: 0

Учитывая Frist расщепляется строки, существуют следующие части, чтобы быть расщепляется:
1-30 - первая часть
2 -134 - вторая часть
6 - третья часть
0 - четвертая часть
Ремень, часть четверти и четверга появляются всегда. Иногда появляется вторая часть. Первая часть и вторая часть могут начинаться с 1-XXX или 2-XXX. Третья часть означает количество товаров, находящихся на складе. Четвертая часть не важна и ее можно игнорировать.

Таблица "Тип"
идентификатор - значение
1 - Продукт
2 - Цвет

Таблица "Аргументы"
идентификатор - значение
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

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

Благодаря предложениям Билла я расщепляется fileds по:
$ продуктов = взорваться ("; ; ", $ details);
foreach ...
$ fields = explode (":", $ products);
foreach ...
$ attribs = explode (",", $ fields);
Еогеасп ...

Однако, я не знаю, как я должен использовать:
($ attrib_type, $ attrib_value) = взорваться ("-", $ attribs [0]);

Я также подготовил предварительно загруженную таблицу ассоциаций аргументов, но я не знаю, как ее использовать.

Это мой код:

$ Результаты = mysql_query ("SELECT ID, имя, детали из продуктов") или умереть ('ошибка запроса');

если (mysql_num_rows ($ результат)> 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>"; 

}

ответ

1

обновление: Я собираюсь предложить еще один ответ на ваш вопрос, но я оставлю мой оригинальный ответ включен ниже.

Чтобы отделить элементы вашей строки "details", вам нужно использовать функцию PHP, например explode(). Например, предполагая, что вы принес строку из базы данных и $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-запросов.

Это действительно много, гораздо больше работы, чем вам следует делать для этой задачи.


Вам очень нужна нормализация базы данных. Используя дизайн, который вы показываете, вы не пользуетесь той мощью, которую ваша РСУБД может дать вам в отношении обеспечения последовательных структурированных данных.

Сначала вам нужно создать таблицу для записи каждого типа продуктов.

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 является соединение ключа. Так что он может только ссылка 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> 
+0

Дорогой Билл, спасибо за быстрый ответ. Я забыл упомянуть, что я не разработчик db, и я ничего не могу изменить в таблицах. Я могу основываться только на статусе. Мне нужно найти способ отображения продуктов, которые были помещены в db так, как я описал. Я могу понять, что это может быть снова нормализация и другие стандарты. У вас есть идея, как это можно сделать? – DanielDanielson

Смежные вопросы