Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод из базы нескольких значений одного параметра
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Вывод из базы нескольких значений одного параметра

Страниц (1): [1]
 

1. Kronter - 19 Июня, 2014 - 10:45:39 - перейти к сообщению
Добрый день!
У меня есть две таблицы: tema и catalog.

В таблице catalog перечислены позиции и есть колонка category, где указана категория позиции. Даю две строки:
1.nazvanie-ф, category-radio
2.nazvanie-а, category-stol

В таблице tema две колонки: tema и category. Даю две строки
1.tema-games, category-radio
2.tema-games, category-stol

Когда пользователь выбирает на сайте тему games, должны вывестись из таблицы catalog позиции, где категория равна radio или stol.

Блин уже голову сломал. У меня получается, что выпадают позиции только с одной категорией(последней), хотя я вывожу в цикле. Делаю так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $tema = mysql_real_escape_string($_GET['tema']);
  3. $result3 = ("SELECT category FROM tema where tema='$tema'");
  4. $res3 = mysql_query($result3);
  5. while($row = mysql_fetch_assoc($res3))
  6. {
  7. $category=$row['category'];
  8. $result = ("SELECT * FROM catalog where category='$category'");
  9. }
  10.  


Можно ли вообще мой замысел реализовать? И если можно, подскажите как.
Спасибо
2. DelphinPRO - 19 Июня, 2014 - 10:57:15 - перейти к сообщению
CODE (text):
скопировать код в буфер обмена
  1. тема 1
  2.     категория 1
  3.         название 1
  4.         название 2
  5.         название 3
  6.     категория 2
  7.         название 4
  8.         название 5
  9.         название 6
  10.     категория 3
  11.         название 7
  12.         название 8
  13.         название 9
  14. тема 2
  15.     категория 4
  16.         название 10
  17.         название 11
  18.         название 12
  19.  ...


Я правильно понимаю структуру?

Налицо древовидный вид данных. И стоит задача дергать целую ветку.
Сразу вспоминаю о методе хранения деревьев Nested Sets
3. Kronter - 19 Июня, 2014 - 11:05:50 - перейти к сообщению
Нет. Смысл в том, что в одной теме может быть несколько категорий, а одна категория может быть в разных темах.
Например:
тема1
категория1
категория2
категория3
тема2
категория1
категория2
тема3
категория1
категория3
4. DelphinPRO - 19 Июня, 2014 - 11:27:27 - перейти к сообщению
а, ну тогда ваш код в принципе должен работать. только данные нужно в массив собирать (вы резалт переписываете на каждой итерации, вот и сохраняется последняя)

PHP:
скопировать код в буфер обмена
  1. $result  = array();
  2.  
  3. ...
  4.  
  5. while () {
  6. ...
  7. $result[] = ...
  8. }
5. Kronter - 19 Июня, 2014 - 11:39:26 - перейти к сообщению
Блин, ниче не понял. Можете мой код исправить как надо?
(Добавление)
Никто больше не подскажет?
(Добавление)
Короче сделал так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $tema = mysql_real_escape_string($_GET['tema']);
  3. $result3 = ("SELECT category FROM tema where tema='$tema'");
  4. $res3 = mysql_query($result3);
  5. while($row = mysql_fetch_assoc($res3))
  6. {
  7. $category[]=$row['category'];
  8. }
  9. $result = ("SELECT * FROM catalog where category='$category[0]' or  category='$category[1]'");
  10.  
  11.  


Все работает. Теперь новая проблема: Категорий может быть от одной до десяти. Если в селекте перечислить через or 10 категорий, а их в данной теме только одна, то все работать перестает.
Как же быть?
Как же быть
(Добавление)
Можно конечно добавить вот это:
PHP:
скопировать код в буфер обмена
  1.  
  2. $num=mysql_num_rows($res3);
  3. if ($num==1) {
  4. $result = ("SELECT * FROM catalog where category='$category[0]'");
  5. }
  6. else if ($num==2) {
  7. $result = ("SELECT * FROM catalog where category='$category[0]' or  category='$category[1]'");
  8. }
  9.  


и так до десяти, но мне кажется что можно это сделать как-то по другому
6. DelphinPRO - 19 Июня, 2014 - 14:22:58 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $where = "category='" . join("' or  category='", $category) . "'";
  2. $result = ("SELECT * FROM catalog where $where");
7. Sail - 19 Июня, 2014 - 14:43:20 - перейти к сообщению
А может, проще сделать?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT c.`nazvanie`, c.`category` FROM `tema` t JOIN `catalog` c ON c.`category` = t.`category` WHERE t.`tema` = 'TemaName'

Ну а если формировать строку $where из полученного массива, то лучше, однако, использовать
PHP:
скопировать код в буфер обмена
  1. ... "where `category` in (".implode(',', $category).")"
8. Kronter - 19 Июня, 2014 - 20:27:42 - перейти к сообщению
DelphinPRO пишет:
PHP:
скопировать код в буфер обмена
  1. $where = "category='" . join("' or  category='", $category) . "'";
  2. $result = ("SELECT * FROM catalog where $where");


Выдает нужные категории, но после каждой идет строчка с ошибкой:
Warning: join() [function.join]: Invalid arguments passed

Что-то наверное с синтаксисом. Не подскажете что исправить?
(Добавление)
Спасибо. Все получилось

 

Powered by ExBB FM 1.0 RC1