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