Как сформировать динамическую сортировку в запросе
|
|
|
2014-06-06Дата: Пятница, 06.06.2014, 00:05 | Сообщение # 1 |
Сержант
Группа: Проверенные
Статус: 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 где цифры нужно сортировать статьи от большей к меньшей цифре "просмотров".
Ну и вот собственно вопрос как из этого сделать динамическую сортировку в запросе.
| | |
|
|
2014-06-06Дата: Пятница, 06.06.2014, 07:33 | Сообщение # 2 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
И еще не понятно как сделать фильтр тут же что бы выводились статьи от количества просмотров в начале статьи с большим просмотром и по убыванию Вместо:
нужно сделать так что бы при клике на категорию выводились все статьи данной категории а при клике на фильтр он выводил статьи помеченные этим фильтром но только с этой категории Изменить запрос: Код <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}"); Не проверял)
Посмотри на любой кмске как это сделано, все станет понятно)
| | |
|
|
2014-06-06Дата: Пятница, 06.06.2014, 08:48 | Сообщение # 3 |
Сержант
Группа: Проверенные
Статус: Offline
|
Такой глупый вопрос а как мне помимо ".$order." Добавить еще пару массивов ведь фильтр будет не 1н а 3 через запятую? А то Php я только учусь
| | |
|
|
2014-06-06Дата: Пятница, 06.06.2014, 09:06 | Сообщение # 4 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, Такой глупый вопрос а как мне помимо ".$order." Добавить еще пару массивов ведь фильтр будет не 1н а 3 через запятую? Код $order = (isset($_GET['order']))? " AND ".$_GET['order']." = '1'" : ''; $order2.= (isset($_GET['order2']))? " AND ".$_GET['order2']." = '1'" : '';
| | |
|
|
2014-06-06Дата: Пятница, 06.06.2014, 09:53 | Сообщение # 5 |
Сержант
Группа: Проверенные
Статус: Offline
|
Это понятно я про то как добавлять это в запрос order2 через запятую `visible`='1' ".$order.",".$order2." Примерно так?
| | |
|
|
2014-06-06Дата: Пятница, 06.06.2014, 11:05 | Сообщение # 6 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, Это понятно я про то как добавлять это в запрос 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
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 01:37 | Сообщение # 7 |
Сержант
Группа: Проверенные
Статус: 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 'Здесь статей нет!'; ?>
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 05:58 | Сообщение # 8 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, я только не знаю что нужно подправить. - дописать текущую категори, и все гет фильтры - так же как и на ссылках сортировки - те же переменные Код <a href="?category_id=1&page=2&order=name&order2=name2">2</a>
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 09:39 | Сообщение # 9 |
Сержант
Группа: Проверенные
Статус: 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; } ?>
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 11:58 | Сообщение # 10 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, как это по правильному добавить сюда Передавать в функцию вместе с $parametr ваши фильтры: &order=name&order2=name2.
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 19:41 | Сообщение # 11 |
Сержант
Группа: Проверенные
Статус: 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 страницы.
Вещь элементарная я не думал что столько проблем будет что бы связать постраничную навигацию с фильтрами
| | |
|
|
2014-06-07Дата: Суббота, 07.06.2014, 21:38 | Сообщение # 12 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, Вещь элементарная я не думал что столько проблем будет что бы связать постраничную навигацию с фильтрами Конечно будут. И кол-во страниц надо выбирать из базы с учетом фильтров. Продумай логику на бумаге и перепеши заново. А лучше подсмотри где-нибудь - любой магазин открой и сделай по подобию.
| | |
|
|
2014-07-01Дата: Вторник, 01.07.2014, 02:50 | Сообщение # 13 |
Сержант
Группа: Проверенные
Статус: Offline
|
Наконец то появилось время заняться постраничной навигацией:)
Такой вопрос сразу как вот эту строку переделать так что бы оставалось предыдущее значение то есть вывод всех статей без фильтров но формировались статьи в алфавитном порядке не по id а по названию. И 3 запрос по количеству просмотров. Понятно что надо сделать ORDER BY `views` DESC но как его добавить в фильтр? в GET его не добавишь т.к. мы нечего из базы не берем а просто заменяем ORDER BY `id` на views
Код $order.= (isset($_GET['order2']))? " AND ".$_GET['order2']." = '1'" : '';
| | |
|
|
2014-07-01Дата: Вторник, 01.07.2014, 04:07 | Сообщение # 14 |
Аццкий кодер
Группа: Администраторы
Статус: Unknown
|
TokyoZero, Такой вопрос сразу как вот эту строку переделать так что бы оставалось предыдущее значение то есть вывод всех статей без фильтров но формировались статьи в алфавитном порядке не по id а по названию Запоминать где нибудь предыдущее выбранное значение сортировки, или сделать (что более верное) по умолчанию, и проверять - если иная сортировка не задана - выводить по умолчанию.
И 3 запрос по количеству просмотров. Понятно что надо сделать ORDER BY `views` DESC но как его добавить в фильтр? Так же как и строку. А потом готовое - в запрос. Не тупи - открой магазин или форум любой - посмотри исходники: http://likbezz.net/viewtopic.php?f=18&t=1124 - внизу меню множественной сортировки со списками
| | |
|
|
2014-07-01Дата: Вторник, 01.07.2014, 12:11 | Сообщение # 15 |
Сержант
Группа: Проверенные
Статус: Offline
|
Ок спасибо
| | |
|