|
|
|
| Доброе утро всем.
Ситуация следующая: использую на своем сайте скрипт "новостной ленты", посмотреть его можно здесь http://softtime.ru/info/news.php
Все устраивало до недавнего времени. Но сейчас мне необходимо улучшить его. В этом скрипте есть возможность выводить n-ое количество последних новостей.
А мне нужно сделать еще один скрипт, который бы случайно выбирал n-ое количество новостей из всей новостной базы(не из последних, а именно из всей базы), проверял не совпадает ли новость с последними новостями, и выводил их, а если совпадают, то делал перевыборку.
Надеюсь, что объяснил понятно.
Теперь собственно проблемные моменты. Для начала приведу скрипт, который выводит последние новости:
<?php
// Выставляем уровень обработки ошибок
Error_Reporting(E_ALL & ~E_NOTICE);
// Этот файл выводит первые $pnumber новостей
// Устанавлинваем соединение с базой данных
require_once("../admin/obzor_news/config.php");
?>
<?php
// Выясняем общее количество новостей в базе данных, для того чтобы
// правильно отображать ссылки на последующие новости.
$tot = mysql_query("SELECT count(*) FROM obzor_news WHERE hide='show' AND putdate <= NOW()");
// Запрашиваем все видимые новости, т.е. те, у которых в базе данных hide='show',
// если это поле будет равно 'hide', новость не будет отображаться на странице
$query = "SELECT * FROM obzor_news
WHERE hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $pnumber";
$new = mysql_query($query);
if(!$new) puterror("Ошибка при обращении к блоку новостей");
if(mysql_num_rows($new) > 0)
{
while($news = mysql_fetch_array($new))
{
// Выводим заголовок новости
echo "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td><img align=right class=img src=".$news['url_pict']."></td><td style=\"border-style: solid; border-width: 0px\"><font size=2 color=#000000> <p class=newsblockzag><b>".$news['name']."</b></p>";
// Формируем анонс
// Переменная $numchar содержит примерное
// количество символов в анонсе
$pos = strpos(substr($news['body'],$numchar), " ");
// Если новость длинная, то выводим троеточие...
if(strlen($news['body'])>$numchar) $srttmpend = "...";
else $strtmpend = "";
// Выводим анонс
echo "<p class=newsblock>".substr($news['body'], 0, $numchar+$pos).$srttmpend;
echo "<br><font size=2><a class=anewsblock href=../obzor_news/news.php?id_news=".$news['id_news'].">подробнее</a></font></p></font><br></td></tr></table>";
}
}
|
Так вот, прошу объяснить, что означают следующие строки( то что выделено жирным не понятно):
$tot = mysql_query("SELECT count(*) FROM obzor_news WHERE hide='show' AND putdate <= NOW()");
ORDER BY putdate DESC
И собственно, я не совсем пойму, где в вышеприведенно скрипте происходит сама проверка того, что публикуемые новости последние.
Заранее спасибо за ответы.
Прошу понять правильно, задаю столько вопросов чтобы разобраться и попробовать самому понять, как дописать недостающий мне скрипт(не без Вашей помощи, конечно :) ) | |
|
|
|
|
|
|
|
для: Dizels
(12.06.2007 в 12:26)
| | AND putdate <= NOW() - это означает что из базы вытащятся новости, которые опубликованы до настоящего времени, оператор NOW() возвращает текущую дату.
ORDER BY putdate DESC - значит что выведенные данные будут отсортированы по столбцу putdate и выведены в порядке от наибольшего к меньшему. | |
|
|
|
|
|
|
|
для: Dizels
(12.06.2007 в 12:26)
| | putdate <= NOW() -условие того, что новость уже стала актуальной (то есть её дата не находится в будущем - видимо для того, чтобы можно было вбивать анонсы еще до события.)
ORDER BY putdate DESC означает "выводить в порядке от новых к старым"
LIMIT $pnumber означает "ограничить вывод $pnumber записями"
Вместе означает вывети $pnumber последних из уже наступивших.
>А мне нужно сделать еще один скрипт, который бы случайно выбирал n-ое количество новостей из всей новостной базы(не из последних, а именно из всей базы), проверял не совпадает ли новость с последними новостями, и выводил их, а если совпадают, то делал перевыборку.
>Надеюсь, что объяснил понятно.
Увы... нет. | |
|
|
|
|
|
|
|
для: Trianon
(12.06.2007 в 14:32)
| | За объяснения спасибо, начал немного понимать.
Теперь по поводу скрипта который хочу сделать:
1. Есть база данных, скажем, к примеру, в ней 800 записей.
2. Уже есть скрипт, который выводит на главной странице 10 последних записей.
3. Нужен скрипт, который выводил бы еще 10 записей, при этом:
а) они не должны повторяться с теми записями, которые выводятся в пункте 2.
б) записи берутся случайным образом из всех 790 оставшихся записей.
Надеюсь, что сейчас немного прояснил обстановку, подскажите, плз с чего начать. | |
|
|
|
|
|
|
|
для: Dizels
(13.06.2007 в 13:59)
| | в таком ключе - я пас.
Я еще терплю, когда говорят о последних новостях.
Но когда начинают говорить о последних записях - увы. | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 14:13)
| | >в таком ключе - я пас.
>Я еще терплю, когда говорят о последних новостях.
>Но когда начинают говорить о последних записях - увы.
LIMIT $pnumber означает "ограничить вывод $pnumber записями"
|
Это Вы написали, именно по этому я и решил использовать слово записи. Извините если что не так называю, главное на мой взгляд, чтобы смысл был понятен. | |
|
|
|
|
|
|
|
для: Dizels
(13.06.2007 в 21:13)
| |
$pnumber = 10;
$qnumber = 20;
$sql = "SELECT * FROM obzor_news
WHERE hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $pnumber,1";
$res = mysql_query($sql) or die("Error in $sql: ". mysql_error()) ;
$limdate = mysql_num_rows($res)? mysql_result($res, 0, 'putdate') : '1001-01-01';
$sql = "SELECT * FROM obzor_news
WHERE hide='show' AND putdate <= '$limdate'
ORDER BY RAND()
LIMIT $qnumber";
$res = mysql_query($sql) or die("Error in $sql: ". mysql_error()) ;
while($row = mysql_fetch_assoc($res))
echo "\r\n<hr>".htmlspecialchars($row['body']);
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 23:00)
| | Если можно, то объясните, пожалуйста, как понимать эти строки. Просто хочется не только решить мою проблему, но и понять, как ее решили, чтобы в дальнейшем никого не доставать тупыми вопросами.
Особенно не понятны строки:
while($row = mysql_fetch_assoc($res))
echo "\r\n<hr>".htmlspecialchars($row['body']);
|
Что означает mysql_fetch_assoc($res)) ?
И к примеру, если мне нужно вывести еще заголовок новости(а не только ее тело), то как это надо сделать?
Понимаю, что вывод этот осуществляется в самой последней строке кода ( echo "\r\n<hr>".htmlspecialchars($row['body']); ), но вот как его подправить под себя не пойму, так как не до конца разобрался с работой скрипта.
P.S. огромное спасибо, за ответы и проявленное терпение:) | |
|
|
|
|
|
|
|
для: Dizels
(14.06.2007 в 15:05)
| | >Что означает
$row = mysql_fetch_assoc($res)) ?
получить очередную запись результата запроса в виде массива имя_поля=>значение
имя ляжет в $row['name']
тело - в $row['body']
и так далее...
чтобы обычный текст (не html-код) выводить на html-страницу текст, его нужно пропустить через функцию htmlspecialchars() .
От себя я добавил только тег горизонтальной линии <hr> да разделитель строк.
Как Вы будете выводить результат - дело в сущности Ваше... как-то же выводили до этого.
К подсчету последних реплик вопрос отношенния не имеет никакого.
Никто тут вопросы тупыми не считает.
Задавайте. Лучше отдельной темой. Так чтоб мухи отдельно - котлеты в глотку. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 15:19)
| | Ок, вроде понял.
Теперь что касается вывода новости: я планирую выводить
1. заголовок новости $row['name'], его делать ссылкой на саму новость.
2. выводить тело новости (150 символов), если в новости большее количество символов, то ставить троеточие.
Теперь как я это пытаюсь реализовать в коде:
1.
<a href=../obzor_news/news.php?id_news=".$row['id_news'].">$row['name']</a>
|
2.
В начале файла задаю переменную $numchar=150
$pos = strpos(substr($row['body'],$numchar), " ");
// Если новость длинная, то выводим троеточие...
if(strlen($row['body'])>$numchar) $srttmpend = "...";
else $strtmpend = "";
|
Так вот, вывести заголовок новости получилось(притом, как это сделать дошло до меня именно сейчас - уже прогресс на лицо :)) ), а вот тело новости никак не выходит, видимо и эту часть кода я не совсем понимаю, объясните, пожалуйста. | |
|
|
|