Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 1
Регистрация: 26.10.2012
Сообщений: 15

Постраничный вывод+сортировка, как правильно реализовать?

26.10.2012, 07:48. Показов 2863. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня! Помогите, пожалуйста, "чайнику" решить следующую проблему... Имеется БД из которой вытягиваются и постранично выводятся данные. Имеются три поля по которым можно сортировать данные: id, name, avtor. По умолчанию сортируем по полю id - постраничный вывод работает нормально (адрес ссылок ... page.php?page=1, page.php?page=2 и т.д.), но если сделать сортировку по другому полю, то сортировка будет только на 1 странице т.к. адрес ссылок будет иметь вид - для первой страницы ...page.php?key=name&sort=ASC, а для последующих page.php?page=2 и т.д.
Зараннее, спасибо.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// запрещаем вывод предупреждений
Error_Reporting(E_ALL & ~E_NOTICE);
// Устанавливаем соединение с базой данных  
include "connect.php";  
// Переменная хранит число сообщений выводимых на станице  
$num = 10;  
// Извлекаем из URL текущую страницу  
$page = $_GET['page'];  
// Определяем общее число сообщений в базе данных  
$result = mysql_query("SELECT COUNT(*) FROM book");  
$posts = mysql_result($result, 0);  
// Находим общее число страниц  
$total = intval(($posts - 1) / $num) + 1;  
// Определяем начало сообщений для текущей страницы  
$page = intval($page);  
// Если значение $page меньше единицы или отрицательно  
// переходим на первую страницу  
// А если слишком большое, то переходим на последнюю  
if(empty($page) or $page < 0) $page = 1;  
  if($page > $total) $page = $total;  
// Вычисляем начиная к какого номера  
// следует выводить сообщения  
$start = $page * $num - $num;  
// Выбираем $num сообщений начиная с номера $start  
 
$key_array = array('id','name','avtor');
$sort_array = array('ASC','DESC');
if (isset($_GET['key']))
{   
    $key=$_GET['key'];  
    $sort=$_GET['sort'];
    }
    else
{   
    $key='id';  
    $sort='DESC';
    }
$result = mysql_query("SELECT * FROM book ORDER BY $key $sort LIMIT $start, $num"); 
// В цикле переносим результаты запроса в массив $postrow  
if($sort=='ASC')
{   
$sort='DESC';   
}
else
{   
$sort='ASC';   
}
function vid_sort($k){
    global $key, $sort; 
    if($k==$key)
    {      
    if($sort=='ASC') 
    {
        $str = "<img src='sort-az.gif' border=0>";
        }
        else
        {
            $str = "<img src='sort-za.gif' border=0>";
            }// вместо "up" и "doun" url картинки 
            }
            else
            {
                $str="";
                } 
                return $str;
                }
 
while ( $postrow[] = mysql_fetch_array($result))
echo "<table>";  
 echo "<tr bgcolor=#CDAC7F> 
     <td width=5% valign=middle align='center'><b><a class='new22' href=\"page.php?key=id&sort=$sort\"># ".vid_sort("id")."</b></td>          
     <td width=40% valign=middle align='center'><b><a class='new22' href=\"page.php?key=name&sort=$sort\">Название публикации ".vid_sort("name")."</b></td> 
        <td width=27% valign=middle align='center'><b><a class='new22' href=\"page.php?key=avtor&sort=$sort\">Автор ".vid_sort("avtor")."</b></td>
     <td width=3% valign=middle align='center'><b>Год изд.</b></td>
     <td width=15% valign=middle align='center'><b>Дата добавления</b></td>
</tr>"; 
for($i = 0; $i < $num; $i++) 
  {  
 echo "<tr bgcolor=#FAFAD2> 
     <td width=7%>".$postrow[$i]['id']."</td>          
     <td width=45%><a href='info.php?id=".$postrow[$i]['id']."'>".$postrow[$i]['name']."</a></td>  
     <td width=30%>".$postrow[$i]['avtor']."</td>
     <td width=5% align='center'>".$postrow[$i]['god']."</td>
     <td width=13%>".$postrow[$i]['data']."</td>
</tr>";  
}  
echo "</table>";  
echo '<b class="zagolovok" >Страницы:</b> ';
// Проверяем нужны ли стрелки назад  
if ($page != 1) $pervpage = '<a href= ./page.php?page=1><<</a>  
                               <a href= ./page.php?page='. ($page - 1) .'><</a> ';  
// Проверяем нужны ли стрелки вперед  
if ($page != $total) $nextpage = ' <a href= ./page.php?page='. ($page + 1) .'>></a>  
                                   <a href= ./page.php?page=' .$total. '>>></a>';  
 
// Находим две ближайшие станицы с обоих краев, если они есть  
if($page - 2 > 0) $page2left = ' <a href= ./page.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';  
if($page - 1 > 0) $page1left = '<a href= ./page.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';  
if($page + 2 <= $total) $page2right = ' | <a href= ./page.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';  
if($page + 1 <= $total) $page1right = ' | <a href= ./page.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>'; 
 
// Вывод меню  
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2012, 07:48
Ответы с готовыми решениями:

Сортировка по категориям + постраничный вывод
Здравствуйте, есть база данных, из которой выводятся данные постранично и есть select, который содержит наименования категорий. Для...

Как реализовать постраничный вывод записей php
$host= 'localhost'; $db_name = 'testing'; $user = 'root'; $password = ''; $pdo = new...

Сортировка товаров по цене не учитывает их постраничный вывод!!!
Короче вывожу товары постранично из базы. Есть вверху товаров у меня две ссылки (при нажатии на которые должна происходить сортировка по...

6
 Аватар для irakli_madrid
11 / 10 / 2
Регистрация: 23.10.2012
Сообщений: 42
26.10.2012, 14:00
У тебя не хватали ковички в тегах "a href", и также не передавались параметры сортировки.
Вот, поменяй второй часть скрипта, должен работать.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
echo '<b class="zagolovok" >Страницы:</b> ';
 
// Проверяем нужны ли стрелки назад  
if ($page != 1) {
    $pervpage = " <a href='../page.php?page=1&key=$key&sort=$sort'><<</a> <a href='../page.php?page=" . ($page - 1) . "&key=$key&sort=$sort'><</a> ";
}
// Проверяем нужны ли стрелки вперед  
if ($page != $total) {
    $nextpage = " <a href='../page.php?page=" . ($page + 1) . "&key=$key&sort=$sort'>></a> <a href='../page.php?page=" . $total . "&key=$key&sort=$sort'>>></a> ";  
}
 
$myResult .= $pervpage;
 
// Находим две ближайшие станицы с обоих краев, если они есть  
if($page - 2 > 0) {
    $page2left = "<a href='../page.php?page=" . ($page - 2) . "&key=$key&sort=$sort'>" . ($page - 2) . "</a> | ";  
    $myResult .= $page2left;
}
if($page - 1 > 0) {
    $page1left = "<a href='../page.php?page=" . ($page - 1) . "&key=$key&sort=$sort'>". ($page - 1) ."</a> | ";  
    $myResult .= $page1left;
}
 
$myResult .= "<b>$page</b>";
 
if($page + 2 <= $total) {
    $page2right = " | <a href='../page.php?page=" . ($page + 2) . "&key=$key&sort=$sort'>" . ($page + 2) ."</a>";  
    $myResult .= $page2right;
}
if($page + 1 <= $total) {
    $page1right = " | <a href='../page.php?page=" . ($page + 1) . "&key=$key&sort=$sort>" . ($page + 1) ."</a>"; 
    $myResult .= $page1right;
}
 
$myResult .= $nextpage;
 
 
// Вывод меню  
echo $myResult;
Добавлено через 3 минуты
Еще немного изменилось вывод итогого результата, так как в "echo" ты выводил переменных, которые могли и не существовать в разных возможных случях.
1
0 / 0 / 1
Регистрация: 26.10.2012
Сообщений: 15
26.10.2012, 16:02  [ТС]
Уважаемый, irakli_madrid, спасибо за помощь!
Но, к сожалению, замена моего кода на Ваш, положительного результата не принес. Результат можно посмотреть здесь http://na5ballov.pro/page.php. Почему-то исчезла 2 страница вывода - идет 1, затем 3. С сортировкой тоже все осталось без изменений.

У тебя не хватали ковички в тегах "a href" - с кавычками тоже проблема - не понятно, когда использовать парные кавычки, а когда - одинарные. ссылки, по приведенному мной коду работали нормально без ковычек в тегах "a href".
Если в адресную строку вручную втавлять параметры сортировки, например, page.php?page=2&key=id&sort=ASC, то все работает, но как их правильно вставить в код?
Буду пробовать дальше...
0
 Аватар для irakli_madrid
11 / 10 / 2
Регистрация: 23.10.2012
Сообщений: 42
26.10.2012, 20:35
Виноват.

PHP
1
$page1right = " | <a href='../page.php?page=" . ($page + 1) . "&key=$key&sort=$sort>" . ($page + 1) ."</a>";
в этом строке пропустил одинарную кавычку (') после переменного "$sort"
))))



В-общем скопируй вот это:

PHP
1
$page1right = " | <a href='../page.php?page=" . ($page + 1) . "&key=$key&sort=$sort[B][COLOR="Red"]'[/COLOR][/B]>" . ($page + 1) ."</a>";
Еще если позволишь, советы:

1. используй конструкцыю:
$myVar = mysql_query("бла-бла-бла") or die(mysql_error());

2. Эти две выражения одинаковые (но второй чытаеться проще):
PHP
1
2
echo '<a href="' . $myVar['link'] . '">';
echo "<a href='$myVar[link]'>";
В гугле много статии про кавычек, перечитай их, это важно знать.

удачи.

Добавлено через 2 минуты
Оказывается про форматированном тексте нельзя изменить цвет букв..
Вот, строка с нужной нами кавычкой:

PHP
1
$page1right = " | <a href='../page.php?page=" . ($page + 1) . "&key=$key&sort=$sort'>" . ($page + 1) ."</a>";
Добавлено через 26 минут
Никак не могу написать в личку, (на форуме я новый).
При проверке твоего сайта еще кое-что заметил:

PHP
1
2
3
4
5
// Это не правильно...
$ххх = $_GET['ххх']; 
 
// Надо писать во так:
$ххх = mysql_real_escape_string($_GET['ххх']);
1
0 / 0 / 1
Регистрация: 26.10.2012
Сообщений: 15
26.10.2012, 21:34  [ТС]
irakli_madrid, спасибо! В понедельник, на работе все проверю. Если все будет ОК, то с меня шоколадка
0
0 / 0 / 1
Регистрация: 26.10.2012
Сообщений: 15
28.10.2012, 13:36  [ТС]
Проверил, ссылки стали иметь нужный вид - page.php?page=2&key=id&sort=ASC. Спасибо! Но вот вылезла очередная "незадача". При каждом переходе на след. ссылку меняется направление сортировки с ASC на DESC и наоборот. Почему это происходит мне понятно (строки 40-47 первоначального кода программы), а вот составить нормальный алгоритм пока не получается Может кто подскажет ссылку на выриант реализации сортировки при постраничном выводе информации.
0
0 / 0 / 1
Регистрация: 26.10.2012
Сообщений: 15
30.10.2012, 10:12  [ТС]
Всем спасибо! Проблема решена.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2012, 10:12
Помогаю со студенческими работами здесь

Как реализовать постраничный вывод данных из xml-файла через Repeater
Добрый вечер. Подскажите, как реализовать постраничный вывод данных из xml файла через repeater.

Постраничный вывод, mysql сортировка без перезагрузки страницы
Как осуществить постраничный вывод, mysql сортировка без перезагрузки страницы(AJAX)? Отдельной страницей все прекрасно, а ajaxom выводит...

Как правильно реализовать ввод и вывод по фамилии?
На сервере хранится список книг, хранящихся в библиотеке. Каждая запись списка содержит следующую информацию о книгах: регистрационный...

Как правильно реализовать ввод-вывод данных через форму
задание: В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) максимальный элемент массива; 2) сумму элементов...

как сделать постраничный вывод из БД?
как сделать постраничный вывод из БД?Да,я вывод сделал(ну мне надо чтобы выводило 20 записей).Но как сделать сылку(Ну страница 1(20...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru