Есть таблица в mysql. Дата: 12.04.2012 15.07.2012 20.09.2012 Как сделать, чтобы при нажатие на ссылку заголовка таблицы (дата), таблица сортировалась по возрастанию и убыванию?
Генерировать ссылки соответствующие в заголовках таблицы. Ну типа ...?page=2&sort_by=date&sort_order=desc ...?page=3&sort_by=username&sort_order=asc Соответственно, в PHP смотреть эти параметры и по ним составлять нужный SQL-запрос на выборку данных.
Так правильно будет сделано? Код (PHP): <?php ini_set('display_errors',1); error_reporting(E_ALL); $sort_order='asc'; if ( isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) { $key=$_GET['sort_by']; $query = "SELECT * FROM test ORDER BY $key $sort"; $result = mysql_query($query); $sort_order='desc'; } else { $query = "SELECT * FROM test ORDER BY $key $sort"; $result = mysql_query($query) } $test= '[url="?sort_by=data&sort_order='.$sort_order.'"]Дата[/url]'; echo $test; ?>
Ну, типа того. Только нужно учитывать, что всякие там хакеры могут в запросе подсунуть всякую отсебятину и она при таком подходе, как у тебя - окажется в SQL запросе. Я обычно просто определяю заранее все возможные варианты сортировки. Допустим, есть таблица с четырьмя колонками: Код (Text): CREATE TABLE `test` ( `id` INT NOT NULL AUTO_INCREMENT, `added` DATETIME NULL DEFAULT NULL, `title` VARCHAR(255) NULL DEFAULT NULL, `content` TEXT, PRIMARY KEY(`id`), KEY(`added`), KEY(`title`) ) TYPE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci; И мы сортируем по полям id, added или title. Тогда в коде может быть так: Код (PHP): <?php // ... $sort_fields = array('id', 'added', 'title'); $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id'; $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc'; $sql = "SELECT * FROM `test` ORDER BY {$sort_by} {$sort_order}"; // ... ?>
Так ссылка не меняется. Если переменную инициализировать как $sort_order='', после нажатия, sort_order = asc. При повторном нажатие sort_order не меняется
Смена ссылки. Если так подправить код, будет грамотно? Код (PHP): <?php // ... $sort_fields = array('id', 'added', 'title'); $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id'; $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc'; $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) ? 'desc' : 'asc'; $sql = "SELECT * FROM `test` ORDER BY {$sort_by} {$sort_order}"; // ... ?>
Порядок сортировки (ASC/DESC) для ссылок я обычно определяю уже в том месте, где ссылки вывожу. Типа как-то так: Код (PHP): <th>[url="?sort_by=id&sort_order=<?= ($sort_by === 'id' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]ID[/url]</th> <th>[url="?sort_by=added&sort_order=<?= ($sort_by === 'added' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]Дата[/url]</th> <th>[url="?sort_by=title&sort_order=<?= ($sort_by === 'title' and $sort_order === 'asc') ? 'desc' : 'asc'; ?>"]Заголовок[/url]</th>
Сортировка таблицы, частично получилась. Вот код Код (PHP): $wdate=''; $query = "SELECT * FROM $table"; if (isset($_POST['webinar_date']) && (preg_match("/^(\d{2})\.(\d{2})\.(\d{4})$/", $_POST['webinar_date']))) { $wdate = $_POST['webinar_date']; $query = "SELECT * from $table where webinar_date='$wdate'"; $wdate=''; } /* ---------сортировка ---------- */ $sort_order=''; $sort_fields = array('id', 'organization', 'reg_date'); $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id'; $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc'; $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] === 'asc' ) ? 'desc' : 'asc'; $query .= " ORDER BY {$sort_by} {$sort_order}"; /*--------- end ---------- */ $res = mysql_query($query) or die(mysql_error()); $num_rows = mysql_num_rows($res); Над таблицей есть поле ввод даты. когда я вбиваю дату, таблица выводит события по дате. Но перестаёт работать сортировка. Точнее она работает. возвращая таблицу в исходное состояние.
Так когда вбиваю дату, она передается методом Пост, а при нажатии на сортировку страница обновляется и Пост становится пустым. По этому все сбрасывается в начальное положение.
Ну передавай дату методом Гет (или принимай из всего реквеста, а не только пост) и приписывай к ссылкам с сортировкой, если она выбрана.
Вроде получилось, но код визуально жуткий Код (PHP): $wdate=''; $webinar_date=''; $query = "SELECT * FROM $table"; if (isset($_GET['webinar_date']) && (preg_match("/^(\d{2})\.(\d{2})\.(\d{4})$/", $_GET['webinar_date']))) { $wdate = $_GET['webinar_date']; $query = "SELECT * from $table where webinar_date='$wdate'"; $wdate=''; $webinar_date='webinar_date='.$_GET['webinar_date'].'&'; } /* ---------сортировка ---------- */ $sort_order=''; $sort_fields = array('id', 'organization', 'reg_date'); $sort_by = (isset($_GET['sort_by']) and in_array($_GET['sort_by'], $sort_fields)) ? $_GET['sort_by'] : 'id'; $sort_order = (isset($_GET['sort_order']) and in_array($_GET['sort_order'], array('desc', 'asc'))) ? $_GET['sort_order'] : 'asc'; $sort_order= (isset($_GET['sort_by']) and $_GET['sort_order'] == 'asc' ) ? 'desc' : 'asc'; $query .= " ORDER BY {$sort_by} {$sort_order}"; /*--------- end ---------- */ $res = mysql_query($query) or die(mysql_error()); $num_rows = mysql_num_rows($res); $list_title = '<form id="number-date" method="get"> <p id="number">всего зарегистрированно записей: '.$num_rows.'</p> <p id="client-sort">введите дату вебинара для сортировки<input name="webinar_date" type="text" size="10" value="'.$wdate.'" placeholder="дд.мм.гггг" autofocus></p> </form> <form id="form-client" method="POST"> <table id="c-table"> <tr> <th><input type="checkbox" name="total" value="checkbox" onClick="checkAll(this.form,\'select[]\',this.checked)"></th> <th>[url="?'.$webinar_date.'sort_by=id&sort_order='.$sort_order.'"]#[/url]</th> <th>регистрация</th> <th>[url="?'.$webinar_date.'sort_by=organization&sort_order='.$sort_order.'"]организация[/url]</th> <th>фамилия</th> <th>имя</th> <th>отчество</th> <th>должность</th> <th>e-mail</th> <th>[url="?'.$webinar_date.'sort_by=reg_date&sort_order='.$sort_order.'"]вебинар[/url]</th> <th> </th> </tr>';
В mysql есть поле с датой, тип её date. Сортирую это поле Код (PHP): $query = "SELECT *, DATE_FORMAT(`webinar_date`, '%d.%m.%Y') as `webinar_date` FROM $table ORDER BY `webinar_date` asc"; Сортировка происходит по первым цифрам в дате. Если убрать DATE_FORMAT(`webinar_date`, '%d.%m.%Y') as `webinar_date` , тогда дата правильно сортируется. Как сделать корректную сортировку в формате %d.%m.%Y ?
Код (PHP): $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'];