Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Каталог продукции
 
 автор: Tema   (01.06.2006 в 19:42)   письмо автору
 
 

Подскажите как организовать таблицу(таблицы) в БД для работы с каталогом из .csv?
Вид:
"Разное/!Материалы";"печать в компл";"124";"678";
Как лучше занести это в базу, я обрабатываю csv, и полученный массив через foreach() записываю в таблицу.
Я не знаю уровень вложенности категорий. Как вообще осуществлять навигацию по каталогу, т.е. отслеживать какая категория активна и т.д.?

   
 
 автор: Tema   (02.06.2006 в 16:52)   письмо автору
 
   для: Tema   (01.06.2006 в 19:42)
 

Подскажите, ну пожалуйста...

   
 
 автор: Trianon   (02.06.2006 в 17:01)   письмо автору
 
   для: Tema   (02.06.2006 в 16:52)
 

Вы собрали в одну тему с полдесятка вопросов, в общем случае, почти не связанных между собой.

Кроме того, вот эта одна строка
"Разное/!Материалы";"печать в компл";"124";"678";
дает слабое представление о том, как организван каталог в csv-файле.

Опишите подробнее, что находится в первом поле, и по каким правилам записывается структура каталога.

   
 
 автор: Tema   (02.06.2006 в 18:10)   письмо автору
 
   для: 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 ) 

....
Я не могу понять, как организовать базу, чтобы потом составлять запросы. Сколько таблиц сделать, что туда заносить. И как потом связать меню(разделы) и остальные поля?
Хоть как-то направьте, если сильно абстрактно спрашиваю.

   
 
 автор: Trianon   (02.06.2006 в 18:23)   письмо автору
 
   для: Tema   (02.06.2006 в 18:10)
 

Среди текста названий подразделов может появиться косая черта?
Если да, то как она отличается от разделителя подразделов?
Что обозначают третья, четвертая и пятая колонки?

   
 
 автор: Tema   (02.06.2006 в 19:30)   письмо автору
 
   для: Trianon   (02.06.2006 в 18:23)
 

Нет, не может.
Их не надо брать во внимание. Это лишнее(кроме [3] - это цена).
Надо только так:
"Разделы";"Название товара";"Шифр";"Цена";

   
 
 автор: Trianon   (02.06.2006 в 20:20)   письмо автору
 
   для: 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($llenstrlen(fgets($fp)));
   
fseek($fp0SEEK_SET);
     
$sql2 "INSERT INTO product (id_catalog, name,  code, price) values";
     
$sql2sep "\r\n ";
     
$hash = array();
     while(
$arrfgetcsv($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$nodestrue);
             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(=> $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 ;
*/

?>

   
 
 автор: Trianon   (02.06.2006 в 20:23)   письмо автору
 
   для: Tema   (02.06.2006 в 19:30)
 

Здесь даже несколько больше, чем надо.
Этот код позволяет добавлять товары в уже существующую базу разделов.

   
 
 автор: Tema   (02.06.2006 в 21:17)   письмо автору
 
   для: 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

   
 
 автор: Trianon   (03.06.2006 в 00:34)   письмо автору
 
   для: Tema   (02.06.2006 в 21:17)
 

Неудивительно. Вы ничего не сказали о том, в каком формате у Вас цена.
Из примеров я понял, что это целое число.
Опечатку, из-за которой в диагностике выводился текст другого запроса, я исправил.

   
 
 автор: Tema   (03.06.2006 в 12:22)   письмо автору
 
   для: Trianon   (03.06.2006 в 00:34)
 

Вот реальный пример записи из файла:
"Фото-Видео/Фото";"Фотокамера Panasonic DMC-FX8GC-S FX8GC-S";"00000542";"12160,22";
Цена - число с плавающей точкой(не всегда, может быть и целым), извиняюсь, что сразу не сказал.

   
 
 автор: Trianon   (05.06.2006 в 13:47)   письмо автору
 
   для: Tema   (03.06.2006 в 12:22)
 

>Вот реальный пример записи из файла:
>"Фото-Видео/Фото";"Фотокамера Panasonic DMC-FX8GC-S
>FX8GC-S";"00000542";"12160,22";
>Цена - число с плавающей точкой(не всегда, может быть и целым),

Это "12160,22" ?
Нужно поменять строку
$price = $arr[3];
на строку
$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 разрядов?

   
 
 автор: Tema   (05.06.2006 в 19:35)   письмо автору
 
   для: 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 все заносится прекрасно.

   
 
 автор: Trianon   (05.06.2006 в 19:47)   письмо автору
 
   для: 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-файл.
Очень может быть, что данных просто слишком много.

   
 
 автор: Tema   (05.06.2006 в 20:42)   письмо автору
 
   для: Trianon   (05.06.2006 в 19:47)
 

Если не заносить поля $code и $price, то все остальное записывается корректно. Всего строк получилось 2486.
Вы знаете, я обнаружил что в названии разделов может быть "/".

   
 
 автор: Tema   (06.06.2006 в 18:59)   письмо автору
 
   для: Tema   (05.06.2006 в 20:42)
 

А как организовать навигацию? Я главные разделы вывожу, а вот на внутренние не могу запрос составить? Не могу понять зависимость :(

   
 
 автор: Trianon   (06.06.2006 в 19:31)   письмо автору
 
   для: Tema   (06.06.2006 в 18:59)
 

А как Вы хотите их выводить?

   
 
 автор: Tema   (06.06.2006 в 20:04)   письмо автору
 
   для: Trianon   (06.06.2006 в 19:31)
 

В виде дерева. С помощью CSS. Т.е. весь вопрос в том как их правильно достать из таблицы. В нужной последовательности. Т.е. выводиться они должны все сразу.
Разное
|____Материалы
|____Прочие товары
|____Услуги
|_____Еще что-то
Канцелярия
|____Бумага
|____Ручки
и т.д.
У меня трудность во внутренних разделах...

   
 
 автор: Trianon   (06.06.2006 в 20:26)   письмо автору
 
   для: 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)
}
?>

   
 
 автор: Tema   (11.06.2006 в 15:18)   письмо автору
 
   для: Trianon   (06.06.2006 в 20:26)
 

Все вроде бы все здорово, только вот один вопрос остался:
Этот код выводит так:
..Разное
...Материалы
..Разное
...Другие товары
..Кацелярия
...Ручки
..Канцелярия
...Карандаши
и т.д.
Скажите пожалуйста, как убрать повторения?

   
 
 автор: Trianon   (11.06.2006 в 18:02)   письмо автору
 
   для: Tema   (11.06.2006 в 15:18)
 

Наверное у Вас разделы так названы. 'Кацелярия' != 'Канцелярия'

   
 
 автор: Tema   (11.06.2006 в 19:24)   письмо автору
 
   для: Trianon   (11.06.2006 в 18:02)
 

id id_parent name
1 0 !Разное
2 1 !Материалы
3 0 !Разное
Вот так в базе это выглядит. Т.е. у id_parent всегда 0.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования