Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Постраничная Навигация по месяцам и годам. SQL и PHP
 
 автор: Александр1984   (29.09.2008 в 21:09)   письмо автору
 
 

Доброго времени суток, подскажите пожалуйста как сформировать запрос к базе данных sql либо сделать с помощью срипта php. Чтобы записи (то бишь новости) с переменной date выводились по месяцам и годам на русском.
Что-то вроде этого:
2006 2007 2008
Январь Февраль Март Апрель Май и т.д.

И чтобы появлялся месяц, в котором есть новости с заданной датой, если нет новостей с такой датой ну и месяц чтобы не появлялся в навигационной строке. Заранее спасибо.

  Ответить  
 
 автор: cheops   (02.10.2008 в 12:08)   письмо автору
 
   для: Александр1984   (29.09.2008 в 21:09)
 

Дата в базе данных в каком формате хранится?

  Ответить  
 
 автор: nek-v   (02.10.2008 в 17:16)   письмо автору
 
   для: cheops   (02.10.2008 в 12:08)
 

допустим дата храница в поле типа int сгенерированная функцией time().
просто набор цифр получается.
меня данный вопрос тоже интересует...

  Ответить  
 
 автор: Александр1984   (02.10.2008 в 18:16)   письмо автору
 
   для: nek-v   (02.10.2008 в 17:16)
 

Дата хранится в формате date и выводится из базы виде 2008-08-25

  Ответить  
 
 автор: sim5   (02.10.2008 в 18:38)   письмо автору
 
   для: Александр1984   (02.10.2008 в 18:16)
 

Это можно сделать путем создания массива содержащего русские названия месяцев, с обращением к нему по номеру месяца. Это делается после получения данных из базы, а можно софрмировать такую запись непосредственно при запросе к базе. Оба примера можете посмотреть тут: http://softtime.ru/forum/read.php?id_forum=3&id_theme=57763&page=4
PS. Можно воспользоваться функцией str_replace.

  Ответить  
 
 автор: HaJIuBauKa   (03.10.2008 в 08:21)   письмо автору
 
   для: nek-v   (02.10.2008 в 17:16)
 

Зачем дату хранить в "INT"? Для этого есть два типа "DATE" и "TIMESTAMP".

  Ответить  
 
 автор: cheops   (03.10.2008 в 12:00)   письмо автору
 
   для: HaJIuBauKa   (03.10.2008 в 08:21)
 

Индексированный INT быстрее календарных типов - при больших объемах таблицы он предпочтительнее.

  Ответить  
 
 автор: HaJIuBauKa   (03.10.2008 в 12:45)   письмо автору
 
   для: cheops   (03.10.2008 в 12:00)
 

Тогда невозможно будет использовать функицию DATE_FORMAT

  Ответить  
 
 автор: cheops   (04.10.2008 в 11:02)   письмо автору
 
   для: HaJIuBauKa   (03.10.2008 в 12:45)
 

Можно если перевести в MySQL-представление через функцию FROM_UNIXTIME().

  Ответить  
 
 автор: HaJIuBauKa   (03.10.2008 в 08:38)   письмо автору
 
   для: Александр1984   (29.09.2008 в 21:09)
 

Я правильно понял, что нужно вывести календарик с подсвеченными месяцами, если в них есть новости?
Тогда так:
Сначала считываем минимальную и максимальную дату из БД:
$sql = 'select min(c.`putdate`) as minpd, max(c.`putdate`) as maxpd from `news` as c';
    $resultMINMAX = mysql_query($sql); 
       $rowMINMAX = mysql_fetch_object($resultMINMAX);

потом на конкретный год, который либо считывается из GET/POST переменной, либо берется текущий считываем все новости:
if (isset($_REQUEST['y'])) $year=$_REQUEST['y']; else $year = strftime("%Y", strtotime($rowMINMAX->maxpd));
    $bdate = $year.'-01-01';
    $edate = $year.'-12-31';
    $sql = 'select c.`id`, c.`title`, c.`putdate`, c.`annot`'
           . ' from `news` as c'
           . ' where (c.`putdate` >= "'.$bdate.'")'
           . ' and'
           . ' (c.`putdate` <= "'.$edate.'")'
           . ' order by c.`putdate` desc'
           . ' limit 0, 100';

по аналогии вместо
$bdate = $year.'-01-01';
ставьте к примеру
$bdate = $year.'-'.$month.'-01';
и в циклу по запросу в базу, если не путой результат вывод месяца... и тд
как вывести русские названия месяцев вам уже подсказали.

  Ответить  
 
 автор: HaJIuBauKa   (03.10.2008 в 08:53)   письмо автору
 
   для: Александр1984   (29.09.2008 в 21:09)
 

Немного подумал и нашел более изящное решение:
SELECT DATE_FORMAT(c.`putdate`,'%m') as df FROM `news` as c WHERE (DATE_FORMAT(c.`putdate`,'%Y') = 2008)
group by df

данный запрос выводит список тех месяцев на 2008 год, которые присутствуют в таблице news, что вам и нужно, дальше дело техники :)
Для вывода названий месяцев нужно %m заменить на %M, правда названия будут английские.

  Ответить  
 
 автор: mihdan   (03.10.2008 в 17:36)   письмо автору
 
   для: HaJIuBauKa   (03.10.2008 в 08:53)
 

WHERE (DATE_FORMAT(c.`putdate`,'%Y') = 2008) 


WHERE YEAR(`putdate`) = 2008 

  Ответить  
 
 автор: BinLaden   (03.10.2008 в 17:44)   письмо автору
 
   для: mihdan   (03.10.2008 в 17:36)
 

Тогда бы уж и с месяцем разобрались.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования