I m new in php. Could you please help me to find the way to properly arrange following task:
Table "Products"
id - details
1 - 1-30,2-134:6:0;;2-7:55:0;;1-2,2-8:25:0 - where this string can be very long
2 -
3 - 1-360:17:0;;1-361:185:0
Every product 1, 2, 3, ... are stored in db in one row, although product is additionally recognized separately per size and color. That is why some products can have more sizes and colors then the others.
Sometimes product is only in one size but in some colors. In such case this one size is not stored in db but only colors.
Table is irregularly filled. The details column is not mandatory (can be empty).
The details column consists in this way, example:
1-30,2-134:6:0;;2-7:55:0 where main separator is ;; , so this string will be splited to:
1-30,2-134:6:0
2-7:55:0
Considering frist splited row, there are next parts to be splited:
1-30 - first part
2-134 - second part
6 - third part
0 - forth part
The frist, thirt and forth parts appears always. The second part appears sometimes.
The first part and second part can start from 1-XXX or 2-XXX.
The third part means number of products which are on stock.
The forth part is not important and can be ignored.
Table "Type"
id - value
1 - Product
2 - Color
Table "Arguments"
id - value
1 - sr20 h12
2 - sr21 h13
3 - blue
..
30 - sr25 h15
134 - red
Considering the above tables the early mentioned example would means:
1-30 would means 1=product, 30=sr25 h15
2-134 would means 2=color, 134=red
Could you please help me prepare php script which would properly display products in the way:
Product 1 - size: sr25 h15, color: red, on stock: 6
Product 1 - size: sr30 h16, color: blue, on stock: 13
Product 1 - size: sr35 h20, color: pink, on stock: 2
Product 2
Product 3 - color: white, on stock 4
Thanks to Bill s suggestions I have splitted fileds by:
$products = explode(";;", $details);
foreach ...
$fields = explode(":", $products);
foreach ...
$attribs = explode(",", $fields);
foreach ...
However, I don t know how should I use:
($attrib_type, $attrib_value) = explode("-", $attribs[0]);
I have also prepared pre-loaded association table for arguments, but I don t know how can I use it.
This is my code:
$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>";
}