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

Форум 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]; 
  } 
?>

   
Rambler's Top100
вверх

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