|
|
|
| Подскажите как организовать таблицу(таблицы) в БД для работы с каталогом из .csv?
Вид:
"Разное/!Материалы";"печать в компл";"124";"678";
Как лучше занести это в базу, я обрабатываю csv, и полученный массив через foreach() записываю в таблицу.
Я не знаю уровень вложенности категорий. Как вообще осуществлять навигацию по каталогу, т.е. отслеживать какая категория активна и т.д.? | |
|
|
|
|
|
|
|
для: Tema
(01.06.2006 в 19:42)
| | Подскажите, ну пожалуйста... | |
|
|
|
|
|
|
|
для: Tema
(02.06.2006 в 16:52)
| | Вы собрали в одну тему с полдесятка вопросов, в общем случае, почти не связанных между собой.
Кроме того, вот эта одна строка
"Разное/!Материалы";"печать в компл";"124";"678";
| дает слабое представление о том, как организван каталог в csv-файле.
Опишите подробнее, что находится в первом поле, и по каким правилам записывается структура каталога. | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 17:01)
| | Вот это и есть вся структура:
"Разное/!Материалы";"печать в кffомпл";"1234";"67238";
"Разное/!Материалы";"печать в комgddпл";"11224";"67128";
"Разное/!Материалы/Еще что-то";"печать в компл";"1224";"12678";
"Разное/!Материалы/Еще что-то";"печать в кsdомпл";"1244";"61278";
"Разное/!Материалы/Еще что-то";"печать в коdfмпл";"11224";"6178";
....
"Комплектующие/!Материалы/Еще что-то";"печать в компл";"124";"678";
"Разделы";"Название товара";"Шифр";"Цена";
Все. Обрабатываю csv и получаю в итоге такой вот массив:
Array ( [0] => !Разное/Разное 1 [1] => книжка телефонная А5 спираль (алф.5С26) [2] => 00000538 [3] => 18,36 [4] => шт [5] => 0 )
|
....
Я не могу понять, как организовать базу, чтобы потом составлять запросы. Сколько таблиц сделать, что туда заносить. И как потом связать меню(разделы) и остальные поля?
Хоть как-то направьте, если сильно абстрактно спрашиваю. | |
|
|
|
|
|
|
|
для: Tema
(02.06.2006 в 18:10)
| | Среди текста названий подразделов может появиться косая черта?
Если да, то как она отличается от разделителя подразделов?
Что обозначают третья, четвертая и пятая колонки? | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 18:23)
| | Нет, не может.
Их не надо брать во внимание. Это лишнее(кроме [3] - это цена).
Надо только так:
"Разделы";"Название товара";"Шифр";"Цена"; | |
|
|
|
|
|
|
|
для: Tema
(02.06.2006 в 19:30)
| |
<?php
include 'config.inc.php';
function ReadAllTree($tab, $id, $parent, $name, $filter='')
{
$sql = "SELECT $id, $parent, $name FROM $tab $filter";
$res = mysql_query($sql);
if(!$res)
{
echo "SQL error in ".nl2br($sql)." : <br>".mysql_error();
return false;
}
$tree = array();
while($row = mysql_fetch_row($res))
{
$id = intval($row[0]); $pid = intval($row[1]); $name = $row[2];
$pars = isset($tree[$id]) ? $tree[$id] : array();
$pars[0] = $pid;
$tree[$id] = $pars;
$pars = isset($tree[$pid]) ? $tree[$pid] : array();
$pars[$id] = $name;
$tree[$pid] = $pars;
unset($pars);
}
return $tree;
}
$tree = ReadAllTree('catalog', 'id_catalog', 'id_parent', 'name');
$fp = fopen('csvcat.csv', 'r');
for($llen = 0; !feof($fp) ; )
$llen = max($llen, strlen(fgets($fp)));
fseek($fp, 0, SEEK_SET);
$sql2 = "INSERT INTO product (id_catalog, name, code, price) values";
$sql2sep = "\r\n ";
$hash = array();
while($arr= fgetcsv($fp, $llen, ';','"'))
{
$fullcat = $arr[0];
if(!isset($hash[$fullcat]))
{
$cats = explode('/', $arr[0]);
$pid = 0;
foreach($cats as $cat)
{
if(isset($tree[$pid][$cat]))
$id = array_search($cat, $nodes, true);
else
{
$sql = "INSERT INTO catalog (id_parent, name)"
." VALUES ($pid, '".mysql_escape_string($cat)."')";
$r = mysql_query($sql);
if(!$r) exit("SQL error in ".nl2br($sql)." : <br>".mysql_error());
else $id = mysql_insert_id();
$tree[$pid][$id] = $cat;
$tree[$id] = array(0 => $pid);
}
$pid = $id;
}
$hash[$fullcat] = $pid;
}
$id = $hash[$fullcat];
$name=$arr[1];
$code=$arr[2];
$price=$arr[3];
$sql2.= "$sql2sep ($id, '".mysql_escape_string($name)."',$code, $price)";
$sql2sep = "\r\n,";
}
$num = 0;
if($sql2sep == "\r\n,")
{
$r = mysql_query($sql2);
if(!$r) exit("SQL error in ".nl2br($sql2)." : <br>".mysql_error());
else $num = mysql_affected_rows();
}
echo "$num products imported";
/*
--
-- Структура таблицы 'catalog'
--
CREATE TABLE catalog (
id_catalog int(8) NOT NULL auto_increment,
id_parent int(8) NOT NULL default '0',
name varchar(255) NOT NULL default 'NULL',
description tinytext,
pos smallint(3) default '0',
hide enum('show','hide') NOT NULL default 'show',
PRIMARY KEY (id_catalog),
KEY id_parent (id_parent)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
// структура таблицы товаров
--
-- Структура таблицы 'product'
--
CREATE TABLE product (
id_product int(11) NOT NULL auto_increment,
note tinytext,
name varchar(255) NOT NULL default 'NULL',
hide enum('show','hide') NOT NULL default 'show',
pos int(11) default NULL,
id_catalog int(8) NOT NULL default '0',
code int(11) default NULL,
price int(11) default NULL,
PRIMARY KEY (id_product),
KEY id_catalog (id_catalog)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 ;
*/
?>
|
| |
|
|
|
|
|
|
|
для: Tema
(02.06.2006 в 19:30)
| | Здесь даже несколько больше, чем надо.
Этот код позволяет добавлять товары в уже существующую базу разделов. | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 20:23)
| | MySQL выдает ошибку:
SQL error in INSERT INTO catalog (id_parent, name) VALUES (619, 'Фото') :
You have an error in your SQL syntax near ' ) , (491, '',00002463, 15171,5) , (491, '',00003240, 6380,7) , (491, '',0' at line 2102
|
| |
|
|
|
|
|
|
|
для: Tema
(02.06.2006 в 21:17)
| | Неудивительно. Вы ничего не сказали о том, в каком формате у Вас цена.
Из примеров я понял, что это целое число.
Опечатку, из-за которой в диагностике выводился текст другого запроса, я исправил. | |
|
|
|
|
|
|
|
для: Trianon
(03.06.2006 в 00:34)
| | Вот реальный пример записи из файла:
"Фото-Видео/Фото";"Фотокамера Panasonic DMC-FX8GC-S FX8GC-S";"00000542";"12160,22";
Цена - число с плавающей точкой(не всегда, может быть и целым), извиняюсь, что сразу не сказал. | |
|
|
|
|
|
|
|
для: Tema
(03.06.2006 в 12:22)
| | >Вот реальный пример записи из файла:
>"Фото-Видео/Фото";"Фотокамера Panasonic DMC-FX8GC-S
>FX8GC-S";"00000542";"12160,22";
>Цена - число с плавающей точкой(не всегда, может быть и целым),
Это "12160,22" ?
Нужно поменять строку
на строку
$price = str_replace(',', '.', $arr[3]);
|
а в таблице product у поля price поменять тип на DECIMAL:
вместо
price int(11) default NULL,
| сделать
price decimal(12,2) default NULL,
|
Либо, если предпочитаете хранить цены целым числом в копейках, то не трогать таблицу,
а вышеуказанную строку поменять на
$price = intval(100 * floatval(str_replace(',', '.', $arr[3])));
|
А то что Вы назвали "шифром"? "00000542" ?
Это число?
Оно уникально для каждого вида товара? В нем всегда 8 разрядов? | |
|
|
|
|
|
|
|
для: Trianon
(05.06.2006 в 13:47)
| | Да это уникальное число для каждого товара в отдельности, в нем всегда 8 разрядов.
Скажеите, почему происходит ошибка:
SQL error in INSERT INTO product (id_catalog, name, code, price) values
, (2, 'шампанское Российское \"Абрау-Дюрсо\"',00000706, 180)
...
, (620, 'Фотокамера Panasonic DMC-FX8GC-S FX8GC-S',00000542, 12160.22) :
You have an error in your SQL syntax near ' ) , (491, 'Системный блок allMax Авдеев в составе :[#13] - Материнская пла' at line 2102
|
В catalog все заносится прекрасно. | |
|
|
|
|
|
|
|
для: Tema
(05.06.2006 в 19:35)
| | >Да это уникальное число для каждого товара в отдельности, в
>нем всегда 8 разрядов.
Тогда наверное это число стоит использовать в качестве первичного ключа id_product.
>Скажеите, почему происходит ошибка:
>
>SQL error in INSERT INTO product (id_catalog, name, code,
>price) values
>, (2, 'шампанское Российское "Абрау-Дюрсо"',00000706, 180)
>...
>, (620, 'Фотокамера Panasonic DMC-FX8GC-S FX8GC-S',00000542,
>12160.22) :
>You have an error in your SQL syntax near ' ) , (491,
>'Системный блок allMax Авдеев в составе :[#13] - Материнская
>пла' at line 2102
>
|
Надо смотреть, что там в запросе написано перед 491-м товаром.
Или даже сам csv-файл.
Очень может быть, что данных просто слишком много. | |
|
|
|
|
|
|
|
для: Trianon
(05.06.2006 в 19:47)
| | Если не заносить поля $code и $price, то все остальное записывается корректно. Всего строк получилось 2486.
Вы знаете, я обнаружил что в названии разделов может быть "/". | |
|
|
|
|
|
|
|
для: Tema
(05.06.2006 в 20:42)
| | А как организовать навигацию? Я главные разделы вывожу, а вот на внутренние не могу запрос составить? Не могу понять зависимость :( | |
|
|
|
|
|
|
|
для: Tema
(06.06.2006 в 18:59)
| | А как Вы хотите их выводить? | |
|
|
|
|
|
|
|
для: Trianon
(06.06.2006 в 19:31)
| | В виде дерева. С помощью CSS. Т.е. весь вопрос в том как их правильно достать из таблицы. В нужной последовательности. Т.е. выводиться они должны все сразу.
Разное
|____Материалы
|____Прочие товары
|____Услуги
|_____Еще что-то
Канцелярия
|____Бумага
|____Ручки
и т.д.
У меня трудность во внутренних разделах... | |
|
|
|
|
|
|
|
для: Tema
(06.06.2006 в 20:04)
| |
<?
function showtree(&$tree, $name, $pid, $lev=0)
{
echo "$name : ";
echo "<blockquote>";
foreach($tree[$pid] as $id => $name) if($id !== 0)
showtree($tree, $name, $id, $lev+1)
echo "</blockquote>";
}
$tree = ReadAllTree(......)
showtree($tree, "", 0);
?>
|
либо, если разметка blockquote не устраивает, размечаться руками:
<?
function showtree(&$tree, $name, $pid, $lev=0)
{
$s = str_repeat(" . ", $lev+1);
echo "$s$name :<br> ";
foreach($tree[$pid] as $id => $name) if($id !== 0)
showtree($tree, $name, $id, $lev+1)
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(06.06.2006 в 20:26)
| | Все вроде бы все здорово, только вот один вопрос остался:
Этот код выводит так:
..Разное
...Материалы
..Разное
...Другие товары
..Кацелярия
...Ручки
..Канцелярия
...Карандаши
и т.д.
Скажите пожалуйста, как убрать повторения? | |
|
|
|
|
|
|
|
для: Tema
(11.06.2006 в 15:18)
| | Наверное у Вас разделы так названы. 'Кацелярия' != 'Канцелярия' | |
|
|
|
|
|
|
|
для: Trianon
(11.06.2006 в 18:02)
| | id id_parent name
1 0 !Разное
2 1 !Материалы
3 0 !Разное
Вот так в базе это выглядит. Т.е. у id_parent всегда 0. | |
|
|
|
|