Навигация типа << Пред. | Назад к разделу | След. >> в многоуровневом каталоге

vladax

Новичок
Навигация типа << Пред. | Назад к разделу | След. >> в многоуровневом каталоге

У меня трабл. Точнее, не трабл, а просто совет нужен.
Короче, есть три таблицы в Мускуле:

1-я таблица содержит разделы каталога (cat_id, parent_id, cat_name)
2-я товары с описанием, ценой и прочей хренатенью
в 3-й всего 2 поля id раздела и id товара, т.е. линки между 1-й и 2-й таблицей

Если упрощённо, то функция работает след. образом:
1. Передаём в строке ?parent_id=".$row['cat_id']
2. Далее SELECT * FROM table_1 WHERE parent_id = '$parent_id' ORDER BY cat_name
3. Если записи есть, спускаемся дальше вниз по дереву разделов каталога; если нет, значит мы достигли низшего уровня и тогда вываливаем список товаров с краткими хар-ками, которые соответствуют этому разделу (используем таб.2 и 3). К каждому товару здесь прикручиваем ссылку на страницу с подробным описанием этого же товара, которую выводим с помощью другой функции)

Так вот, вопрос в следующем:
Как лучше всего ввентить в этот алгоритм ещё одну фичу, а именно навигацию типа << Предыдущая | Назад к разделу | Следующая >> на странице с подробным описание товара (т.е. на самой самой низшей ступени каталога?) Неужели в этой самой функции, которая выводит страницу с подр. описанием товара) придется делать массив, в который будем сваливать ID товаров, соответствующих данному разделу?

Или можно как то подругому?

Да я понимаю, что при использовании Nested Sets с этой задачей можно было бы справиться как 2 байта переслать, но всё же, можно ли обойтись без этого?
 

Дmитpий

Guest
Не надо сваливать никакой массив ID товаров, соответствующих данному разделу

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

как 2 байта переслать
 

vladax

Новичок
Надо просто посмотреть группу товаров из таблицы соответствующих данному разделу
Ты ничего не понял. Таблица с товаром ОДНА!
И общается она с таблицей разделов через таблицу связей ID_товара и ID_раздела

Т.е.
ID_раздела ---> ID_товара и ID_раздела ---> ID_товара
 

Дmитpий

Guest
И ЧЁ.

1. Узнаеш id_раздела по по id_товара
2. Достаеш id_товаров группы раздела
3. И относительно id_текущего_товара находиш id_предыдущего_товара и id_следующего_товара

В чем проблема-то?
JOIN'ом пользоваться не умеем?
 

tony2001

TeaM PHPClub
м-да
разговор слепого с глухим...

vladax:
а что, собственно, не получается?
постраничный вывод товаров в конкретной категории, где на странице 1 товар?
или вывод ссылки на страницу, где выводятся краткие описания?
 

Дmитpий

Guest
> разговор слепого с глухим...
А кто из нас какой, очень хотелось увидеть или услышать если слепым окажусь я :D

vladax:
Что непонятно, то?
Приведи кусочки своих таблиц!
 

vladax

Новичок
постраничный вывод товаров в конкретной категории, где на странице 1 товар?
Да, когда в строке брюзера передаём ID раздела и ID товара
Как это сделать? Сори, я в мускуле не силён, всё как то с файлами работал пока не припёрло...
 

Дмитpий

Guest
$query = mysql_query("SELECT id_раздела FROM таблица_с_товарами WHERE id_раздела = id_товара ORDER BY id_товара");

while ($tbl = mysql_fetch_array($query)) {
if ($tbl[id_раздела_из_таблицы]==id_раздела) {
$next_id = $tbl[id_раздела_из_таблицы];
break;
}
$previev_id = $tbl[id_раздела_из_таблицы];
}
 

trent

Developer
LIMIT в запросе вывода списка товаров из одной категории
 

Дmитpий

Guest
Сорри. Запрос естественно к таблице соединений относится!

$query = mysql_query("SELECT id_раздела FROM таблица_с_id_товарами_и_id_разделами WHERE id_раздела = id_товара ORDER BY id_товара");
 

vladax

Новичок
Ребят, Вам код показать чтоб стал понятен вопрос?
Я вышел из описанной мной ситуации (постраничный вывод товаров в конкретной категории, где на странице 1 товар) с помощью обычного двухпроходного алгоритма:

PHP:
   $query = "SELECT * FROM links WHERE cat_id = '$cat_id' ORDER BY id_tovar";
   $result = mysql_query($query);

   while ($row = mysql_fetch_array($result)) {
          $id_tovar_arr[] = $row['id_tovar'];
   }//while

   for ($i=0, $y=count($id_tovar_arr); $i<$y; $i++) {
        if ($id_items_arr[$i] == $id_tovar){
            $prev_id = $id_tovar_arr[($i-=1)];
            $next_id = $id_tovar_arr[($i+=2)];
            break;
        }//if
   }//for

   if ($prev_id!=''){
       print "<a href=\"index.php?id_tovar=".$prev_id."&cat_id=".$cat_id."\">".
             "<< Предыдущая</a> |";
   }//if
   print " <a href=\"index.php?cat_id=".$cat_id."\">Назад к разделу</a> |";
   if ($next_id !=''){
       print " <a href=\"index.php?id_tovar=".$next_id."&cat_id=".$cat_id."\">".
             "Следующая >></a>";
   }//if
Я не настолько хорошо юзаю Мускул, поэтому вопрос заключался в том, можно ли сделать как-нибудь по другому юзая какие-нибудь запросы через Мускул. Вот и всё.

ЗЫ: ДИМА, ИЗВИНИ, НО НЕ НАДО ПИСАТЬ ЕРУНДУ:
if ($tbl[id_раздела_из_таблицы]==id_раздела) {
$next_id = $tbl[id_раздела_из_таблицы];
ЧТО БЫ ЭТО ЗНАЧИЛО?
 

trent

Developer
PHP:
$query = "select count(*) from links";
$resultsetId = mysql_query($query);
$countLinks = mysql_result($resultId, 0, 0);
mysql_free_result($resultsetId);
$query = "SELECT * FROM links WHERE cat_id = '.$cat_id' ORDER BY id_tovar limit ".$page.",1";
далее смотрим, если первая страница, то выводим только next, если последнаяя, то только prev

ссылка на след будет
PHP:
if ($page < $countLinks) {
 echo '<a href="lala.php?page="'.($page + 1).'">next</a>';
}
....
 

Дmитpий

Guest
Сорри.
Просто я работой был занят, я думаю ничего страшного если человек способен домыслить :)

next($tbl)
 

Дmитpий

Guest
if ($page < $countLinks) {
echo '<a href="lala.php?page="'.($page + 1).'">next</a>';
}
....


Угу. Подумал? Кто тебе дал гарантию, что id идут один за одним?
 

trent

Developer
В того, кто тебе сказал, что $page это id, можешь бросить камень.
 

vladax

Новичок
2 trent
$query = "select count(*) from links";
$resultsetId = mysql_query($query);
$countLinks = mysql_result($resultId, 0, 0);
mysql_free_result($resultsetId);
Чесслово, эту часть вообще не понял. Что такое $resultId? Не представляю зачем ваще юзают mysql_result?

Целиком твой код не понял, поэтому не могу рассуждать о плюсах и минусах моего по сравнению с твоим.

ЗЫ: Мой код пока всё равно работает, интересно было бы осмысленно порассуждать над альтернативными решениями.
 

trent

Developer
$query = "select count(*) from links";
$resultId = mysql_query($query);
$countLinks = mysql_result($resultId, 0, 0);
mysql_free_result($resultId);

была небольшая опечатка..

а вот что делает [m]mysql_result[/m] читаем в доке
 
Сверху