Тема: Рандомизация через день

Есть скрипт

<? 
/* Замените нижеследующие переменные на свои */ 
$host = "localhost";    // MySQL server 
$user_db = "";        // MySQL пользователь 
$pass_db = "";            // MySQL пароль 
$dbase = "";        // MySQL база данных 
$dtable = "eu_ad";        // Таблица в базе данных 

/* Соединение с сервером базы данных */ 
mysql_connect ($host, $user_db, $pass_db); 
/* Выбор [HTML]базы данных */ 
mysql_select_db($dbase); 
/* Создание SQL запроса */ 
$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd FROM $dtable WHERE ((catid=403)OR(catid=404)) GROUP BY link_id ORDER BY rnd LIMIT 5"; 
/* Исполнение SQL запроса */ 
$result = mysql_query($sql); 
/* Проверка количества вернувшихся строчек в результате*/ 
$rows = mysql_num_rows($result); 
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/ 
if ((!$rows) || ($rows < 1)) {echo "Результатов НЕТ!!!";} 
else { 
      echo "<table width=500 class=last_pellets>"; 
      while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) { 
$images = explode( "\n", $images ); 
$images = $images[0]; 
      $v_descr=strip_tags($v_descr); 
      $v_descr=substr($v_descr,0,150); 

       echo "<tr><td>"; 
           if(empty($images)) 
             echo ""; 
             else 
            echo "<a href='page-o$id_link.html'><img src='files/$images' width=60                     class=imgConf></a>";  


  echo "</td><td><a href='page-o$id_link.html'>$v_title</a>   $v_descr ... </td><td>$v_255_12</td></tr>"; 
} 
       } 
echo "</table>"; 
?>

Его я инклудю и при каждом обновленни браузера случайный вывод данных. Хочу, чтобы этот случайниый вывод срабатывал 1 раз в день и выведенный контент не менялся. (Реализация через крон не интересует)

Сообщение добавлено Fri Aug 15 13:41:51 2008
Есть вариант сделать так, но его нужно дополнить!

<? 
//создал таблу в ней будем хранить дату последнего рандома. 
/*CREATE TABLE eu_random_delayed ( 
id smallint(5) unsigned NOT NULL auto_increment, 
ldate datetime NOT NULL, 
PRIMARY KEY (id) 
);*/ 

$sql = "SELECT ldate FROM eu_random_delayed where ldate > (now() - INTERVAL 1 DAY)"; 
$result = mysql_query($sql); 
$rows = mysql_num_rows($result); 
if ((!$rows) || ($rows < 1)) { //тут идет код с рандомом 
//и проапдейтим последнюю дату рандома 
$sql = "insert into eu_random_delayed(ldate) values(now())"; 
 mysql_query($sql); 
} 
else { 
//тут идет код без рандома  
} 
?>

Сообщение добавлено Fri Aug 15 13:42:59 2008
Как грамотно внедрить второе в первое не знаю! Прошу помочь!

2

Re: Рандомизация через день

Поправьте имя поля id_link, которое имеет также вид link_id, почему-то.

<?php
/* SQL query
CREATE TABLE IF NOT EXISTS `eu_random_delayed` (
  `id` tinyint(1) unsigned NOT NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `link_ids` tinytext,
  PRIMARY KEY  (`id`)
);

INSERT INTO `eu_random_delayed` (`id`, `time`, `link_ids`) VALUES (1, NULL, NULL);
*/ 

function EchoTable($sql) {
    $aLink_id = array();
    /* Исполнение SQL запроса */ 
    $result = mysql_query($sql['select']); 
    /* Проверка количества вернувшихся строчек в результате*/ 
    $rows = mysql_num_rows($result); 
    /* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/ 
    if ((!$rows) || ($rows < 1)) {
        echo "Результатов НЕТ!!!";
    } else { 
          echo "<table width=500 class=last_pellets>"; 
          while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) {
              $aLink_id[] = $id_link;
              $images = explode( "\n", $images ); 
              $images = $images[0]; 
              $v_descr=strip_tags($v_descr); 
              $v_descr=substr($v_descr,0,150); 

              echo "<tr><td>"; 
              if (empty($images)) 
                  echo ""; 
              else 
                  echo "<a href='page-o$id_link.html'><img src='files/$images' width=60                     class=imgConf></a>";  


              echo "</td><td><a href='page-o$id_link.html'>$v_title</a>   $v_descr ... </td><td>$v_255_12</td></tr>"; 
          } 
    } 
    echo "</table>";
    return $aLink_id; 
}

/* Замените нижеследующие переменные на свои */ 
$host = "localhost";    // MySQL server 
$user_db = "";        // MySQL пользователь 
$pass_db = "";            // MySQL пароль 
$dbase = "";        // MySQL база данных 
$dtable = "eu_ad";        // Таблица в базе данных 

/* Соединение с сервером базы данных */ 
mysql_connect ($host, $user_db, $pass_db); 
/* Выбор [HTML]базы данных */ 
mysql_select_db($dbase); 

$sql['link_ids'] = 'SELECT `link_ids`
        FROM `eu_random_delayed`
        WHERE `id` = 1
        AND `time` > (NOW() - INTERVAL 1 DAY)
        AND `link_ids` IS NOT NULL';
$result = mysql_query($sql['link_ids']); 
if (mysql_num_rows($result) > 0) {
    $link_ids = mysql_result($result, 0);
    $sql['select'] = 'SELECT `link_id`, `images`, `v_title`, `v_255_12`, `v_descr`, `catid`
            FROM ' . $dtable . '
            WHERE `link_id` IN(' . $link_ids . ')';
    EchoTable($sql); 
} else {
    $sql['select'] = 'SELECT `link_id`, `images`, `v_title`, `v_255_12`, `v_descr`, `catid`, RAND() AS `rnd`
            FROM ' . $dtable . '
            WHERE ((`catid` = 403) OR (`catid` = 404))
            GROUP BY `link_id`
            ORDER BY `rnd`
            LIMIT 5'; 
    $aLink_id = EchoTable($sql);
    if (count($aLink_id) > 0) {
        $sql['insert'] = 'UPDATE `eu_random_delayed` SET
                          `link_ids` = "' . implode(',', $aLink_id) . '"
                          WHERE `id` = 1';
        mysql_query($sql['insert']);
    }
}

?>

3

Re: Рандомизация через день

Hanut,

благодарю за ответ!

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


Главная таблица eu_add


1. Создать таблицу eu_add_random , в которой будет ифа, к ней, собственно, скрипт из инклуда будет обращаться, а не к eu_add;

(Это не проблема - знаю как сделать)


2. Скрипт, который будет пополнять таблицу eu_add_random из таблицы eu_add раз в сутки?

Сообщение добавлено Fri Aug 15 17:49:35 2008
Сообщение добавлено Fri Aug 15 17:46:38 2008
Думаю такой вариант менее систему грузить будет!


<?

/* Замените нижеследующие переменные на свои */
$host = "localhost";    // MySQL server
$user_db = "";        // MySQL пользователь
$pass_db = "";            // MySQL пароль
$dbase = "";        // MySQL база данных
$dtable = "eu_ad";        // Таблица в базе данных
$dtable_rnd = "eu_add_random";        // Таблица в базе данных




/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор базы данных */
mysql_select_db($dbase);
/* Создание SQL запроса */


$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd INTO $dtable_rnd FROM $dtable WHERE ((catid=400)OR(catid=401)) GROUP BY link_id ORDER BY rnd LIMIT 5";



?>

4

Re: Рандомизация через день

Hanut, давай держать связьь через асю, в личку свою отправиль, а мысли выкладывать на форуме!

5

Re: Рандомизация через день

randomizer сказал:

Скрипт, который будет пополнять таблицу eu_add_random из таблицы eu_add раз в сутки?

Без Cron этого не сделать. Ведь в этом случае дата последнего обновления уже нигде не хранится.

По поводу увеличенной нагрузки, мне кажется, беспокоиться не стоит. Лишний запрос на выборку из tinytext - не может значительно сказаться на скорости, учитывая, что выборка собственно данных будет осуществляться по первичным ключам, а не условию, что значительно быстрее при большом объеме данных.

6

Re: Рандомизация через день

А вот такой вариант!
А не проще ли вместо извращений с БД выводить результат запроса в файл и его просто инклудить? Преимущества на лицо - в десятки раз уменьшаем количество запросов к базе (так как надо раз обновлять файл раз в час/сутки), не надо создавать лишних, да и ненужных таблиц



 $filetime=lstat('news.txt'); // Получаем массив информации о файле 
$cur=time()-$ftime[9]; // Получаем время прошедшее с последней модификации файла 
if ($cur>2500) // Если прошло больше 2500 секунд, то делаем запрос к БД 
{ 
$f=fopen('news.txt','w');  

// Все echo заменяем на $out.=  
// Чтобы собрать в эту переменную все данные которые надо выводить 

$host = "localhost";    // MySQL server 
$user_db = "";        // MySQL пользователь 
$pass_db = "";            // MySQL пароль 
$dbase = "";        // MySQL база данных 
$dtable = "eu_ad";        // Таблица в базе данных 

mysql_connect ($host, $user_db, $pass_db); 
mysql_select_db($dbase); 
$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd FROM $dtable WHERE ((catid=403)OR(catid=404)) GROUP BY link_id ORDER BY rnd LIMIT 5"; 
$result = mysql_query($sql); 
$rows = mysql_num_rows($result); 
$out=""; 
if ((!$rows) || ($rows < 1)) {$out.="Результатов НЕТ!!!";} 
else { 
      $out.="<table width=500 class=last_pellets>"; 
      while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) { 
$images = explode( "\n", $images ); 
$images = $images[0]; 
      $v_descr=strip_tags($v_descr); 
      $v_descr=substr($v_descr,0,150); 

       $out.= "<tr><td>"; 
           if(empty($images)) 
             echo ""; 
             else 
            $out.= "<a href='page-o$id_link.html'><img src='files/$images' width=60 class=imgConf></a>";  


  $out.="</td><td><a href='page-o$id_link.html'>$v_title</a>   $v_descr ... </td><td>$v_255_12</td></tr>"; 
} 
       } 
$out.="</table>"; 
fwrite($f,$out);fclose($f); // Записываем в файл 
} 

echo file_get_contents('news.txt'); // Всегда выводим содержимое файла

7

Re: Рандомизация через день

randomizer
Отличный вариант.

8

Re: Рандомизация через день

Да Hanut,
это решение всей моей проблемы!