За последние 24 часа нас посетили 18494 программиста и 1706 роботов. Сейчас ищут 774 программиста ...

Сортировка

Тема в разделе "PHP для новичков", создана пользователем patrik, 16 авг 2012.

  1. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Есть таблица в mysql.
    Дата:
    12.04.2012
    15.07.2012
    20.09.2012
    Как сделать, чтобы при нажатие на ссылку заголовка таблицы (дата), таблица сортировалась по возрастанию и убыванию?
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Генерировать ссылки соответствующие в заголовках таблицы. Ну типа

    ...?page=2&sort_by=date&sort_order=desc
    ...?page=3&sort_by=username&sort_order=asc

    Соответственно, в PHP смотреть эти параметры и по ним составлять нужный SQL-запрос на выборку данных.
     
  3. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Так правильно будет сделано?
    Код (PHP):
    1. <?php
    2. ini_set('display_errors',1);
    3.  
    4. $sort_order='asc';
    5.  
    6. if ( isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) {
    7. $key=$_GET['sort_by'];
    8. $query = "SELECT * FROM test ORDER BY $key $sort";
    9. $result = mysql_query($query);
    10. $sort_order='desc';
    11. } else {
    12. $query = "SELECT * FROM test ORDER BY $key $sort";
    13. $result = mysql_query($query)
    14. }
    15. $test= '[url="?sort_by=data&sort_order='.$sort_order.'"]Дата[/url]';
    16. echo $test;
    17. ?>
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну, типа того. Только нужно учитывать, что всякие там хакеры могут в запросе подсунуть всякую отсебятину и она при таком подходе, как у тебя - окажется в SQL запросе. Я обычно просто определяю заранее все возможные варианты сортировки. Допустим, есть таблица с четырьмя колонками:
    Код (Text):
    1. CREATE TABLE `test` (
    2.     `id` INT NOT NULL AUTO_INCREMENT,
    3.     `added` DATETIME NULL DEFAULT NULL,
    4.     `title` VARCHAR(255) NULL DEFAULT NULL,
    5.     `content` TEXT,
    6.     PRIMARY KEY(`id`),
    7.     KEY(`added`),
    8.     KEY(`title`)
    9. ) TYPE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;
    И мы сортируем по полям id, added или title. Тогда в коде может быть так:
    Код (PHP):
    1. <?php
    2. // ...
    3. $sort_fields = array('id', 'added', 'title');
    4. $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id';
    5. $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc';
    6. $sql = "SELECT * FROM `test` ORDER BY {$sort_by} {$sort_order}";
    7. // ...
    8. ?>
     
  5. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Так ссылка не меняется. Если переменную инициализировать как $sort_order='', после нажатия, sort_order = asc.
    При повторном нажатие sort_order не меняется
     
  6. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    так надо менять
     
  7. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Смена ссылки.
    Если так подправить код, будет грамотно?
    Код (PHP):
    1. <?php
    2. // ...
    3. $sort_fields = array('id', 'added', 'title');
    4. $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id';
    5. $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc';
    6. $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) ? 'desc' : 'asc';
    7. $sql = "SELECT * FROM `test` ORDER BY {$sort_by} {$sort_order}";
    8. // ...
    9. ?>
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Порядок сортировки (ASC/DESC) для ссылок я обычно определяю уже в том месте, где ссылки вывожу. Типа как-то так:
    Код (PHP):
    1. <th>[url="?sort_by=id&sort_order=<?= ($sort_by === 'id' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]ID[/url]</th>
    2. <th>[url="?sort_by=added&sort_order=<?= ($sort_by === 'added' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]Дата[/url]</th>
    3. <th>[url="?sort_by=title&sort_order=<?= ($sort_by === 'title' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]Заголовок[/url]</th>
     
  9. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Сортировка таблицы, частично получилась.
    Вот код
    Код (PHP):
    1. $wdate='';
    2. $query = "SELECT * FROM $table";
    3.  
    4. if (isset($_POST['webinar_date']) && (preg_match("/^(\d{2})\.(\d{2})\.(\d{4})$/", $_POST['webinar_date']))) {
    5.     $wdate = $_POST['webinar_date'];
    6.     $query = "SELECT * from $table where webinar_date='$wdate'";
    7.     $wdate='';
    8. }
    9. /* ---------сортировка ---------- */
    10. $sort_order='';
    11.  
    12. $sort_fields = array('id', 'organization', 'reg_date');
    13. $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id';
    14. $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc';
    15. $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] === 'asc' ) ? 'desc' : 'asc';
    16. $query .= " ORDER BY {$sort_by} {$sort_order}";
    17.  
    18. /*--------- end ---------- */
    19. $res = mysql_query($query) or die(mysql_error());
    20. $num_rows = mysql_num_rows($res);
    21.  
    Над таблицей есть поле ввод даты. когда я вбиваю дату, таблица выводит события по дате. Но перестаёт работать сортировка. Точнее она работает. возвращая таблицу в исходное состояние.
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну естественно, параметр-то потерялся. Чтобы не терялся - и его тоже нужно дописывать к ссылке.
     
  11. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Так когда вбиваю дату, она передается методом Пост, а при нажатии на сортировку страница обновляется и Пост становится пустым. По этому все сбрасывается в начальное положение.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну передавай дату методом Гет (или принимай из всего реквеста, а не только пост) и приписывай к ссылкам с сортировкой, если она выбрана.
     
  13. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Вроде получилось, но код визуально жуткий
    Код (PHP):
    1. $wdate='';
    2. $webinar_date='';
    3. $query = "SELECT * FROM $table";
    4.  
    5. if (isset($_GET['webinar_date']) && (preg_match("/^(\d{2})\.(\d{2})\.(\d{4})$/", $_GET['webinar_date']))) {
    6.     $wdate = $_GET['webinar_date'];
    7.     $query = "SELECT * from $table where webinar_date='$wdate'";
    8.     $wdate='';
    9.     $webinar_date='webinar_date='.$_GET['webinar_date'].'&';
    10. }
    11. /* ---------сортировка ---------- */
    12. $sort_order='';
    13.  
    14. $sort_fields = array('id', 'organization', 'reg_date');
    15. $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id';
    16. $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc';
    17. $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) ? 'desc' : 'asc';
    18. $query .= " ORDER BY {$sort_by} {$sort_order}";
    19.  
    20. /*--------- end ---------- */
    21. $res = mysql_query($query) or die(mysql_error());
    22. $num_rows = mysql_num_rows($res);
    23.  
    24.  
    25. $list_title = '<form id="number-date" method="get">
    26.                 <p id="number">всего зарегистрированно записей: '.$num_rows.'</p>
    27.                 <p id="client-sort">введите дату вебинара для сортировки<input name="webinar_date" type="text" size="10" value="'.$wdate.'" placeholder="дд.мм.гггг" autofocus></p>
    28.                 </form>
    29.                <form id="form-client" method="POST">
    30.                <table id="c-table">
    31.                 <tr>
    32.                    <th><input type="checkbox" name="total" value="checkbox" onClick="checkAll(this.form,\'select[]\',this.checked)"></th>
    33.                    <th>[url="?'.$webinar_date.'sort_by=id&sort_order='.$sort_order.'"]#[/url]</th>
    34.                    <th>регистрация</th>
    35.                    <th>[url="?'.$webinar_date.'sort_by=organization&sort_order='.$sort_order.'"]организация[/url]</th>
    36.                    <th>фамилия</th>
    37.                    <th>имя</th>
    38.                    <th>отчество</th>
    39.                    <th>должность</th>
    40.                    <th>e-mail</th>
    41.                    <th>[url="?'.$webinar_date.'sort_by=reg_date&sort_order='.$sort_order.'"]вебинар[/url]</th>
    42.                    <th>&nbsp</th>
    43.                 </tr>';
    44.  
     
  14. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    В mysql есть поле с датой, тип её date.
    Сортирую это поле
    Код (PHP):
    1. $query = "SELECT *, DATE_FORMAT(`webinar_date`, '%d.%m.%Y') as `webinar_date` FROM $table ORDER BY `webinar_date` asc";
    2.  
    Сортировка происходит по первым цифрам в дате.
    Если убрать DATE_FORMAT(`webinar_date`, '%d.%m.%Y') as `webinar_date` , тогда дата правильно сортируется.
    Как сделать корректную сортировку в формате %d.%m.%Y ?
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (PHP):
    1. $query = "SELECT *, DATE_FORMAT(`webinar_date`, '%d.%m.%Y') as `webinar_date_formatted` FROM $table ORDER BY `webinar_date` asc"; 
    Соответственно, и в скриптах везде заменить всякие там echo $row['webinar_date']; на echo $row['webinar_date_formatted'];
     
  16. patrik

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

    С нами с:
    21 июн 2012
    Сообщения:
    27
    Симпатии:
    0
    Спасибо, заработало!