Всем привет, нужно мне было вывести комментарии с сортировкой и в один прекрасный день я заметил, что както не так сортируется. Тест выявил косяк и вот начал разбираться. Причина вот в чём: Код (Text): // Этот запрос отработает не коректно и выведет 2, 1, 3. $r = mysql_query("SELECT DATE_FORMAT(`date`, '%d.%m.%Y %H:%i:%s') AS `date`, `text` FROM `comments` ORDER BY `date` ASC") or die(mysql_error()); // А вот тут будет всё правильно и выведет 3, 2, 1. $r = mysql_query("SELECT `date`, `text` FROM `comments` ORDER BY `date` ASC") or die(mysql_error()); В чём причина? Для изучения накидал пример... Код (Text): <?php # Выставляем кодировку header("Content-type: text/html; charset=utf-8"); #Выставляем максимальный уровень ошибок error_reporting(E_ALL); ?> <html><body> <a href="<?php echo 'http://'.$_SERVER['HTTP_HOST']?>">[ОГЛАВЛЕНИЕ]</a><br /><br /> <?php # Тестовый скрипт echo "<b>Вывод из БД<br /><br />"; // Параметры подключения $user = "root"; $pass = ""; $db = "test"; // Подключаемся к БД mysql_connect("localhost", $user, $pass) or die("Could not connect: ".mysql_error()); // Создаём БД @mysql_query("CREATE DATABASE {$db}"); // Выбираем БД mysql_select_db($db) or die("Could not select database: ".mysql_error()); // Создадим таблицу mysql_query("CREATE TABLE IF NOT EXISTS `comments` ( `id` int(5) NOT NULL AUTO_INCREMENT, `cover_id` int(5) NOT NULL DEFAULT '0', `parent_id` int(5) NOT NULL DEFAULT '0', `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `user_id` int(5) NOT NULL DEFAULT '0', `author` varchar(50) NOT NULL DEFAULT '', `text` text NOT NULL, PRIMARY KEY (`id`), KEY `cover_id` (`cover_id`), KEY `parent_id` (`parent_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=54;" ) or die(mysql_error()); // Дамп /* mysql_query("INSERT INTO `comments` (`id`, `cover_id`, `parent_id`, `date`, `user_id`, `author`, `text`) VALUES (52, 29, 0, '2013-07-01 19:08:53', 7, 'admin', '2'), (51, 29, 0, '2013-06-30 20:20:04', 7, 'admin', '3'), (53, 29, 0, '2013-07-01 22:35:24', 7, 'admin', '1');" ) or die(mysql_error()); */ // Этот запрос отработает не коректно и выведет 3, 1, 2. $r = mysql_query("SELECT DATE_FORMAT(`date`, '%d.%m.%Y %H:%i:%s') AS `date`, `text` FROM `comments` ORDER BY `date` DESC") or die(mysql_error()); // А вот тут будет всё правильно и выведет 3, 2, 1. //$r = mysql_query("SELECT `date`, `text` FROM `comments` ORDER BY `date` ASC") or die(mysql_error()); for ($data = array(); $row = mysql_fetch_assoc($r); $data[] = $row); echo "<pre>"; print_r($data); echo "</pre>"; # Конец программы ?> </body></html>
Задайте другое название для псевдонима поля date и все будет работать нормально: Код (PHP): $r = mysql_query("SELECT DATE_FORMAT(`date`, '%d.%m.%Y %H:%i:%s') AS `format_date`, `text` FROM `comments` ORDER BY `date` DESC") or die(mysql_error());
Зачем нагружать базу еще всякими вычислениями... На мой взгляд правильней задать формат дате через PHP.
А есть значимая разница в скорости? Честно говоря погуглил и ничего не нашёл. Но мне кажется, что мускул отработает быстрее.
Тогда скрипт должен будет знать о поле "date". Если вы прописали в скрипте нечто =$res["date"]; то скрипт стал частью БД и mySQL. То есть задача так или иначе решается однозначно. Добавлено спустя 18 минут 51 секунду: При чем тут скорость. Отношения выносятся выше переменных - в логику интерфейса. Получив рекордсет вы должны его раскидать по хтмлю. Если вы делаете как выше описано - повторяете буквально сведения из БД в скрипте - то получится как выше описано. Если все берется из резалта - все сведения в нем должны быть готовы к применению. Типичный пример - вывести данные работника (товара, услуги и тп) на страницу. Выводим в цикле создавая одноименные элементы по каждому полю беря сведения для оформления элементов из свойства поля. В mysql есть fetch_field или типа того, но возвращается не все. В частности каммент взять нельзя. Следовательно сперва придется потребовать от information_schema все что нужно по каждому полю и пользуясь тривиальной логикой сопоставить сведения о полях тем или иным тэгам хтмл. Собственно так и сделан phpmyadmin. У меня есть ощущение что такие страницы как phpmyadmin народ воспринимает как какой-нибудь экзешник, типа приложение. Приложение, конечно, но веб. Следовательно надо просто посмотреть как оно устроено изнутри и сделать так же, в смысле логики,