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

Форум MySQL

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

 

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

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

тема: Скрипт выбора и показа случайных новостей
 
 автор: Dizels   (12.06.2007 в 12:26)   письмо автору
 
 

Доброе утро всем.

Ситуация следующая: использую на своем сайте скрипт "новостной ленты", посмотреть его можно здесь 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(!
$newputerror("Ошибка при обращении к блоку новостей");
  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

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

Заранее спасибо за ответы.
Прошу понять правильно, задаю столько вопросов чтобы разобраться и попробовать самому понять, как дописать недостающий мне скрипт(не без Вашей помощи, конечно :) )

   
 
 автор: foboss26   (12.06.2007 в 12:39)   письмо автору
 
   для: Dizels   (12.06.2007 в 12:26)
 

AND putdate <= NOW() - это означает что из базы вытащятся новости, которые опубликованы до настоящего времени, оператор NOW() возвращает текущую дату.
ORDER BY putdate DESC - значит что выведенные данные будут отсортированы по столбцу putdate и выведены в порядке от наибольшего к меньшему.

   
 
 автор: Trianon   (12.06.2007 в 14:32)   письмо автору
 
   для: Dizels   (12.06.2007 в 12:26)
 

putdate <= NOW() -условие того, что новость уже стала актуальной (то есть её дата не находится в будущем - видимо для того, чтобы можно было вбивать анонсы еще до события.)

ORDER BY putdate DESC означает "выводить в порядке от новых к старым"
LIMIT $pnumber означает "ограничить вывод $pnumber записями"
Вместе означает вывети $pnumber последних из уже наступивших.


>А мне нужно сделать еще один скрипт, который бы случайно выбирал n-ое количество новостей из всей новостной базы(не из последних, а именно из всей базы), проверял не совпадает ли новость с последними новостями, и выводил их, а если совпадают, то делал перевыборку.

>Надеюсь, что объяснил понятно.
Увы... нет.

   
 
 автор: Dizels   (13.06.2007 в 13:59)   письмо автору
 
   для: Trianon   (12.06.2007 в 14:32)
 

За объяснения спасибо, начал немного понимать.

Теперь по поводу скрипта который хочу сделать:

1. Есть база данных, скажем, к примеру, в ней 800 записей.
2. Уже есть скрипт, который выводит на главной странице 10 последних записей.
3. Нужен скрипт, который выводил бы еще 10 записей, при этом:
а) они не должны повторяться с теми записями, которые выводятся в пункте 2.
б) записи берутся случайным образом из всех 790 оставшихся записей.

Надеюсь, что сейчас немного прояснил обстановку, подскажите, плз с чего начать.

   
 
 автор: Trianon   (13.06.2007 в 14:13)   письмо автору
 
   для: Dizels   (13.06.2007 в 13:59)
 

в таком ключе - я пас.
Я еще терплю, когда говорят о последних новостях.
Но когда начинают говорить о последних записях - увы.

   
 
 автор: Dizels   (13.06.2007 в 21:13)   письмо автору
 
   для: Trianon   (13.06.2007 в 14:13)
 

>в таком ключе - я пас.
>Я еще терплю, когда говорят о последних новостях.
>Но когда начинают говорить о последних записях - увы.



LIMIT $pnumber означает "ограничить вывод $pnumber записями"


Это Вы написали, именно по этому я и решил использовать слово записи. Извините если что не так называю, главное на мой взгляд, чтобы смысл был понятен.

   
 
 автор: Trianon   (13.06.2007 в 23:00)   письмо автору
 
   для: 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']);

    

   
 
 автор: Dizels   (14.06.2007 в 15:05)   письмо автору
 
   для: 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. огромное спасибо, за ответы и проявленное терпение:)

   
 
 автор: Trianon   (14.06.2007 в 15:19)   письмо автору
 
   для: Dizels   (14.06.2007 в 15:05)
 

>Что означает
$row = mysql_fetch_assoc($res)) ?

получить очередную запись результата запроса в виде массива имя_поля=>значение
имя ляжет в $row['name']
тело - в $row['body']
и так далее...

чтобы обычный текст (не html-код) выводить на html-страницу текст, его нужно пропустить через функцию htmlspecialchars() .
От себя я добавил только тег горизонтальной линии <hr> да разделитель строк.
Как Вы будете выводить результат - дело в сущности Ваше... как-то же выводили до этого.
К подсчету последних реплик вопрос отношенния не имеет никакого.

Никто тут вопросы тупыми не считает.
Задавайте. Лучше отдельной темой. Так чтоб мухи отдельно - котлеты в глотку.

   
 
 автор: Dizels   (14.06.2007 в 15:56)   письмо автору
 
   для: 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 = "";



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

   
Rambler's Top100
вверх

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