|
|
|
| У меня есть таблица ks_news. Там есть поле date в формате ГГГГ-ММ-ЧЧ. Я хочу создать архив новостей, а ссылки на него такие :
год: январь, февраль, май, июнь, июля, ..., декабрь
год: ... и т.д.
Как мне создать запрос к mysql, чтобы он вначале выводил годы (те ГГГГ-**-**), а потом месяцы (ГГГГ-ММ-**). Ломал я голову долго, чуть не сломал, а надумать не надумал, к сожалению, может вы мне поможете? | |
|
|
|
|
|
|
|
для: BAHO
(06.12.2004 в 16:36)
| | Хм... всё-равно не очень понятно... нужен бы конкретный пример. Ведь если отсортировать по дате в прямом или обратном порядке - вроде так и получается: сначала года, потом месяцы? | |
|
|
|
|
|
|
|
для: BAHO
(06.12.2004 в 16:36)
| | Или нужно выяснить какие года есть в базе, а для каждого года какие имеются месяцы с новостями? | |
|
|
|
|
|
|
|
для: cheops
(06.12.2004 в 16:53)
| | Зайдите на http://www.koriphey.ru/news1.php. Там в самом низу так сделано. Вот так я и хочу.
Что касется новостей, то они появляются регулярно, т.е. в каждый месяц есть несколько новостей, кликаешь на ссылку, а там переменная месяца и года, и тебе отображает все новости из базы за ентот месяц-год. | |
|
|
|
|
|
|
|
для: 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];
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(06.12.2004 в 19:11)
| | А как же мне теперь заставить отображать новости за данный месяц? | |
|
|
|
|
|
|
|
для: cheops
(06.12.2004 в 19:11)
| | Помогите, плиз! | |
|
|
|
|
|
|
|
для: 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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.12.2004 в 11:51)
| | Вот блим бяка такая получается, что ничто не отображается. themes заменил на ks_news (енто моя таблица новостей), time заменил на date (енто моя столбец с датами ГГГГ-ММ-ЧЧ), но вот ничего не отображается | |
|
|
|
|
|
|
|
для: BAHO
(07.12.2004 в 14:59)
| | Может вы пожертвуете кусочком базы даных - в смыле выложите его здесь - мне не наравится имя столбца date - может из-за этого? | |
|
|
|
|
|
|
|
для: 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', Новость в архиве');
|
| |
|
|
|
|
|
|
|
для: BAHO
(08.12.2004 в 08:33)
| | Попробуйте заменить имя столбца date на какое-нибудь другое - скорее всего из-за этого не работает. | |
|
|
|
|
|
|
|
для: cheops
(08.12.2004 в 14:46)
| | я не знаю, в чём была фишка и почему из-за имени столбца ничего не работало, но всё заработало!
ОГРОМНОЕ ВАС СПАСИБО! | |
|
|
|
|
|
|
|
для: BAHO
(08.12.2004 в 16:01)
| | Лучше избегать называть столбцы названиями ключевых слов MySQL - в принципе это будет работать иногда когда анализатор отличит названия столбца от типа или названия функции, но часть клиентов (вроде phpMyAdmin) очень любят ключевые слова переводить в верхний регистр... Короче можно приобрести много трудноотыскиваемых жучков... | |
|
|
|
|
|
|
|
для: cheops
(08.12.2004 в 16:13)
| | Теперь такая проблема, как мне выкинуть месяцы из цикла месяцов, которых нет в базе, т.е. если у меня нет ни одной новости за июнь, то и в цикле месяцев июня не будет | |
|
|
|
|
|
|
|
для: BAHO
(28.12.2004 в 19:54)
| | Это нужно уже на базу данных завязываться, т.е. переделать весь скрипт... будем всё курочить? Или всё-таки, если нет новостей, то можно оставить вежливое сообщением, что мол так и так, но новостей в этом месяце не было... Это я к чему, вы говорили, что новостей обычно много и если это только один такой аномальный месяц, то это будет выглядеть нормально... | |
|
|
|
|
|
|
|
для: cheops
(28.12.2004 в 22:57)
| | к сожалению, месяц не один, а бывает штуки 3-4, а что мол так и так не очень подходит. придётся всётаки воротить, вот только как? в скрипте сверху я пытался исключить переменную $k, если ей нет соответствия в базе, но всё равно не получается | |
|
|
|
|
|
|
|
для: BAHO
(29.12.2004 в 11:13)
| | пробовал ввести в цикл месяцев запрос к базе, но что-то не получается | |
|
|
|
|
|
|
|
для: BAHO
(30.12.2004 в 09:34)
| | Я сегодня отпишусь, но наверное уже только вечером... | |
|
|
|
|
|
|
|
для: 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];
}
?>
|
| |
|
|
|