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

Форум MySQL

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

 

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

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

тема: Ещё одна сортировка
 
 автор: BAHO   (06.12.2004 в 16:36)   письмо автору
 
 

У меня есть таблица ks_news. Там есть поле date в формате ГГГГ-ММ-ЧЧ. Я хочу создать архив новостей, а ссылки на него такие :
год: январь, февраль, май, июнь, июля, ..., декабрь
год: ... и т.д.
Как мне создать запрос к mysql, чтобы он вначале выводил годы (те ГГГГ-**-**), а потом месяцы (ГГГГ-ММ-**). Ломал я голову долго, чуть не сломал, а надумать не надумал, к сожалению, может вы мне поможете?

   
 
 автор: cheops   (06.12.2004 в 16:48)   письмо автору
 
   для: BAHO   (06.12.2004 в 16:36)
 

Хм... всё-равно не очень понятно... нужен бы конкретный пример. Ведь если отсортировать по дате в прямом или обратном порядке - вроде так и получается: сначала года, потом месяцы?

   
 
 автор: cheops   (06.12.2004 в 16:53)   письмо автору
 
   для: BAHO   (06.12.2004 в 16:36)
 

Или нужно выяснить какие года есть в базе, а для каждого года какие имеются месяцы с новостями?

   
 
 автор: BAHO   (06.12.2004 в 18:17)   письмо автору
 
   для: cheops   (06.12.2004 в 16:53)
 

Зайдите на http://www.koriphey.ru/news1.php. Там в самом низу так сделано. Вот так я и хочу.
Что касется новостей, то они появляются регулярно, т.е. в каждый месяц есть несколько новостей, кликаешь на ссылку, а там переменная месяца и года, и тебе отображает все новости из базы за ентот месяц-год.

   
 
 автор: cheops   (06.12.2004 в 19:11)   письмо автору
 
   для: BAHO   (06.12.2004 в 18:17)
 

А здесь в общем база данных нужна только для того, чтобы выяснить дату первой и последней новости - остальное проще сдалеть средствами PHP:
<?php
  include "config.php";
  // Выясним для начала самую первую и самую последнюю
  // дату новости в базе данных
  $query = "SELECT MIN(time) AS min, MAX(time) AS max FROM themes";
  $mm = mysql_query($query);
  if(!$mm) exit(mysql_erorr());
  $minmax = mysql_fetch_array($mm);
  // Первая дата - переводим в секунды с 1 января 1970 года
  $mintime = strtotime($minmax['min']); 
  // Последняя дата - переводим в секунды с 1 января 1970 года
  $maxtime = strtotime($minmax['max']); 
  // Цикл по годам
  for($i = date("Y",$mintime); $i<=date("Y",$maxtime); ++$i)
  {
    // Печатаем год
    echo "$i :";
    // Выводим месяцы
    $begin = 1;
    $end   = 12;
    // Если это первый год, то месяцы
    // отсчитываем не сначала года
    if($i == date("Y",$mintime)) $begin = date("n", $mintime);
    // Если это последний год, то месяцы
    // отсчитываем не до конца
    if($i == date("Y",$maxtime)) $end = date("n", $maxtime);
    // В цикле выводим ссылки
    for($k = $begin; $k<=$end; ++$k) echo "<a href=index.php?year=$i&month=$k>".convert_month($k)."</a>  ";
    echo "<br>";
  }
  // Возвращаем месяц по номеру
  function convert_month($m)
  {
    $month = array(1=>"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"); 
    return $month[$m];
  }
?>

   
 
 автор: BAHO   (06.12.2004 в 19:25)   письмо автору
 
   для: cheops   (06.12.2004 в 19:11)
 

А как же мне теперь заставить отображать новости за данный месяц?

   
 
 автор: BAHO   (07.12.2004 в 09:40)   письмо автору
 
   для: cheops   (06.12.2004 в 19:11)
 

Помогите, плиз!

   
 
 автор: cheops   (07.12.2004 в 11:51)   письмо автору
 
   для: BAHO   (07.12.2004 в 09:40)
 

Что-то пропустил ваше сообщение вчера... наверное "отметить всё" нажал одновременно с тем, как вы запостили сообщение.
Переход по ссылкам у нас приводит к старнице index.php, которой передаётся два параметра - year (год) и month (месяц)
index.php?year=$i&month=$k

Тогда для того, чтобы вывести новости можно воспользоваться следующим SQL-запросом
<?php
  include "config.php"; 
  // Извлекаем значения параметров, если они 
  // пусты - выставляем текущий год и текущий
  // месяц
  if(empty($_GET['year'])) $year = date("Y");
  else $year = $_GET['year'];
  if(empty($_GET['month'])) $month = date("n");
  else $month = $_GET['month'];
  // Извлекаем из базы данных за текущий месяц
  $query = "SELECT * FROM themes 
            WHERE YEAR(time)=$year AND
                  MONTH(time)=$month";
  $nw = mysql_query($query);
  if(!$nw) exit(mysql_erorr());
  while($news = mysql_fetch_array($nw))
  {
    echo $news['name']."<br>";
  }
?>

   
 
 автор: BAHO   (07.12.2004 в 14:59)   письмо автору
 
   для: cheops   (07.12.2004 в 11:51)
 

Вот блим бяка такая получается, что ничто не отображается. themes заменил на ks_news (енто моя таблица новостей), time заменил на date (енто моя столбец с датами ГГГГ-ММ-ЧЧ), но вот ничего не отображается

   
 
 автор: cheops   (07.12.2004 в 23:48)   письмо автору
 
   для: BAHO   (07.12.2004 в 14:59)
 

Может вы пожертвуете кусочком базы даных - в смыле выложите его здесь - мне не наравится имя столбца date - может из-за этого?

   
 
 автор: BAHO   (08.12.2004 в 08:33)   письмо автору
 
   для: cheops   (07.12.2004 в 23:48)
 

CREATE TABLE 'ks_news' (
  'id' int(11) NOT NULL auto_increment,
  'date' date default '0000-00-00',
  'title' varchar(100) NOT NULL default '',
  'news' text,
  'goarch' varchar(20) NOT NULL default '',
  'arch_news' text,
  PRIMARY KEY  ('id')
);
INSERT INTO 'ks_news' VALUES (1, '2004-04-10', 'Название новости', 'Новость', 'qwerty', Новость в архиве');

   
 
 автор: cheops   (08.12.2004 в 14:46)   письмо автору
 
   для: BAHO   (08.12.2004 в 08:33)
 

Попробуйте заменить имя столбца date на какое-нибудь другое - скорее всего из-за этого не работает.

   
 
 автор: BAHO   (08.12.2004 в 16:01)   письмо автору
 
   для: cheops   (08.12.2004 в 14:46)
 

я не знаю, в чём была фишка и почему из-за имени столбца ничего не работало, но всё заработало!
ОГРОМНОЕ ВАС СПАСИБО!

   
 
 автор: cheops   (08.12.2004 в 16:13)   письмо автору
 
   для: BAHO   (08.12.2004 в 16:01)
 

Лучше избегать называть столбцы названиями ключевых слов MySQL - в принципе это будет работать иногда когда анализатор отличит названия столбца от типа или названия функции, но часть клиентов (вроде phpMyAdmin) очень любят ключевые слова переводить в верхний регистр... Короче можно приобрести много трудноотыскиваемых жучков...

   
 
 автор: BAHO   (28.12.2004 в 19:54)   письмо автору
 
   для: cheops   (08.12.2004 в 16:13)
 

Теперь такая проблема, как мне выкинуть месяцы из цикла месяцов, которых нет в базе, т.е. если у меня нет ни одной новости за июнь, то и в цикле месяцев июня не будет

   
 
 автор: cheops   (28.12.2004 в 22:57)   письмо автору
 
   для: BAHO   (28.12.2004 в 19:54)
 

Это нужно уже на базу данных завязываться, т.е. переделать весь скрипт... будем всё курочить? Или всё-таки, если нет новостей, то можно оставить вежливое сообщением, что мол так и так, но новостей в этом месяце не было... Это я к чему, вы говорили, что новостей обычно много и если это только один такой аномальный месяц, то это будет выглядеть нормально...

   
 
 автор: BAHO   (29.12.2004 в 11:13)   письмо автору
 
   для: cheops   (28.12.2004 в 22:57)
 

к сожалению, месяц не один, а бывает штуки 3-4, а что мол так и так не очень подходит. придётся всётаки воротить, вот только как? в скрипте сверху я пытался исключить переменную $k, если ей нет соответствия в базе, но всё равно не получается

   
 
 автор: BAHO   (30.12.2004 в 09:34)   письмо автору
 
   для: BAHO   (29.12.2004 в 11:13)
 

пробовал ввести в цикл месяцев запрос к базе, но что-то не получается

   
 
 автор: cheops   (30.12.2004 в 10:20)   письмо автору
 
   для: BAHO   (30.12.2004 в 09:34)
 

Я сегодня отпишусь, но наверное уже только вечером...

   
 
 автор: cheops   (30.12.2004 в 23:18)   письмо автору
 
   для: cheops   (07.12.2004 в 11:51)
 

Самым быстрым, но не самым элегантным и производительным способом решить проблему пропущенных месяцев будет вставить лишние SQL-запросы-проверки на манер:
<?php 
  include "config.php"; 
  // Выясним для начала самую первую и самую последнюю 
  // дату новости в базе данных 
  $query = "SELECT MIN(time) AS min, MAX(time) AS max FROM themes"; 
  $mm = mysql_query($query); 
  if(!$mm) exit(mysql_erorr()); 
  $minmax = mysql_fetch_array($mm); 
  // Первая дата - переводим в секунды с 1 января 1970 года 
  $mintime = strtotime($minmax['min']); 
  // Последняя дата - переводим в секунды с 1 января 1970 года 
  $maxtime = strtotime($minmax['max']); 
  // Цикл по годам 
  for($i = date("Y",$mintime); $i<=date("Y",$maxtime); ++$i) 
  { 
    // Печатаем год 
    echo "$i :"; 
    // Выводим месяцы 
    $begin = 1; 
    $end   = 12; 
    // Если это первый год, то месяцы 
    // отсчитываем не сначала года 
    if($i == date("Y",$mintime)) $begin = date("n", $mintime); 
    // Если это последний год, то месяцы 
    // отсчитываем не до конца 
    if($i == date("Y",$maxtime)) $end = date("n", $maxtime); 
    // В цикле выводим ссылки 
    for($k = $begin; $k<=$end; ++$k)
    {
      $query = "SELECT COUNT(*) FROM themes WHERE YEAR(time) = $i AND MONTH(time) = $k";
      $tot = mysql_query($query);
      if(!$tot) exit(mysql_error());
      if(mysql_result($tot,0)>0) echo "<a href=index.php?year=$i&month=$k>".convert_month($k)."</a>  "; 
    }
    echo "<br>"; 
  } 
  // Возвращаем месяц по номеру 
  function convert_month($m) 
  { 
    $month = array(1=>"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"); 
    return $month[$m]; 
  } 
?>