PHP и с чем его едят....

[fly]

Sweet orange
Надо сделать перемещение товара. Структура меню: Категория -> подкатегория. Делаю select и вывожу там список Категорий с вложенными подкатегориями.

Теперь вопрос: как через этот select передать два значения. Одно idPodCategory и второе idCategory. Или как это можно сделать другим способом?

Помню dreamer показывал такой код:
HTML:
<option value="$idCategory;$nameCategory">$nameCategory</option>
Но как обрабатывать это значение?
 

Dre.hz

Active Member
Fly, правильно передавать только значение подкатeгории. А уже на сервере смотреть в базе родительскую категорию у этой подкатегории. Или не "смотерть", а просто джоин сделать при запросе.
 

[fly]

Sweet orange
Dre.hz, я вот что подумал. Такое значение можно разбить командой explode. Вот что получилось:
PHP:
<option value=\"".$r['idCategory']."|".$r1[idPodCategory']."\">Название подкатегории</option>
А в обработчике пишу:

PHP:
$placeProduct=mysql_real_escape_string($_POST['placeProduct']);
$explodeProduct=explode("|", $placeProduct);
И дальше соответственно заношу в базу. Как по мне, таким способом вроде проще.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Можно передавать в json, тогда поле будет выглядеть как-то так
PHP:
$json='{"id":"'.$id.'","subcategory":"'.$subcategory.'"}';
$option='<option value="'.$json.'">text here</option>';
Далее просто разгребаем json, используем.
А можно использовать хранилище ключ-значение(redis, например) для производительности, если критично. Если нет, то можно и join добавить.
P.S.
Черт, как же не хватает qq//, q// :)
 

Dre.hz

Active Member
Разумеется, так проще, но это не значит, что так правильно. Сейчас объясню почему.

Есть такая вещь - целостность данных (data integity), что значит их непротиворечивость и целостность связей.

У нас есть некое дерево категорий - категория и субкатегория, и продукты, которые находятся внутри субкатегорий. Как я понял, один продукт может находиться только в одной категории (это утверждение важно на этом этапе. Если это не так, то проблема все равно остается, просто она описывается иначе).

В правильной архитектуре продукт ссылается на подкатегорию, а подкатегория на категорию. Пользователь, меняя одну любую из этих связей, изменяет дерево категорий с продуктами, но это дерево все еще остается правильным и непротиворечивым. В самом худшем случае, когда пользователь - злоумышленник, и его действия по перелинковке зловредны, он может перелинковать подкатегории к другим категориям, продукты к другим подкатегориям, но наше дерево все еще останется непротиворечивым, а связи целостными и логичными.

В вашем случае пользователь, действия которого всегда следует рассматривать с точки зрения злого умысла (иначе как еще побеспокоиться о безопасности), должен сам задать связь категория-подкатегория. А это значит, что он может задать одну и ту же связь категория-подкатегория для одного продукта так, а для другого - иначе. И это нарушит целостность связей, а начит и целостность всей базы данных.

Например.
Есть
Продукты > Молочные > Сыр
Продукты > Молочные > Творог
Продукты > Молочные > Кефир
Химия > Краски > Зеленая
Химия > Краски > Красная

Пользователь меняет следующую связь вот так:
Химия > Молочные > Кефир

Стало
Продукты > Молочные > Сыр
Продукты > Молочные > Творог
Химия > Молочные > Кефир
Химия > Краски > Зеленая
Химия > Краски > Красная

Очевидно, целостность данных нарушена. Одна и та же подкатегория для одного продукта ссылается на одну категорию, а для другого на другую. У нас появилась ложная связь категория-подкатегория, которая разрушила целостность данных.

А все потому, что делали как проще, а не как правильно.
 

[fly]

Sweet orange
Вроде суть я понял. Но в моем случае пользователь может перемещать продукт только внутри подкатегорий, т.е. из одной в другую. У него нет возможности перемещать сами подкатегории. Скажем так - есть:

Продукты > Молочные > Сыр
Продукты > Молочные > Творог
Продукты > Молочные > Кефир
Химия > Краски > Зеленая
Химия > Краски > Красная

Пользователь может переместить только сыр, творог, кефир и т.д.. Получится:

Продукты > Молочные > Красная
Продукты > Молочные > Творог
Продукты > Молочные > Зеленая
Химия > Краски > Кефир
Химия > Краски > Сыр

Он никак не сможет перемещать таким образом:

Продукты > Краски > Зеленая
Продукты > Молочные > Творог
Продукты > Молочные > Кефир
Химия > Молочные > Сыр
Химия > Краски > Красная

А Ваша схема подходит на тот случай, если пользователю доступно перемещение подкатегорий вместе с вложенными товарами. Я правильно понял?
 

Dre.hz

Active Member
Вроде суть я понял. Но в моем случае пользователь может перемещать продукт только внутри подкатегорий, т.е. из одной в другую. У него нет возможности перемещать сами подкатегории.
Тогда зачем указывать ID категории? Достаточно же только подкатегории (продукт относится к подкатегории, а подкатегория к категории). Я полагаю, если ID категории указан, то он будет куда-либо записан. А если он будет записан, то ничто не мешет вручную подправить его значение в DOM и сохранить, нарушив целостность данных.
 

[fly]

Sweet orange
продукт относится к подкатегории, а подкатегория к категории
Так и есть. И я хочу указать ID категории и занести ее вместе с ID подкатегории в таблицу с товаром для того, чтобы этот товар можно было вывести не только из подкатегории, но и если выбрать категорию, скажем, мобильные телефоны - выводит все самсунги, нокии и все остальные мобильные телефоны. Конечно можно было бы в обработчике по ID подкатегории взять ID самой категории, но не хочется делать еще один запрос к базе. Не то чтобы их у меня много, просто если есть способ избежать запроса - то стараюсь так и делать. И скажите, как в этом случае нарушается целостность базы?
 

Dre.hz

Active Member
Можно увидеть структуру БД с таблицами продуктов, категорий и подкатегорий?
 

[fly]

Sweet orange
Это не тайна:) Я ведь только учусь.

Структура таблицы с продуктами:

You must be registered for see images


Тут вроде все понятно, кроме:
file_nameOwner - название главной картинки товара;
seoNameProduct - ЧПУ;
partProduct - артикул товара;
attachProduct - флажок, который показывает, есть ли сопутствующий товар или нет;

Структура таблицы подкатегорий:

You must be registered for see images


В этой таблице:
podCategoryId - ID родительской категории;

Структура таблицы с категориями:

You must be registered for see images


Тут вроде все понятно.
 

Вкладення

Зверху