За последние 24 часа нас посетили 17858 программистов и 1700 роботов. Сейчас ищут 1535 программистов ...

Сортировка таблицы.

Тема в разделе "PHP для новичков", создана пользователем RelictX, 17 окт 2008.

  1. kostyl

    kostyl Guest

    RelictX
    ну ты даешь чел, тебе ж написали
     
  2. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Тваюмать!

    у тебя есть запрос. Его текст лежит в php переменной $sql. Совершенно неважно что конкретно в запросе.

    Что происходит в момент нажатия на название?

    в простейшем случае происходит переход по ссылке скрипт.php?field=название_поля_по_которому_кликнули&sort=$sort_из_php_скрипта

    дальше в скрипте ты проверяешь

    PHP:
    1.  
    2. $field = isset($_GET['field']) && in_array($_REQUEST['field'], $fields) ? $_REQUEST['field'] : 'name';
    3. $sort = isset($_GET['sort']) && $_REQUEST['sort'] == 'DESC' ? 'ASC' : 'DESC';
    4. $sql .= " ORDER BY ".$field." ". $sort;
    5.  
    все! все что требуется от тебя это либо при созаднии страницы делать названия полей ссылками соответствующего вида, либо ставить на них onclick(), в котором переходить по ссылке. Или сабмитить невидимую форму с хидден полями field и sort, причем sort заполняется переменной $sort при формировании страницы.

    Ах да. Данные приходят не из phpMyAdmin, они приходят из БД. В phpMyAdmin никаких твоих данных нет, не было и не бывает.

    2Mete0
    я немного изменил твою строку с $sort, чтобы приходило не желаемый порядок, а текущий, так ссылку формировать проще.
     
  3. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Можно сделать ещё проще, вообще без JavaScript, а значение передавать через <a href="....">. :)

    А значения href формировать в самом скрипте, вида href="script.php?field=field&amp;sort=asc"
     
  4. kostyl

    kostyl Guest

    всё закрывайте нафих
     
  5. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Ну вот, видишь как все просто оказалось. :)
     
  6. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Эээ... ты никого ни с кем не спутал?
     
  7. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Ой, да извиняюсь. :)
     
  8. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    считаю необоснованным использование php в данном случае, и вообще, лишние обращения к серверу как таковые (где тут смайл с языком :) ) при конечных данных.
    все данные уже на стороне пользователя, обеспечить их сортировку в таблице - задача js.
     
  9. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Ну, можно и js. Кучей методов, включая самые извращенные. Можно, например, при формировании страницы заполнить данными массив строк типа
    [js]
    arr[1]="<tr><td>имя</td><td>фамилия</td><td>возраст</td></tr>";
    arr[2]="<tr><td>имя</td><td>фамилия</td><td>возраст</td></tr>";
    [/js]
    И по кнопке на onclick перерисовывать таблицу, выводя в нее этот массив то с начала то с конца.

    А можно попариться с DOM и менять местами ячейки таблицы.

    О, еще идея. Запихать каждую строку в отдельный див, сверстать все это абсолютным позиционированием и по нажатию на кнопку менять css с позиционированием дивов на обратное :)

    В общем извращаться долго можно
     
  10. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    karakh
    ключевое слово: "попариться с DOM" (причем в легонькой его форме) ;)
    на самом деле, париться долго не надо, как говориться - сел и сделал.

    ps: просто я написал когда-то такую фигню (на основе другой) не от праздной жизни. Есть такой продукт HP Service Desk.
    У них есть абсолютно убогий Java API (а другого и нет). Таблица (заявок в сервис деске) хоть и не большая, но засчет кривизны API генериться очень долго. Каждый раз после сортировки в таблице заставлять пользователя опять ждать не было возможности.
     
  11. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Да чем оно ключевое? Один из вариантов. А попариться потому что кроссбраузерность, а изменение DOM-дерева та еще задачка для демонстрации отличий всем-известного-броузера от нормы :) Впрочем, с css-способом париться придется еще больше.

    Если честно, я бы делал массивом. Дешево, надежно и практично, раз уж надо js-ом а не php.
     
  12. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Зачем всё усложнять? А что если JavaScript у пользователя выключен? Думаете БД загнется от такого запроса?
    Ужас.
     
  13. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    От задачи зависит. От одного запроса БД не сдохнет. А от скольки сдохнет? Сидит три тысячи юзеров какой-нибудь игры типа линейки, и давят на кнопки, статистику смотрят и сверяют по часу в день но все в одно и то же время. Или 100к человек, поставивших деньги на что-то там смотрят ровно в 22:00 как изменились ставки. Или 20к участников интернет-конкурса смотрят результаты и сортируют то по городам, то по местам, то еще как.

    Если задача решена через sql запрос, то они дергают базу данных, а БД всегда самое узкое место.
    Если задача решена средствами php ($arr=mysql_fetch_array($result, MYSQL_NUM); и выдача страницы с выводом вверх или вниз массива $arr) то все они дергают php сервер.
    А если решение сделано через js, то каждый парит только свой браузер. Зато парят страшно, потому что 100к записей обрабатывать js-ом - это для врагов.

    Ну а еще трафик для кого-то важен...
     
  14. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Ужас... При таких загрузках, тут будет совсем другой подход :) И JS тут не поможет никак.

    У БД есть кеш...

    100к записей выводить никто разом не станет.

    Вот об этом думать точно не стоит, экономия на спичках.
     
  15. Mete0

    Mete0 Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    272
    Симпатии:
    0
    Адрес:
    Gatchina
    Оптимизировать нужно то, что тормозит, а не заниматься херней, создаёте себе лишние проблемы, почём зря. Темя себя исчерпала.
     
  16. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Mete0
    1. оптимизировать нужно сразу, а не ждать когда потребуется.
    2. причем тут кэш БД сервера?
    3. tcp соединение по-твоему не требует никаких ресурсов сервера?
    4. не говоря уже о прочих накладных расходах?

    например: можно почитать Citrix NetScaler - multiplexing tcp connections.

    А вообще, да, тему можно закрывать, каждый останется при своих (как обычно :) )
     
  17. RelictX

    RelictX Активный пользователь

    С нами с:
    17 окт 2008
    Сообщения:
    58
    Симпатии:
    0
    Адрес:
    Казань
    Итак, прошу прощения за то что тупил, все таки пару недель как сел за php и sql)) Посидел, почитал ваши сообщения и разобрался. Очень благодарен всем, кто учавствовал)

    Сортировка в несколько столбцов:

    Сначала заголовки столбцов:

    PHP:
    1. <table>
    2. .
    3. .
    4. .
    5. <th>
    6. <?php
    7. $sort = isset($_GET['sort']) && $_REQUEST['sort'] == 'DESC' ? 'ASC' : 'DESC';
    8. echo '
    9. <a href="browse.php?field=[b]Поле1[b]&amp;sort='.$sort.'">Имя поля</a>';
    10. ?>
    11. </th>
    12. .
    13. .
    14. .
    15. <th>
    16. <?php
    17. $sort = isset($_GET['sort']) && $_REQUEST['sort'] == 'DESC' ? 'ASC' : 'DESC';
    18. echo '
    19. <a href="browse.php?field=[b]ПолеN[b]&amp;sort='.$sort.'">Имя поля</a>';
    20. ?>
    21. </th>
    22. .
    23. .
    24. .
    25. </table>
    Далее sql запрос три строки:

    PHP:
    1. <?php
    2.  
    3. sql="";
    4.  
    5. $fields = array('Поле1', ... ,'ПолеN');
    6. $field = isset($_GET['field']) && in_array($_REQUEST['field'], $fields) ? $_REQUEST['field'] : 'name';
    7. $sql .= " ORDER BY ".$field." ". $sort;
    8.  
    9. ?>
    Вот может кому то, как мне, новичкам поможет.
    У профи хотелось еще спросить... Вот у меня допустим данных много, я разделил их с помощью показа на странице 10 строк. Имеются переключатели страниц, чтобы увидеть остальные данные. Как сделать так, чтобы при сортировке допустим по ASC и переключкении страницы, сортировка сохранялась ASC, а не переходила в какой то другой сорт.
     
  18. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вариантов масса - например: input type=hidden
     
  19. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    можно хранить текущее поле и вид сортировки в сессии или просто в отдельной переменной и если она не пришла из $_GET то брать оттуда. А можно ссылку на следующие 10 страниц просто формировать по тому же принципу, что и ссылку сортировки, то есть

    HTML:
    1. <a href="'browse.php?field='.ПолеN.'&sort='.$sort.'&[b]skip=10[/b]'">Next</a>';
     
  20. RelictX

    RelictX Активный пользователь

    С нами с:
    17 окт 2008
    Сообщения:
    58
    Симпатии:
    0
    Адрес:
    Казань
    obsrv

    Еще вот вопрос, js-сортировка работает вроде тоже прекрасно, но сортирует только данный лист, на котором 10 записей. Как сделать, чтобы она всю базу сортировала, а не отображаемый лист? В самой js-ке надо ковыряться?
     
  21. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    RelictX
    придётся загружать всю информацию, и уже с помощью JS разбивать по страницам/сортировать и показывать только нужное

    плюс тут в том, что достаточно один раз загрузить все данные..
    минус в том, что данных может быть очень много :)
     
  22. RelictX

    RelictX Активный пользователь

    С нами с:
    17 окт 2008
    Сообщения:
    58
    Симпатии:
    0
    Адрес:
    Казань
    Спасиб, будем разбираться :shock:
     
  23. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    RelictX
    ещё как вариант: ajax
     
  24. RelictX

    RelictX Активный пользователь

    С нами с:
    17 окт 2008
    Сообщения:
    58
    Симпатии:
    0
    Адрес:
    Казань
    Еще по поводу сортировки возникла проблемка.
    Сортировка идет нормально, при ввыводе всех данных.
    А при условии вывода интересующей части данных, пишет ошибку.

    mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in

    Ссылается на:

    PHP:
    1. $rows_count=mysqli_num_rows($result);
    Получется, что при выводе всех данных, он массив обрабатывает. а при условии каком то, не фурычит, в чем может быть причина?
     
  25. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    от тебе false возвращает
    забей запрос в переменную перед mysqli_query(), выведи на экран и скинь сюда