Как сформировать динамическую сортировку в запросе - Скрипты и коды для юкоз - Форум аццкого кодера
Фильтр по:
  

Страница 1 из 11
Модератор форума: likbezz 
Скрипты и коды для юкоз - Форум аццкого кодера » Основы, Уроки, Пояснения, Подробности и подобное. » Ленивые вопросы » Как сформировать динамическую сортировку в запросе (Как сформировать динамическую сортировку в запросе)
Как сформировать динамическую сортировку в запросе
Дата: Пятница, 06.06.2014, 00:05 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Здравствуйте столкнулся со следующей проблемой у меня есть категории при нажатии на категорию выводится список статей этой категории в этом проблем нет, но мне нужно так же добавить 3 фильтра сортировки данных статей я сделал 3 поля в таблице для данной сортировки но я не понимаю как создать динамическую сортировку в запросе. То есть при нажатии на категорию будут выводится все статьи а при нажатии уже на ссылку фильтра будут выводится только те статьи которые попадают под этот фильтр данной категории вот код.
Код
                <?php
require_once './config.php';
require_once './functions.php';
$category_id = (int)$_GET['category_id'];
// Получаем название категории
$res_category = mysql_query("SELECT `name` FROM `category` WHERE
`category_id`=' {$category_id} '");
$row_category = mysql_fetch_assoc($res_category);
$perpage = 10; // Количество отображаемых данных из БД
if(isset($_GET['page'])){
$page = (int)$_GET['page'];
if($page < 1) $page = 1;
}else{
$page = 1; // Считывание текущей страницы
}
// Получение количества статей категории
$res = mysql_query("SELECT `id` FROM `articles` WHERE `category`={$category_id} AND `visible`='1'");
$count = mysql_num_rows($res); // кол-во вытащеных записей
$pages_count = ceil($count / $perpage); // Количество страниц
if ($page > $pages_count) $page = $pages_count; // если запрошенная страница превышает кол-во страниц
$start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД
// Выбераем статьи категории
$res_articles = mysql_query("SELECT `id`, `name`, `viewa`, `populara`, `title`, `short_text`, `glav_text`, `avatar`, `date`, `views`, `alt` FROM `articles`
WHERE `category`='{$category_id}' AND `visible`='1' ORDER BY `id` DESC LIMIT {$start_pos}, {$perpage}");
?>
<a href="?order=name">А-Я</a>
<a href="?order=viewa">Просмотры</a>
<a href="?order=populara">Популярность</a>
         <?php
    if(mysql_num_rows($res_articles) > 0) {
         while($row_articles = mysql_fetch_assoc($res_articles)) {
                         echo '<div class="blok">'."\r\n";
                         echo '<a href="' .$site_url. 'view_article.php?id=' .$row_articles['id'].'"><img src="' .$row_articles['avatar']. '" alt="' .htmlspecialchars($row_articles['alt']).'" title="' .htmlspecialchars($row_articles['alt']).'"></a>'."\r\n";
                         echo '<h2><a href="' .$site_url. 'view_article.php?id=' .$row_articles['id'].'">'.htmlspecialchars($row_articles['glav_text']).'</a></h2>'."\r\n";
                         echo  $row_articles ['short_text']."\r\n";
                         echo '<p class="date"> Просмотров: '. $row_articles['views']. ' | Дата: ' .$row_articles['date']. '</p>'."\r\n";
                         echo '</div>'; '<hr />'."\r\n";
                 }
            
         }  else   echo 'Здесь статей нет!';
            ?>

Как видно из кода есть вот 3 фильтра
Код
<a href="?order=name">А-Я</a>
<a href="?order=viewa">Просмотры</a>
<a href="?order=populara">Популярность</a>


Нужно при клике на каждый из фильтров выводить те статьи которые помечены этим фильтром в данном случае в таблице я использовал следующий параметр Enum '0','1'

И вот тут проблема нужно сделать так что бы при клике на категорию выводились все статьи данной категории а при клике на фильтр он выводил статьи помеченные этим фильтром но только с этой категории. Нужно как то модернизировать вот этот запрос в динамическую сортировку.
Код
// Выбераем статьи категории
$res_articles = mysql_query("SELECT `id`, `name`, `viewa`, `populara`, `title`, `short_text`, `glav_text`, `avatar`, `date`, `views`, `alt` FROM `articles`
WHERE `category`='{$category_id}' AND `visible`='1' ORDER BY `id` DESC LIMIT {$start_pos}, {$perpage}");


И еще не понятно как сделать фильтр тут же что бы выводились статьи от количества просмотров в начале статьи с большим просмотром и по убыванию. Команду от А до Я я знаю это ASC а как сделать сортировку по полю views где цифры нужно сортировать статьи от большей к меньшей цифре "просмотров".

Ну и вот собственно вопрос как из этого сделать динамическую сортировку в запросе.


 
Дата: Пятница, 06.06.2014, 07:33 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


Цитата TokyoZero, Пт, 06.06.2014, 00:05:32
И еще не понятно как сделать фильтр тут же что бы выводились статьи от количества просмотров в начале статьи с большим просмотром и по убыванию

Вместо:
Код
ORDER BY `id` DESC

Код
ORDER BY `views` DESC


Цитата TokyoZero, Пт, 06.06.2014, 00:05:32
нужно сделать так что бы при клике на категорию выводились все статьи данной категории а при клике на фильтр он выводил статьи помеченные этим фильтром но только с этой категории

Изменить запрос:
Код
<a href="?category_id=1&order=name">А-Я</a>


Добавить условие в скрипт:
Код
$order = (isset($_GET['order']))? " AND ".$_GET['order']." = '1'" : '';


И в запрос.
Код
$res_articles = mysql_query("SELECT `id`, `name`, `viewa`, `populara`, `title`, `short_text`, `glav_text`, `avatar`, `date`, `views`, `alt` FROM `articles`
WHERE `category`='{$category_id}' AND `visible`='1' ".$order." ORDER BY `id` DESC LIMIT {$start_pos}, {$perpage}");

Не проверял)

Посмотри на любой кмске как это сделано, все станет понятно)


 
Дата: Пятница, 06.06.2014, 08:48 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Такой глупый вопрос а как мне помимо ".$order." Добавить еще пару массивов ведь фильтр будет не 1н а 3 через запятую? А то Php я только учусь smile

 
Дата: Пятница, 06.06.2014, 09:06 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Пт, 06.06.2014, 08:48:33
Такой глупый вопрос а как мне помимо ".$order." Добавить еще пару массивов ведь фильтр будет не 1н а 3 через запятую?

Код
$order = (isset($_GET['order']))? " AND ".$_GET['order']." = '1'" : '';
$order2.= (isset($_GET['order2']))? " AND ".$_GET['order2']." = '1'" : '';


 
Дата: Пятница, 06.06.2014, 09:53 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Это понятно я про то как добавлять это в запрос order2 через запятую
`visible`='1' ".$order.",".$order2." Примерно так?


 
Дата: Пятница, 06.06.2014, 11:05 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Пт, 06.06.2014, 09:53:36
Это понятно я про то как добавлять это в запрос order2 через запятую

Ой, нет, вот так:
Код
$order = (isset($_GET['order']))? " AND ".$_GET['order']." = '1'" : '';
$order.= (isset($_GET['order2']))? " AND ".$_GET['order2']." = '1'" : '';

- получится строка:
Код
AND name = '1' AND «второе значение - $_GET['order2']» = '1'


В запрос просто переменную:
Код
`visible`='1' ".$order." ORDER BY


 
Дата: Суббота, 07.06.2014, 01:37 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Разобрался только осталась 1на проблемка. Когда у меня выводится список статей с определенным фильтром допустим 15 статей по 10 статей на страницу при переходе на следующую страницу меня снова перекидывает на просто категорию без фильтра, опять же если статей 5 то внизу сей равно появляется перелистывание страниц ровно столько сколько всего статей в категории. Понятно что нужно что то подправить в Pagination, я только не знаю что нужно подправить.

Код
                <?php
require_once './config.php';
require_once './functions.php';
$category_id = (int)$_GET['category_id'];
// Получаем название категории
$res_category = mysql_query("SELECT `category_id`, `name` FROM `category` WHERE
`category_id`=' {$category_id} '");
$row_category = mysql_fetch_assoc($res_category);
$perpage = 10; // Количество отображаемых данных из БД
if(isset($_GET['page'])){
$page = (int)$_GET['page'];
if($page < 1) $page = 1;
}else{
$page = 1; // Считывание текущей страницы
}
// Получение количества статей категории
$res = mysql_query("SELECT `id` FROM `articles` WHERE `category`={$category_id} AND `visible`='1'");
$count = mysql_num_rows($res); // кол-во вытащеных записей
$pages_count = ceil($count / $perpage); // Количество страниц
if ($page > $pages_count) $page = $pages_count; // если запрошенная страница превышает кол-во страниц
$start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД
$order = (isset($_GET['older1']))? " AND ".$_GET['older1']." = '1'" : '';
$order.= (isset($_GET['older2']))? " AND ".$_GET['older2']." = '1'" : '';
// Выбераем статьи категории
$res_articles = mysql_query("SELECT `id`, `title`, `older1`, `older2`, `short_text`, `glav_text`, `avatar`, `views`, `alt` FROM `articles`
WHERE `category`='{$category_id}' AND `visible`='1' ".$order." ORDER BY `id` DESC LIMIT {$start_pos}, {$perpage}");
?>
                    <div class="panel1">
                    <table class="table">
                    <tbody>
                    <tr>
                    <td style="vertical-align: top">
                    <a class="table_t" href="?category_id=<?php echo $row_category['category_id']; ?>">Все</a>
                    <br><br>
                    </td>
                    <td style="vertical-align: top">
                    <a class="table_t" href="?category_id=<?php echo $row_category['category_id']; ?>&older1=older1">В центре города</a>
                    <br><br>
                    </td>
                    <td style="vertical-align: top">
                    <a class="table_t" href="?category_id=<?php echo $row_category['category_id']; ?>&older2=older2">По популярности</a>
                    <br><br>
                    </td>                    
                    </tr>
                    </tbody>
                    </table>
                    </div>
         <?php
    if(mysql_num_rows($res_articles) > 0) {
         while($row_articles = mysql_fetch_assoc($res_articles)) {
                         echo '<div class="blok">'."\r\n";
                         echo '<a href="' .$site_url. 'view_article.php?id=' .$row_articles['id'].'"><img src="' .$row_articles['avatar']. '" alt="' .htmlspecialchars($row_articles['alt']).'" title="' .htmlspecialchars($row_articles['alt']).'"></a>'."\r\n";
                         echo '<h2><a href="' .$site_url. 'view_articles.php?id=' .$row_articles['id'].'">'.htmlspecialchars($row_articles['glav_text']).'</a></h2>'."\r\n";
                         echo  $row_articles ['short_text']."\r\n";
                         echo '<p class="date"> Просмотров: '. $row_articles['views'].'</p>'."\r\n";
                         echo '</div>'; '<hr />'."\r\n";
                 }
            
         }  else   echo 'Здесь статей нет!';
            ?>


 
Дата: Суббота, 07.06.2014, 05:58 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Сб, 07.06.2014, 01:37:46
я только не знаю что нужно подправить.

- дописать текущую категори, и все гет фильтры - так же как и на ссылках сортировки - те же переменные
Код
<a href="?category_id=1&page=2&order=name&order2=name2">2</a>


 
Дата: Суббота, 07.06.2014, 09:39 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Не подскажите пожалуйста вот код как это по правильному добавить сюда я просто брал кусок кода а так конкретно в нем и не разобрался:
Код
<?php

function pagination($page, $pages_count, $parametr){
// проверяем нужна ли ссылка в начало
if($page > 3){
   $startpage = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page=1">В начало</a>';
}else{
   $startpage = '';
}
// проверяем нужна ли ссылка в конец
if($page < ($pages_count - 2)){
   $endpage = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page='.$pages_count.'">В конец</a>';
}else{
   $endpage = '';
}

// находим 2 ближайшие страницы по бокам
if($page - 2 > 0){
   $page2left = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page='.($page - 2).'">'.($page - 2).'</a>';
}else{
   $page2left = '';
}
if($page - 1 > 0){
   $page1left = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page='.($page - 1).'">'.($page - 1).'</a>';
}else{
   $page1left = '';
}
if($page + 1 <= $pages_count){
   $page1right = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page='.($page + 1).'">'.($page + 1).'</a>';
}else{
   $page1right = '';
}
if($page + 2 <= $pages_count){
   $page2right = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page='.($page + 2).'">'.($page + 2).'</a>';
}else{
   $page2right = '';
}

// выводим навигацию
echo $startpage.$page2left.$page1left.'<a class="pagenav_active">'.$page.'</a>'.$page1right.$page2right.$endpage;
}
?>


 
Дата: Суббота, 07.06.2014, 11:58 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Сб, 07.06.2014, 09:39:43
как это по правильному добавить сюда

Передавать в функцию вместе с $parametr ваши фильтры: &order=name&order2=name2.


 
Дата: Суббота, 07.06.2014, 19:41 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Добавил не не помогло, возможно не правильно вписываю :
Код

Вот кусок примера как я сделал:  
if($page > 3){
   $startpage = '<a class="pagenav_link" href="'.$_SERVER['PHP_SELF'].'?category_id='.$parametr.'&page=1&order=name&order2=name2">В начало</a>';
}else{
   $startpage = '';
}

Добавлено (07.06.2014, 19:41)
---------------------------------------------
если ввести 1н фильтр например &order=name он выведет все правильно, но он не выбирает а записывает в кучу оба фильтра и все &order=name&order2=name2

Ну и + это не помогает от того что он делает пагинацию по количеству страниц в категории а не отмеченном фильтре, то есть если на страницы должно быть статей 10 а всего в категории 15 то появятся 2 страницы, но после применения фильтра по идее статей 5ть но сей равно считывается с общего количества статей и показывает якобы 2 страницы.

Вещь элементарная я не думал что столько проблем будет что бы связать постраничную навигацию с фильтрами biggrin

 
Дата: Суббота, 07.06.2014, 21:38 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Сб, 07.06.2014, 19:41:04
Вещь элементарная я не думал что столько проблем будет что бы связать постраничную навигацию с фильтрами

Конечно будут.
И кол-во страниц надо выбирать из базы с учетом фильтров.
Продумай логику на бумаге и перепеши заново.
А лучше подсмотри где-нибудь - любой магазин открой и сделай по подобию.


 
Дата: Вторник, 01.07.2014, 02:50 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Наконец то появилось время заняться постраничной навигацией:)

Такой вопрос сразу как вот эту строку переделать так что бы оставалось предыдущее значение то есть вывод всех статей без фильтров но формировались статьи
в алфавитном порядке не по id а по названию. И 3 запрос по количеству просмотров. Понятно что надо сделать ORDER BY `views` DESC но как его добавить в фильтр? в GET его не добавишь т.к. мы нечего из базы не берем а просто заменяем ORDER BY `id` на views

Код
$order.= (isset($_GET['order2']))? " AND ".$_GET['order2']." = '1'" : '';


 
Дата: Вторник, 01.07.2014, 04:07 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9094
Награды: 23
Репутация: 457
Статус: Unknown


TokyoZero,
Цитата TokyoZero, Вт, 01.07.2014, 02:50:33
Такой вопрос сразу как вот эту строку переделать так что бы оставалось предыдущее значение то есть вывод всех статей без фильтров но формировались статьи
в алфавитном порядке не по id а по названию

Запоминать где нибудь предыдущее выбранное значение сортировки, или сделать (что более верное) по умолчанию, и проверять - если иная сортировка не задана - выводить по умолчанию.

Цитата TokyoZero, Вт, 01.07.2014, 02:50:33
И 3 запрос по количеству просмотров. Понятно что надо сделать ORDER BY `views` DESC но как его добавить в фильтр?

Так же как и строку.
А потом готовое - в запрос.
Не тупи - открой магазин или форум любой - посмотри исходники:
http://likbezz.net/viewtopic.php?f=18&t=1124
- внизу меню множественной сортировки со списками


 
Дата: Вторник, 01.07.2014, 12:11 |
TokyoZero
Сержант
Группа: Проверенные
Сообщений: 30
Награды: 0
Репутация: 0
Статус: Offline


Ок спасибо smile

 
Скрипты и коды для юкоз - Форум аццкого кодера » Основы, Уроки, Пояснения, Подробности и подобное. » Ленивые вопросы » Как сформировать динамическую сортировку в запросе (Как сформировать динамическую сортировку в запросе)
Страница 1 из 11
Поиск: