Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > sql сортировка данных


Автор: YuraKo 27.1.2009, 12:19
Здраствуйте. База 4 поля ID,FIO,TN,Adress. написал сортировку:
Код

<?
if (isset($_GET['param']))
{
$paramm=$_GET['param'];
$result=mysql_query("select * from user ORDER BY $paramm",$DB);
$myrow=mysql_fetch_assoc($result);
$N=mysql_num_rows($result);
echo "<table border=1>";
echo "<tr><td><a href='ViewData.php?param=ID'>ID</a></td><td><a href='ViewData.php?param=FIO'>FIO</a></td><td><a href='ViewData.php?param=TN'>TN</a></td><td><a href='ViewData.php?param=Adress'>Adress</a></td></tr>";
do
  {
  echo "<tr><td>".$myrow['ID']."</td><td>".$myrow['FIO']."</td><td>".$myrow['TN']."</td><td>".$myrow['Adress']."</td></tr>";
  }
  while ($myrow=mysql_fetch_assoc($result));
echo "</table>";
}
else
{
$result=mysql_query("select * from user",$DB);
$myrow=mysql_fetch_assoc($result);
$N=mysql_num_rows($result);
echo "<table border=1>";
echo "<tr><td><a href='ViewData.php?param=ID'>ID</a></td><td><a href='ViewData.php?param=FIO'>FIO</a></td><td><a href='ViewData.php?param=TN'>TN</a></td><td><a href='ViewData.php?param=Adress'>Adress</a></td></tr>";
do
  {
  echo "<tr><td>".$myrow['ID']."</td><td>".$myrow['FIO']."</td><td>".$myrow['TN']."</td><td>".$myrow['Adress']."</td></tr>";
  }
  while ($myrow=mysql_fetch_assoc($result));
echo "</table>";
}
?>

Сортировка  работает только по возрастанию, мене нужно что бы при переходе на ту же ссылку сортировало поочередно по возрастанию и по убыванию-1 клик сортировка по возрастанию, 2-й клик по убыванию и.т.д. Знаю что в запросе можно заюзать  DESC для обратной сортировки...
Как правельно организовуется такая сортировка?

Добавлено через 3 минуты и 37 секунд
И есчо вопросик: как правельно организовать постраничный вывод данных базы? я то зделал но там не доконца правельно да и каша в коде полная. Если можете скиньте Алгоритм что типа стандартного для такой задачи)

Автор: enof 27.1.2009, 12:34
Цитата(YuraKo @  27.1.2009,  12:19 Найти цитируемый пост)

И есчо вопросик: как правельно организовать постраничный вывод данных базы? я то зделал но там не доконца правельно да и каша в коде полная. Если можете скиньте Алгоритм что типа стандартного для такой задачи) 

1.Узнаем количество записей.
2.Вычисляем количество страниц.
3.Устанавливаем запрошенную страницу.
4.Вычисляем с какой записи и сколько выводить.
5.Достаем из базы и выводим
Сейчас пример напишу.

Автор: YuraKo 27.1.2009, 12:46
Цитата(enof @  27.1.2009,  12:34 Найти цитируемый пост)
1.Узнаем количество записей.2.Вычисляем количество страниц.3.Устанавливаем запрошенную страницу.4.Вычисляем с какой записи и сколько выводить.5.Достаем из базы и выводим

По этим пунктам делал, но мало опыта в php потому и правельно организовать алгоритм несмог-вышла каша которая недоконца коректно работает, вот за примерчик буду благодарен )

Автор: enof 27.1.2009, 12:53
Код

<?php
$num_msg = 5; //Количество записей на одной странице.

$result = mysql_query("SELECT COUNT(*) as cnt FROM table_name"); //Количество записей в таблице.
$cnt_row = mysql_result($result,0,'cnt');

$num_page = ceil($cnt_row/$num_msg);  //Количество страниц.

$current_page=!empty($_GET['page']) ? intval($_GET['page']) : 1; //Текущая страница.Предполагается,что номер страницы передается в $_GET['page']


if($current_page>$num_page || $current_page<1)        //Проверяем номер запрошенной страницы,если он больше,чем всего страниц или меньше 1,то устанавливаем 1
    $current_page = 1;
    
$start = $current_page*$num_msg-$num_msg;        //$start - номер записи,с которой будут извлекаться данные

$result=mysql_query("SELECT * FROM msg ORDER BY id DESC LIMIT $start,$num_msg"); //Делаем запрос к базе.Сортируем по id в обратном порядке.

while($row=mysql_fetch_assoc($result))        //В цикле выводим данные.
{
    echo "id:".$row['id']."<br>";
    echo "name:".$row['name']."<br>";
    echo "<hr>";
}

echo "Страницы: ";
for($i=1;$i<=$num_page;$i++)        //В цикле выводим номера страниц.
{
    if($i==$current_page)
        echo " $i ";
    else
        echo " <a href='index.php?page=$i'>$i</a> ";
}
?>

Если что не понятно,спрашивайте.

Автор: YuraKo 27.1.2009, 13:04
Спасибо, по коду вроде все понятно, это попробую совместить с сортировкой, вобщем поиграюсь и отпишу результат...

Автор: enof 27.1.2009, 13:16
По поводу сортировки.
По убыванию:
Код

SELECT * FROM user ORDER BY $paramm DESC

Можно писать в сессию,как сортировались данные в предыдущий раз.
Код

if (isset($_GET['param']))
{
    $paramm=$_GET['param'];
    if($_SESSION['orderby'])
    {
        $result=mysql_query("SELECT * FROM user ORDER BY $paramm DESC");
        $_SESSION['orderby'] = false;
    }else{
        $result=mysql_query("SELECT * FROM user ORDER BY $paramm");
        $_SESSION['orderby'] = true;
    }
    $myrow=mysql_fetch_assoc($result);
    //Далее все как обычно

p.s.
Обычно пишут ключевые слова прописными буквами,а названия полей строчными.
И еще,http://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0

Автор: YuraKo 27.1.2009, 18:54
enof, Спасибо за помощь, вроде получилось все)

Автор: BOY 1.2.2009, 00:33
Код

$num_msg = 5; //Количество записей на одной странице.
$result = mysql_query("SELECT COUNT(*) as cnt FROM fotoshop_lessons"); //Количество записей в таблице.
$cnt_row = mysql_result($result,0,'cnt');

$num_page = ceil($cnt_row/$num_msg);  //Количество страниц.

$current_page=!empty($_GET['page']) ? intval($_GET['page']) : 1; //Текущая страница.Предполагается,что номер страницы передается в $_GET['page']

if($current_page>$num_page && $current_page<1)        //Проверяем номер запрошенной страницы,если он больше,чем всего страниц или меньше 1,то устанавливаем 1
    $current_page = 1;
    
$start = $current_page*$num_msg-$num_msg;        //$start - номер записи,с которой будут извлекаться данные

$result=mysql_query("SELECT * FROM fotoshop_lessons ORDER BY id DESC LIMIT $start,$num_msg"); //Делаем запрос к базе.Сортируем по id в обратном порядке.

while($row=mysql_fetch_assoc($result))        //В цикле выводим данные.
{
    echo "$row[id]";
    echo "$row[title]";
    echo "<hr>";
}

echo "Страницы: ";
for($i=1;$i<=$num_page;$i++)        //В цикле выводим номера страниц.
{
    if($i==$current_page)
        echo " $i ";
    else
        echo " <a href='lessonsFoto.php?page=$i'>$i</a> ";
}

В том коде были ошибки при запросе к mysql_query. Почему у меня при вставке этого скрипта в файл,не сортируются страницы.Тоесть,строка " 1 2 3 4 5 6 7 8 9 "и т.д. выводится,но на каждой из этих страниц так и остаётся кол-во сообщений.Выводятся просто цифры.
Скриншот:

http://www.radikal.ru

Автор: enof 1.2.2009, 12:12
Код

В том коде были ошибки при запросе к mysql_query

Где?
Цитата(BOY @  1.2.2009,  00:33 Найти цитируемый пост)
Почему у меня при вставке этого скрипта в файл,не сортируются страницы.

Код писал не для копипаста,а чтобы объяснить примерно,как и что работает.

Автор: BOY 1.2.2009, 12:30
Код

$result = mysql("SELECT COUNT(*) as cnt FROM table_name"); //Количество записей в таблице.
$result=mysqlq("SELECT * FROM msg ORDER BY id DESC LIMIT $start,$num_msg"); //Делаем запрос к базе.Сортируем по id в обратном порядке.

Нужно написать mysql_query,запрос ведь smile 
Цитата

Код писал не для копипаста,а чтобы объяснить примерно,как и что работает.

Можешь подсказать,как сделать нормальный вывод сообщений?Если что,в аське можноsmile

Автор: enof 1.2.2009, 12:33
Цитата(BOY @  1.2.2009,  12:30 Найти цитируемый пост)
Нужно написать mysql_query,запрос ведь smile 

точно smile у меня просто свои функции написаны,вот и забылся маленько

Автор: Teleport 3.2.2009, 16:00
2 enof - в твоем коде есть такие строки
Код

if($current_page>$num_page && $current_page<1)        //Проверяем номер запрошенной страницы,если он больше,чем всего страниц или меньше 1,то устанавливаем 1
    $current_page = 1;


я вот понять не могу в коде у тебя оператор AND а в комментарии пишешь ИЛИ. Вот не совсем понятен момент... Я думаю, что && меняем на ||. Или нет?

Автор: enof 3.2.2009, 16:05
Цитата(Teleport @  3.2.2009,  16:00 Найти цитируемый пост)
я вот понять не могу в коде у тебя оператор AND а в комментарии пишешь ИЛИ. Вот не совсем понятен момент... Я думаю, что && меняем на ||. Или нет? 

ага,косяк,надо ||  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)