Php вывод товаров по категориям

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

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

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

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

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

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

ЦитатаСообщение от Luter1984 Посмотреть сообщение

ЦитатаСообщение от Luter1984 Посмотреть сообщение

Я лично создаю отдельную таблицу с полями: item_id (ключ) — category_id, и потом SQL-запросом вытягиваю нужные item_id.

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

Создание промежуточной таблицы типа этой.
[IMG]http://s008.***********/i306/1102/05/4c10b65d3f1e.jpg[/IMG]

ЦитатаСообщение от Luter1984 Посмотреть сообщение

ЦитатаСообщение от Luter1984 Посмотреть сообщение

Очень легко.
1. При «создании» товара указываем к каким категориям он относиться
2. Добавляем товар в БД и сохраняем его id, который можно легко узнать после выполнения запроса
3. Добавляем в таблицу зависимостей записи вида id -> category_id

Добавлено через 1 минуту

ЦитатаСообщение от Dejust Посмотреть сообщение

ЦитатаСообщение от Dejust Посмотреть сообщение

Не совсем понял, как это реализуется. Ни разу не пользовался связанными таблицами. О_о

Добавлено через 10 минут
Предположим есть товар. Мяч
Я вписываю в поля формы всю информацию по этому товару (предположим их три: id, title, text).
Через checkbox отмечаю к каким категориям будет принадлежать этот товар. Т.е. в качестве значений checkbox передаю массив обработчику с идентификаторами категорий.
Переходим к обрабочику формируем запрос на добавление информации по товару в таблицу tovars
Также в обработчик поступает и массив с id категорий, что с ним делать?
Т.е. как занести в базу информацию, что этот товар будет принадлежать именно к этим категориям?

Ну сделать в цикле n-число sql запросов

Например, чисто схематичный код

$id = 2; // id товара, запомнили его после вставки в БД foreach($categories as $category) { $this->db->query('INSERT INTO 'table_cat_tov' ('tovar_id', 'category_id') VALUES ('.$id.', '.$category.'); >

Так мы сделаем n-записей в таблицу зависимостей; вроде можно сделать более элегантно, но я забыл этот способ

А «n-число sql запросов» не повлияет на работу скриптов (ну типа скорости загрузки страниц и т.д.)
И Как составить SQL запрос на создание table_cat_tov, ведь именно зависимости id -> category_id не представляю как реализовывать (работаю в phpMyAdmin)

ЦитатаСообщение от Luter1984 Посмотреть сообщение

Ну если при каждом запуске сайта будут выполняться это самое «n-число sql запросов» то повлияет и очень сильно, в худшую сторону конечно же. Но, я так понимаю, вы будете просто добавлять эти самые «товары» из адмники (или еще откуда), так что в целом на сайт это не повлияет.

ЦитатаСообщение от Luter1984 Посмотреть сообщение

И Как составить SQL запрос на создание table_cat_tov, ведь именно зависимости id -> category_id не представляю как реализовывать (работаю в phpMyAdmin)

Так я же и расписал в предыдущем посте, как реализовать эти самые «зависимости».

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

$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 представляло собой число (идентификатор категории)
Т.е пользователь, который нажал по ссылке, реализованной в коде:

do { printf ("%s'>%s", $myarrayres_method["id"], $myarrayres_method["rubrikatitle"]); } while ($myarrayres_method = mysql_fetch_array($res_method));

попадал на страницу с этой категорией и теми товарами, для которых $methody был равен id категории по которой кликнули.
Сейчас как я понимаю $methody будет уже не числом, а массивом. Или не так?
Если не так, то как извлечь товар для категории.

ЦитатаСообщение от Luter1984 Посмотреть сообщение

Я так понимаю извлечь товары.
1. Выбираем все id товаров с условием category_id = $cat_id; $cat_id — id текущей категории
2. Выбираем товары из таблицы товаров с условием

В $list_id_tovar список категорий, которые мы получили после шага №1. Как привести этот список к строке я описал в другой вашей теме: Выборка из базы в цикле?

Столкнулся с весьма интересной проблемкой. Может кто знает из-за чего она происходит.
Через форму добавляется товар, выбор категорий для которого происходит в этой форме через checkbox:
Код:

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>    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>    input name='ntovar_vosrast_mini' type='text' size='23' maxlength='20' id='fonesearchof'  class='validate[required,custom[onlyNumber]]' /> label id='name_tovar'>   до возраста:/label>    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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 do { printf("%s'>%s", $myrow_newtovar_1["id"],$myrow_newtovar_1["rubrikatitle"]); } while($myrow_newtovar_1 = mysql_fetch_array($result_newtovar_1)); ?>  Рубрики do { printf("",$myrow_newtovar_2["id"],$myrow_newtovar_2["rubrikatitle"]);}while($myrow_newtovar_2=mysql_fetch_array($result_newtovar_2));?>
/table> /div>br /> label id='name_tovar'>Описание добавляемого товара:/label>    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>
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 -.,+« »№!?ё]+$/u", $values)) { echo "

Название товара содержит слово длина которого превышает 14 символов!
Такое название недопустимо!
Также возможно были
использованы специальные символы (см. ниже)

"
; echo "

Вы будете перемещены через 10 сек. Если не хотите ждать,то
- нажмите сюда -

"
; $error = "yes"; } } if(!is_numeric($ntovar_prais) or !is_numeric($ntovar_vosrast_mini) or !is_numeric($ntovar_vosrast_maxi)) { echo "

В одном или нескольких полях, где должно быть число обнаружены не цифры!
Такая информация не может быть обновлена!

"
; echo "

Вы будете перемещены через 10 сек. Если не хотите ждать,то
- нажмите сюда -

"
; $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 "

Вы добавили на сайт новый товар!

"
; echo "

Вы будете перемещены через 3 сек. Если не хотите ждать,то
- нажмите сюда -

"
; } } } else { echo "

К сожалению информация на сайте не может быть обновлена, так как не все поля формы были заполнены

"
; echo "

Вы будете перемещены через 3 сек. Если не хотите ждать,то
- нажмите сюда -

"
; } }

и соответственно заносит результаты в базу данных.
Добавляем первый товар (id, которого предположим формируется как 27)
Данные о товаре добавились в таблицу с описанием товара
Извлекся в обработчике id товара (27) и добавился в промежуточную таблицу (два поля id_tovars и id_category).
Пошли добавлять еще один товар:
А вот здесь происходит просто мистика:
Если выбрать категории для товара, отличные от предыдущих, то в промежуточную таблицу попадет новый id товара, а если снова в checkbox выбрать те же категории, то товар попадет в базу (в промежуточную таблицу) с id прошлого товара. Как можно это исправить.

Добавлено через 5 часов 42 минуты

ЦитатаСообщение от Dejust Посмотреть сообщение

1. Выбираем все id товаров с условием category_id = $cat_id; $cat_id — id текущей категории
2. Выбираем товары из таблицы товаров с условием

Но как реализовать шаг 1.
Ведь получается, что нужно сохранить результат SQL запроса на выборку всех id товаров в массив, который затем будет использоваться как условие для выборки данных о конкретном товаре и представлении его к категории.

Источник

Как сделать вывод записей из БД по категориям php?

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

Собственно начал изучать php, работать со справочником сложно так как не знаю как это все работает. Посему учусь методом изобретения велосипедов, чтобы понять как все работает.

Задача: админка через которую добавляешь некую запись в бд, а потом страницы на лету формируются.

И ващеее стоит ли делать как это пытаюсь я? Или есть более правильные способы

Конкретно чего сейчас не могу разобрать
то как вывести страницу с определенной категории в урле + id записи.

blog.php?categor=business?id=1 — так не работает, а вот так blog.php?id=1 работает, но для СЕО не правильно.

function categor () < //разумеется подключился $db = mysqli_connect('') or die(mysqli_connect_error());; $db->set_charset("utf8"); $categor=$_GET['categor']; $list_news=mysqli_query($db, "SELECT * FROM news WHERE categor='$categor'"); //вывел записи из нужной категории - вид blog.php?categor=business while($row = mysqli_fetch_assoc($list_news)) < echo "$row[title] "; //создал ссылку и теперь перейдя на нее все открывается вот так blog.php?id=1, а надо, чтобы и категория передавалась > > //вывод данных function news () < $db = mysqli_connect('') or die(mysqli_connect_error());; $db->set_charset("utf8"); $id = $_GET['id']; //вывести по ид $ololo = mysqli_query($db, "SELECT * FROM news WHERE "); while ( $rows = mysqli_fetch_assoc($ololo)) < echo "

" . $rows[h]."

"; echo "
"; echo "

" . $rows[id]."

"; > > categor (); news ();

Короче надо чтобы при открытии определенной записи в урле передавалась и категория.

В базе в таблице есть и id и категория и ЧПУ (Ну и в идеале если подскажите как сделать ЧПУ.)

Источник

Читайте также:  Document
Оцените статью
%s'>%s