Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/48: Рейтинг темы: голосов - 48, средняя оценка - 4.98
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
1

Вывод товара из базы для нескольких категорий

04.02.2011, 23:46. Показов 9155. Ответов 15
Метки нет (Все метки)

Добрый вечер!
Попалась следующая задача:
есть две таблицы в базе данных:
1. Таблица с товарами - tovars;
2. Таблица с категориями - category;
В таблице tovars есть столбец, который содержит в себе номера (идентификаторы category) категорий, то есть каждому товару сопоставлено значение (INT) категории, в которой он должен располагаться?
[IMG]http://i028.***********/1102/1f/2450693afef5.gif[/IMG]
Как сделать, чтобы один товар мог принадлежать нескольким категориям!
Сайт уже почти готов и не хотелось бы создавать еще одну таблицу в базе...
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2011, 23:46
Ответы с готовыми решениями:

Вывод категорий товара в магазине
CREATE TABLE IF NOT EXISTS `shop_cat` ( `id_cat` int(11) NOT NULL, `anchor_cat` varchar(500)...

Вывод множества родительских категорий товара - с неограниченной вложенностью
Вывод множества родительских категорий товара - с неограниченной вложенностью правильно ли я...

Сложная задача - Вывод товара и всех его категорий
Здравствуйте многоуважаемые личности. Здача такова - у товара есть поле id_cat в котором...

Получение количества товара к каждой из категорий с учетом дочерних категорий
Здравствуйте... у меня есть список категорий в таблице mod_catalog_cat типичные колонки:...

15
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 11:11 2
Цитата Сообщение от Luter1984 Посмотреть сообщение
то есть каждому товару сопоставлено значение (INT) категории, в которой он должен располагаться?
Да
Цитата Сообщение от Luter1984 Посмотреть сообщение
Как сделать, чтобы один товар мог принадлежать нескольким категориям!
Я лично создаю отдельную таблицу с полями: item_id (ключ) - category_id, и потом SQL-запросом вытягиваю нужные item_id.

Если же вы не хотите создавать еще одну таблицу, то можете хранить список категорий в базе, просто перед запросом этот список нужно сериализовать, но тут уже придется повозиться, так как необходимо вытягивать все товары + отфильтровывать нужные.. Вам это надо?..
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 11:55  [ТС] 3
Создание промежуточной таблицы типа этой???
[IMG]http://s008.***********/i306/1102/05/4c10b65d3f1e.jpg[/IMG]
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 12:18 4
Luter1984, да
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 12:22  [ТС] 5
Но как задать связи этой таблицы с таблицой товаров, где уже есть свой id как auto_increment???
0
126 / 93 / 18
Регистрация: 09.01.2011
Сообщений: 466
05.02.2011, 12:49 6
А что мешает в поле
Цитата Сообщение от Luter1984 Посмотреть сообщение
который содержит в себе номера (идентификаторы category) категорий
записывать через запятую все ИДы категорий?
0
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 13:03  [ТС] 7
Последующая обработка будет очень сложной, начнутся проблемы с выборкой....(для моего кода это точно)
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 13:07 8
Цитата Сообщение от Luter1984 Посмотреть сообщение
Но как задать связи этой таблицы с таблицой товаров, где уже есть свой id как auto_increment???
Очень легко.
1. При "создании" товара указываем к каким категориям он относиться
2. Добавляем товар в БД и сохраняем его id, который можно легко узнать после выполнения запроса
3. Добавляем в таблицу зависимостей записи вида id -> category_id

Добавлено через 1 минуту
Цитата Сообщение от Dejust Посмотреть сообщение
item_id (ключ) - category_id
Здесь я ошибся, в таблице зависимостей не должно быть уникальных ключей
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 13:36  [ТС] 9
Цитата Сообщение от Dejust Посмотреть сообщение
1. Добавляем в таблицу зависимостей записи вида id -> category_id
Не совсем понял, как это реализуется...Ни разу не пользовался связанными таблицами...О_о

Добавлено через 10 минут
Предположим есть товар...Мяч
Я вписываю в поля формы всю информацию по этому товару (предположим их три: id, title, text)...
Через checkbox отмечаю к каким категориям будет принадлежать этот товар. Т.е. в качестве значений checkbox передаю массив обработчику с идентификаторами категорий...
Переходим к обрабочику формируем запрос на добавление информации по товару в таблицу tovars
Также в обработчик поступает и массив с id категорий, что с ним делать?
Т.е. как занести в базу информацию, что этот товар будет принадлежать именно к этим категориям?
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 13:48 10
Ну сделать в цикле n-число sql запросов

Например, чисто схематичный код
PHP
1
2
3
4
5
6
$id = 2; // id товара, запомнили его после вставки в БД
 
foreach($categories as $category)
{
     $this->db->query('INSERT INTO 'table_cat_tov' ('tovar_id', 'category_id') VALUES ('.$id.', '.$category.');
}
Так мы сделаем n-записей в таблицу зависимостей; вроде можно сделать более элегантно, но я забыл этот способ
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 13:57  [ТС] 11
А "n-число sql запросов" не повлияет на работу скриптов (ну типа скорости загрузки страниц и т.д.)
И Как составить SQL запрос на создание table_cat_tov, ведь именно зависимости id -> category_id не представляю как реализовывать (работаю в phpMyAdmin)
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 14:13 12
Цитата Сообщение от Luter1984 Посмотреть сообщение
А "n-число sql запросов" не повлияет на работу скриптов (ну типа скорости загрузки страниц и т.д.))
Ну если при каждом запуске сайта будут выполняться это самое "n-число sql запросов" то повлияет и очень сильно, в худшую сторону конечно же. Но, я так понимаю, вы будете просто добавлять эти самые "товары" из адмники (или еще откуда), так что в целом на сайт это не повлияет.

Цитата Сообщение от Luter1984 Посмотреть сообщение
И Как составить SQL запрос на создание table_cat_tov, ведь именно зависимости id -> category_id не представляю как реализовывать (работаю в phpMyAdmin)
Так я же и расписал в предыдущем посте, как реализовать эти самые "зависимости".

Таблицу в БД, с помощью PhpMyAdmin, создают так: 1. выбираем БД 2. Кликаем по "создать новую таблицу"

Или запросы типа
SQL
1
CREATE TABLE
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
05.02.2011, 14:28  [ТС] 13
Раньше выборка товаров из таблицы по категории проходила как:
PHP
1
2
3
$res_rubrika = mysql_query("SELECT id,view,cena,categorynalichie,data,mini_image,big_image,title 
FROM rubriki WHERE categoryname='$methody' ORDER BY data DESC LIMIT $start, $num",
$databasic);
Где $methody представляло собой число (идентификатор категории)
Т.е пользователь, который нажал по ссылке, реализованной в коде:
PHP
1
2
3
4
5
6
do
{
printf ("<a href='view_c.php?methody=%s'>%s</a>", $myarrayres_method["id"],
$myarrayres_method["rubrikatitle"]);
}
while ($myarrayres_method = mysql_fetch_array($res_method));
попадал на страницу с этой категорией и теми товарами, для которых $methody был равен id категории по которой кликнули...
Сейчас как я понимаю $methody будет уже не числом, а массивом....Или не так?
Если не так, то как извлечь товар для категории...
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 14:36 14
Цитата Сообщение от Luter1984 Посмотреть сообщение
Если не так, то как извлечь товар для категории...
Я так понимаю извлечь товары?..
1. Выбираем все id товаров с условием category_id = $cat_id; $cat_id - id текущей категории
2. Выбираем товары из таблицы товаров с условием
SQL
1
WHERE IN $list_id_tovar
В $list_id_tovar список категорий, которые мы получили после шага №1. Как привести этот список к строке я описал в другой вашей теме: Выборка из базы в цикле?
1
5 / 5 / 2
Регистрация: 20.01.2011
Сообщений: 75
06.02.2011, 02:00  [ТС] 15
Столкнулся с весьма интересной проблемкой.... Может кто знает из-за чего она происходит...
Через форму добавляется товар, выбор категорий для которого происходит в этой форме через checkbox:
Код:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<form action='update_tovar.php' method='post' name='form_tovar' enctype='multipart/form-data'>
<label id='name_tovar'>Краткое содержимое страницы с товаром (нужно для поисковиков):<br /></label>
<input name='ntovar_meta_d' type='text' size='100' maxlength='100' id='fonesearchof' class="validate[required]" /><br /><br />
<label id='name_tovar'>Ключевые слова на странице с товаром (нужно для поисковиков):<br /></label>
<input name='ntovar_meta_k' type='text' size='100' maxlength='100' id='fonesearchof' class="validate[required]" /><br /><br />
<label id='name_tovar'>Наименование добавляемого товара:<br /></label>
<input name='ntovar_title' type='text' size='100' maxlength='100' id='fonesearchof' class="validate[required]" /><br /><br />
<label id='name_tovar'>Цена товара (руб.):</label>&nbsp;&nbsp;&nbsp;
<input name='ntovar_prais' type='text' size='35' maxlength='35' id='fonesearchof' class='validate[required,custom[onlyNumber]]' /><br /><br />
<label id='name_tovar'>Возрастные рекомендации по товару:</label><br /><br />
<label id='name_tovar'>от возраста:</label>&nbsp;&nbsp;&nbsp;
<input name='ntovar_vosrast_mini' type='text' size='23' maxlength='20' id='fonesearchof' 
class='validate[required,custom[onlyNumber]]' />
<label id='name_tovar'>&nbsp;&nbsp;&nbsp;до возраста:</label>&nbsp;&nbsp;&nbsp;
<input name='ntovar_vosrast_maxi' type='text' size='23' maxlength='20' id='fonesearchof' 
class='validate[required,custom[onlyNumber]]' /><br /><br />
<label id='name_tovar'>Выберите категории для товаров:<br /><br /></label>
<div id="virav_table">
<table id="newcat"><tr><th class='newcat_title'>Авторские методики</th></tr>
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
do 
    {
        printf("<tr><td class='newcat_author'><input name='new_id_cat[]' type='checkbox' value='%s'>%s</td></tr>",
        $myrow_newtovar_1["id"],$myrow_newtovar_1["rubrikatitle"]);
    }
while($myrow_newtovar_1 = mysql_fetch_array($result_newtovar_1));
?>
</table>
<table id="newcat2"><tr><th class='newcat_title'>Рубрики</th></tr>
<?php
do 
    {
        printf("<tr><td class='newcat_rubrika'><input name='new_id_cat[]' type='checkbox' value='%s'>%s</td></tr>",
        $myrow_newtovar_2["id"],$myrow_newtovar_2["rubrikatitle"]);
    }
while($myrow_newtovar_2 = mysql_fetch_array($result_newtovar_2));
?>
HTML5
1
2
3
4
5
6
7
</table>
</div><br />
<label id='name_tovar'>Описание добавляемого товара:</label>&nbsp;&nbsp;&nbsp;
<textarea id='editor1' name='editor1'></textarea><br />
<script type='text/javascript'>CKEDITOR.replace( 'editor1' );</script>
<input type='submit' class='update_button' value='Сохранить' name='button_ntovar' />
</form>
Обработчик принимает данные:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
if (isset($button_ntovar))
    {
        if (isset($ntovar_meta_d) && isset($ntovar_meta_k) && isset($ntovar_title) && isset($ntovar_prais) && 
        isset($ntovar_vosrast_mini) && isset($ntovar_vosrast_maxi) && isset($new_id_cat) && isset($editor1))
            {
                /*уберем пробелы до и после названия товара*/
                $ntovar_title = trim($ntovar_title);
                /*проверка на количество символов в слове*/
                $words = preg_split("/[\s]+/",$ntovar_title);
                foreach($words as $index => $values)
                    {
                        if (!preg_match("/^[a-zA-Zа-яА-Я0-9 -.,+« »№!?ё]{0,14}+$/u", $values))
                            {
                                echo "<div align='center'><p class='my_error'>Название товара содержит слово длина которого
                                превышает 14 символов!<br /> Такое название недопустимо!<br />Также возможно были 
                                использованы специальные символы (см. ниже)<br /><br /></p></div>";
                                echo "<html><head><meta http-equiv='Refresh' content='10; URL=add_tovar.php'></head><body>
                                <div align='center'><p class='poisknull'>Вы будете перемещены через 10 сек. Если не хотите
                                ждать,то <a href='add_tovar.php'><br />- нажмите сюда -</a></p></div></body></html>";
                                $error = "yes";
                            }
                    }
                if(!is_numeric($ntovar_prais) or !is_numeric($ntovar_vosrast_mini) or !is_numeric($ntovar_vosrast_maxi))
                    {
                        echo "<div align='center'><p class='my_error'>В одном или нескольких полях, где должно быть число 
                        обнаружены не цифры!<br />Такая информация не может быть обновлена!<br /><br /></p></div>";
                        echo "<html><head><meta http-equiv='Refresh' content='10; URL=add_tovar.php'></head><body>
                        <div align='center'><p class='poisknull'>Вы будете перемещены через 10 сек. Если не хотите
                        ждать,то <a href='add_tovar.php'><br />- нажмите сюда -</a></p></div></body></html>";
                        $error2 = "yes";
                    }
                if($error !== "yes" && $error2 !== "yes")
                    {
                        $ntovar_data = date("Y-m-d");
                        $categoryname = 0;
                        /*Помещаем содержимое на сайт*/ 
                        $resultat_1 = mysql_query("INSERT INTO rubriki (meta_k,meta_d,title,cena,data,minvosrast,maxvosrast,
                        categoryname,text) VALUES ('$ntovar_meta_k','$ntovar_meta_d','$ntovar_title','$ntovar_prais',
                        '$ntovar_data','$ntovar_vosrast_mini','$ntovar_vosrast_maxi','$categoryname','$editor1')");
                        $resultat_2 = mysql_query("SELECT id FROM rubriki WHERE data='$ntovar_data' AND title='$ntovar_title'",
                        $databasic);
                        if (mysql_num_rows($resultat_2) > 0)   #если существует хотя бы одна запись
                            {
                                $myrow_resultat_2 = mysql_fetch_array($resultat_2);
                            }
                        if($myrow_resultat_2["id"] !==0 )
                            {
                                $id_items = $myrow_resultat_2["id"];                    
                                foreach($new_id_cat as $id_cat)
                                    {
                                        $resultat_3 = mysql_query("INSERT INTO table_cat_tov (tovars_id, category_id) 
                                        VALUES ('$id_items','$id_cat')");
                                    }
                            }
                        if ($resultat_3 == 'true') 
                            {
                                echo "<div align='center'><p class='my_error'>Вы добавили на сайт новый товар!
                                <br /><br /></p></div>";
                                echo "<html><head><meta http-equiv='Refresh' content='3; URL=add_tovar.php'></head><body>
                                <div align='center'><p class='poisknull'>Вы будете перемещены через 3 сек. Если не хотите ждать,то 
                                <a href='add_tovar.php'><br />- нажмите сюда -</a></p></div></body></html>";
                            }
                    }   
 
            }
        else
            {
                echo "<div align='center'><p class='my_error'>К сожалению информация на сайте не может быть обновлена, так как 
                не все поля формы были заполнены</p></div>";
                echo "<html><head><meta http-equiv='Refresh' content='3; URL=add_tovar.php'></head><body>
                <div align='center'><p class='poisknull'>Вы будете перемещены через 3 сек. Если не хотите ждать,то 
                <a href='add_tovar.php'><br />- нажмите сюда -</a></p></div></body></html>";
            }
    }
и соответственно заносит результаты в базу данных...
Добавляем первый товар (id, которого предположим формируется как 27)
Данные о товаре добавились в таблицу с описанием товара
Извлекся в обработчике id товара (27) и добавился в промежуточную таблицу (два поля id_tovars и id_category).
Пошли добавлять еще один товар:
А вот здесь происходит просто мистика:
Если выбрать категории для товара, отличные от предыдущих, то в промежуточную таблицу попадет новый id товара, а если снова в checkbox выбрать те же категории, то товар попадет в базу (в промежуточную таблицу) с id прошлого товара....Как можно это исправить?.....

Добавлено через 5 часов 42 минуты
Цитата Сообщение от Dejust Посмотреть сообщение
1. Выбираем все id товаров с условием category_id = $cat_id; $cat_id - id текущей категории
2. Выбираем товары из таблицы товаров с условием
SQL
1
WHERE IN $list_id_tovar
Но как реализовать шаг 1.
Ведь получается, что нужно сохранить результат SQL запроса на выборку всех id товаров в массив, который затем будет использоваться как условие для выборки данных о конкретном товаре и представлении его к категории...
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
06.02.2011, 09:49 16
Цитата Сообщение от Luter1984 Посмотреть сообщение
Но как реализовать шаг 1.
Ну получите вы уж каким-нибудь образом id этой категории, например в URL запросе
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2011, 09:49

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вывод товаров из нескольких категорий
В общем дело такое. Есть некое подобие магазина, где все категории хранятся в одной таблице...

Где в документации написано про вывод записей из нескольких категорий через url /category/slug1+slug2 ?
Может кто подсказать?

Вывод из базы нескольких значений одного параметра
Добрый день! У меня есть две таблицы: tema и catalog. В таблице catalog перечислены позиции и...

Вывод нескольких элементов из базы данных (отсекание)
Написать программу, которая бы создавала базу данных из названий планет, а потом выводила бы первые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.