Помощник
|
Алфавитный рубрикатор |
sc2r2bey
|
Сообщение
#1
|
||
|
|
||
|
|||
FordogeN |
19.1.2010, 14:53;
Ответить: FordogeN
Сообщение
#2
|
|
Молча)
Влом думать как вывести сам алфавит, но запрос к бд примерно такой: SELECT * FROM table WHERE name LIKE 'A%';
-------------------- |
|
|
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] |
|
|
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 |
29.1.2010, 14:32;
Ответить: ZiTosS
Сообщение
#5
|
|
sc2r2bey, Одним запросом разбить записи по буквам можно в массиве. Сначала формируем массив с первыми буквами. А затем получаем все позиции, и с помощью PHP помещаем в нужный ключ.
Реализацию, я думаю, сделаешь сам, там ничего сложного. |
|
|
sc2r2bey
|
Сообщение
#6
|
|
но так все равно 2 запроса получается
-------------------- программирую web и для we |
|
|
ZiTosS |
29.1.2010, 14:56;
Ответить: ZiTosS
Сообщение
#7
|
|
sc2r2bey,
У меня 2 , а у тебя 1 + mysql_num_rows($fletter) Не заметил? Старайся избегать подобных ситуаций с циклами. А особенно когда запросы идут цикл в цикле, это ещё хуже. Когда можно разом вытащить все данные из БД, уж лучше упростить работу с БД иначе нагрузка может стать неимоверной при больших объемах данных. |
|
|
sc2r2bey
|
Сообщение
#8
|
|
тут JOIN использовать?
-------------------- программирую web и для we |
|
|
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] |
|
|
sc2r2bey
|
Сообщение
#10
|
|
не могу понять почему буквы дублируются, вот ссылка http://vengard.ru/index.php?module=all
-------------------- программирую web и для we |
|
|
|
Текстовая версия | Сейчас: 18.4.2024, 7:17 |