Перейти к содержимому


Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Алфавитный рубрикатор

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 19 Январь 2010 - 11:57

как делается, как здесь http://moscowroma.com/allfactories/

 

 

  • 0

#2 FordogeN

FordogeN
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0

Отправлено 19 Январь 2010 - 13:53

Молча)
Влом думать как вывести сам алфавит, но запрос к бд примерно такой:
SELECT * FROM table WHERE name LIKE 'A%';

  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Январь 2010 - 18:35

sc2r2bey, для реализации алфавитной навигации удобнее извлечь все первые буквы из поля (к примеру название трека в музике или ещё что) таблицы и сгруппировать их при помощи конструкции GROUP BY. Запрос осуществляющий данную операцию, может выглядеть так:
SELECT SUBSTRING(pole, 1, 1) AS letter FROM table_name GROUP BY letter ORDER BY letter

После этого достаточно сформировать ссылки с полученными буквами и передать через GET-параметр выбранную посетителем букву. Чтобы затем выбрать все записи соответствующие букве:
SELECT * FROM table_name WHERE SUBSTRING(pole, 1, 1)='{$bukva}'

Главное не забыть, что надо обезопаситься от SQL-инъекций + вспомнить, что русские символы лучше самому кодировать и декодировать в URL

Вот пример, он выводит алфавитную навигацию имеющихся позиций + если передан параметр $_GET['letter'] то он выводит все товарные позиции начинающиеся с этой буквы:
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");

// Формируем запрос на извлечение первых
// букв товарных позиций
$query = "SELECT SUBSTRING(name,1,1) AS letter
FROM products
GROUP BY letter
ORDER BY letter";
$prd = mysql_query($query);
if(!$prd) exit(mysql_error());
// Если имеется хотя бы одна запись
// выводим её
if(mysql_num_rows($prd) > 0)
{
while($product = mysql_fetch_array($prd))
{
echo "<a href=$_SERVER[PHP_SELF]?letter=$product[letter]>$product[letter]</a> ";
}
}

// Если передан параметр letter и он
// состоит из одного символа - выводим
// содержимое таблицы
if(preg_match("|^[a-z]$|i", $_GET['letter']))
{
// Выводим товарные позиции
$query = "SELECT * FROM products
WHERE SUBSTRING(name,1,1) = '$_GET[letter]'
ORDER BY price";
$prd = mysql_query($query);
if(!$prd) exit(mysql_error());
// Если в текущем каталоге имеется хотя бы
// одна товарная позиция выводим её
if(mysql_num_rows($prd) > 0)
{
echo "<br><br><table border=1>
<tr>
<td>Название</td>
<td>Цена</td>
</tr>";
while($product = mysql_fetch_array($prd))
{
echo "<tr>
<td>$product[name]</td>
<td>$product[price]</td>
</tr>";
}
echo "</table>";
}
}
?>

  • 0

#4 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 29 Январь 2010 - 12:13

вот так
<?php

// Формируем запрос на извлечение первых
// букв товарных позиций
$fsql = "SELECT SUBSTRING(name,1,1) AS letter FROM `factory` GROUP BY letter ORDER BY letter";
$fletter = mysql_query($fsql);
if(!$fletter) exit(mysql_error());
// Если имеется хотя бы одна запись
// выводим её
if(mysql_num_rows($fletter) > 0)
{
while($factory = mysql_fetch_assoc($fletter))
{
echo "<p class=\"letter\">".$factory[letter]."</p>";

// Выводим товарные позиции
$nsql = "SELECT * FROM `factory` WHERE SUBSTRING(name,1,1) = '$factory[letter]'";
$name = mysql_query($nsql);
if(!$name) exit(mysql_error());

// Если в текущем каталоге имеется хотя бы
// одна товарная позиция выводим её
if(mysql_num_rows($name) > 0)
{
while($fname = mysql_fetch_assoc($name))
{
echo $fname[name]."<br />";
}
}
}
}
?>


а как одним запросом сделать?
  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 29 Январь 2010 - 13:32

sc2r2bey, Одним запросом разбить записи по буквам можно в массиве. Сначала формируем массив с первыми буквами. А затем получаем все позиции, и с помощью PHP помещаем в нужный ключ.
Реализацию, я думаю, сделаешь сам, там ничего сложного.
  • 0

#6 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 29 Январь 2010 - 13:49

но так все равно 2 запроса получается
  • 0

#7 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 29 Январь 2010 - 13:56

sc2r2bey,
У меня 2 , а у тебя 1 + mysql_num_rows($fletter)
Не заметил? Старайся избегать подобных ситуаций с циклами. А особенно когда запросы идут цикл в цикле, это ещё хуже. Когда можно разом вытащить все данные из БД, уж лучше упростить работу с БД иначе нагрузка может стать неимоверной при больших объемах данных.
  • 0

#8 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 29 Январь 2010 - 15:02

тут JOIN использовать?
  • 0

#9 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 29 Январь 2010 - 21:54

sc2r2bey, не надо никакой JOIN. Зачем он тебе нужен?
<?php

$factory = array();

// Формируем запрос на извлечение первых
// букв товарных позиций
$sql = "SELECT SUBSTRING(name,1,1) AS letter FROM factory GROUP BY letter ORDER BY letter";
$letters = mysql_query($sql);

// Если имеется хотя бы одна запись
if( mysql_num_rows($letters) > 0 )
while( $array = mysql_fetch_assoc($letters) )
$factory[$array['letter']] = array(); // формируем в массиве $factory с ключами $array['letter'] элементы-массивы

// вытаскиваем все записи из базы и размещаем их в лементе массива под нужной буквой
$sql = "SELECT *, SUBSTRING(name,1,1) AS letter FROM factory";
$result = mysql_query($sql);

// Если имеется хотя бы одна запись
if( mysql_num_rows($result) > 0 )
while( $array = mysql_fetch_assoc($result) )
if( array_key_exists($array['letter'], $factory) ) // если в массиве сформированном ранее присутствует ключ $array['letter']
$factory[$array['letter']][] = $array; // В конец массива $factory[$array['letter']] заносим элементы, то есть под нужную букву заносится элемент начинающийся с этой буквы
?>

  • 0

#10 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 01 Март 2010 - 21:05

не могу понять почему буквы дублируются, вот ссылка http://vengard.ru/index.php?module=all
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru