X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Алфавитный рубрикатор
sc2r2bey
sc2r2bey
Topic Starter сообщение 19.1.2010, 12:57; Ответить: sc2r2bey
Сообщение #1


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


--------------------
Заметки о разработке и не только
программирую web и для we
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
FordogeN
FordogeN
сообщение 19.1.2010, 14:53; Ответить: FordogeN
Сообщение #2


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


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 19.1.2010, 19:35; Ответить: ZiTosS
Сообщение #3


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]<?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>";
}
}
?>[/php]


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
Topic Starter сообщение 29.1.2010, 13:13; Ответить: sc2r2bey
Сообщение #4


вот так
[php]<?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 />";
}
}
}
}
?>[/php]

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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 29.1.2010, 14:32; Ответить: ZiTosS
Сообщение #5


sc2r2bey, Одним запросом разбить записи по буквам можно в массиве. Сначала формируем массив с первыми буквами. А затем получаем все позиции, и с помощью PHP помещаем в нужный ключ.
Реализацию, я думаю, сделаешь сам, там ничего сложного.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
Topic Starter сообщение 29.1.2010, 14:49; Ответить: sc2r2bey
Сообщение #6


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 29.1.2010, 14:56; Ответить: ZiTosS
Сообщение #7


sc2r2bey,
У меня 2 , а у тебя 1 + mysql_num_rows($fletter)
Не заметил? Старайся избегать подобных ситуаций с циклами. А особенно когда запросы идут цикл в цикле, это ещё хуже. Когда можно разом вытащить все данные из БД, уж лучше упростить работу с БД иначе нагрузка может стать неимоверной при больших объемах данных.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
Topic Starter сообщение 29.1.2010, 16:02; Ответить: sc2r2bey
Сообщение #8


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 29.1.2010, 22:54; Ответить: ZiTosS
Сообщение #9


sc2r2bey, не надо никакой JOIN. Зачем он тебе нужен?
[php]<?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']] заносим элементы, то есть под нужную букву заносится элемент начинающийся с этой буквы
?>[/php]


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
Topic Starter сообщение 1.3.2010, 22:05; Ответить: sc2r2bey
Сообщение #10


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 18.4.2024, 7:17
Дизайн