Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Отсроченный рандомайзер (https://forum.antichat.xyz/showthread.php?t=79526)

serg-php 03.08.2008 17:16

Отсроченный рандомайзер
 
Имеется скрипт:

Код:

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

/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор базы данных */
mysql_select_db($dbase);
/* Создание SQL запроса */
$sql = "SELECT id_link, name FROM $dtable ORDER BY RAND() LIMIT 7";
/* Исполнение SQL запроса */
$result = mysql_query($sql);
/* Проверка количества вернувшихся строчек в результате*/
$rows = mysql_num_rows($result);
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/
if ((!$rows) || ($rows < 1)) {echo "Результатов НЕТ!!!";}
else {
echo "<br><a href='page-o$id_link.html'>$name</a><br>";
while(list($id_link, $name ) = mysql_fetch_row($result)) {

echo "";
if(empty($button))
echo "<br><a href='page-o$id_link.html'>$name</a><br>";
    }
}
echo "";
?>


Как сделать, чтобы рандомайзер не сразу срабатывал, а через 5 - 10 часов?


Либо выводил последние 10 записи?

NOmeR1 03.08.2008 17:31

Уточни, не понятно что надо сделать.

serg-php 03.08.2008 17:39

Чтобы условие рандома выполнялось через нное кол-во времени!

blaga 03.08.2008 17:52

поставить его на Cron

serg-php 03.08.2008 17:54

На крон, думаю, нерационально!

serg-php 03.08.2008 19:06

Благодарь всех, кто помог разобраться!

Огромная благодарноть blaga!

serg-php 15.08.2008 12:17

Все-таки решил сделать рандомайзер отсроченым!

Создать таблицу, а потом обращаться и смотреть дату, далее рандомить (люди подсказали сделать так)!

serg-php 15.08.2008 12:18

Таблицу создал

CREATE TABLE eu_random_delayed (
id smallint(5) unsigned NOT NULL auto_increment,
ldate datetime NOT NULL,
PRIMARY KEY (id)
);

serg-php 15.08.2008 12:20

Что дальше делать?

По-логике дописывать файл, содержание которого приведено выше!

Что дописывать, не знаю!

serg-php 15.08.2008 12:59

PHP код:

<?
/* Замените нижеследующие переменные на свои */
$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>";
?>


geezer.code 15.08.2008 13:09

интегрировать в твой код некогда .. но примерно вот такой выбор по дате последнего обновления рандома
PHP код:

<?
//вот эту таблу ты создал. в ней будем хранить дату последнего рандома.
/*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 {
//тут идет код без рандома 
}
?>

п.с. я не пхп-программер.. если наду будет на руби )) то будет полный код

serg-php 15.08.2008 13:20

Вариант понятен, но не понятно его внедрение.

Если оказывается, что один день не прошел, то какие данные должен вывести скрипт?
Очевидно точь-в-точь с предыдущим рандомом. Тогда, как он знает, какие строки он выбирал в преды дущем рандоме?

geezer.code 15.08.2008 13:57

Цитата:

Сообщение от serg-php
Вариант понятен, но не понятно его внедрение.

Если оказывается, что один день не прошел, то какие данные должен вывести скрипт?
Очевидно точь-в-точь с предыдущим рандомом. Тогда, как он знает, какие строки он выбирал в преды дущем рандоме?

если так то нужно создать еще одну промежуточную таблицу. в которую выводить результаты последнего рандома.

serg-php 15.08.2008 14:16

Тогда ситуация в корне меняется!

У меня вывод рандома по 5 нужным мне категориям!
Рандом и скрипта, который инклудится убираем.

А ситуация такая:

Каждые сутки или иной интервал, скриптец запусакется и рандобно выбирает данные из указанных категорий!

serg-php 15.08.2008 14:48

Подсказали такой вариант:

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


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

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


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


Как он будет запускаться? (Можно ли не кроном? Или крон опитимальный варант?)

geezer.code 15.08.2008 14:51

Цитата:

Сообщение от serg-php
Подсказали такой вариант:

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


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

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


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


Как он будет запускаться? (Можно ли не кроном? Или крон опитимальный варант?)

можно не кроном... для этого при каждом запросе к скрипту будет выполняться минимум 1 лишний запрос к базе. поэтому лучше кроном.

serg-php 15.08.2008 15:34

Тогда я делаю так:

1. Делаю дубликат таблицы eu_add и называю ее eu_add_random

2. Создаю пхп-файл, который собственно крон и должен запускать.

3. В файле пишу, копировать из eu_add в eu_add_random из таких категорий, случайним образом.

И все!

serg-php 15.08.2008 16:15

PHP код:

<?

/* Замените нижеследующие переменные на свои */
$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 FROM $dtable WHERE ((catid=471)OR(catid=473) OR(catid=474) OR(catid=475)OR(catid=476)) GROUP BY link_id ORDER BY rnd LIMIT 5";

$sql "INSERT link_id, images, v_title, v_255_12, v_descr, catid INTO $dtable_rnd";


?>


geezer.code 15.08.2008 16:18

SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd INTO $dtable_rnd FROM $dtable WHERE ((catid=471)OR(catid=473) OR(catid=474) OR(catid=475)OR(catid=476)) GROUP BY link_id ORDER BY rnd LIMIT 5";

Gifts 15.08.2008 17:33

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

Получится что-то вроде:
PHP код:

$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'); // Всегда выводим содержимое файла 


serg-php 15.08.2008 17:37

Вот люди предлагают такой вариант:

PHP код:

<?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($result0);
    
$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']);
    }
}

?>

Что скажете?

Gifts 15.08.2008 17:41

Посмотри выше, то же самое только не нужно десяток двадцатиэтажных мускульных запросов и скрипт практически умещается на коленке

serg-php 15.08.2008 18:10

Gifts,

это тоже вариант!
Касательно нагрузки на систему может быть удачный!

Где файл news.txt хранить?
В корневой или глубже?

serg-php 15.08.2008 18:12

У меня вывод по 5 разделам! Это что 5 инклудов делать?
Значит 5 файлов news.txt (news1.txt,news2.?

serg-php 15.08.2008 18:20

Gifts, в товоем предложении что-то нето! - При каждом запросе разные данные выводятся, а они должны выводиться только через 24 часа!

Gifts 15.08.2008 18:21

Если у тебя есть скрипт, который при каждом открытии страницы выводит что-то там по 5 категориям, то вставляешь его между строчками
$f=fopen('news.txt','w');
и
fwrite($f,$out);fclose($f);

Тогда в течение 2500 у тебя будет появляться одна и та же страница с тем выводом, который ты хочешь. Файл news.txt может находиться где угодно, главное чтобы он был открыт для записи (права 777 на всякий случай) и чтобы в скрипте все ссылки были исправлены на новое местоположение этого файла

Строчка
PHP код:

$cur=time()-$ftime[9]; 

Должно быть
PHP код:

$cur=time()-$filetime[9]; 


serg-php 15.08.2008 18:25

А я инклуд делал того файла который содержит код Gifts!

serg-php 15.08.2008 18:27

Я бросил код Gifts в отдельный файл, который инклудил в index.php! Неправильно?

Gifts 15.08.2008 18:28

Ошибка в скрипте
Строчка
PHP код:

$cur=time()-$ftime[9]; 

Должно быть
PHP код:

$cur=time()-$filetime[9]; 

Да, скрипт нужно инклудить

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

serg-php 15.08.2008 18:29

Как сделать, чтобы код Gifts в отдельном файле инклудить в index.php?

serg-php 15.08.2008 18:37

Вообще в данной ситуации если инклуддить news.txt, то файл с кодом Гифтс, запускать кроном!

serg-php 15.08.2008 18:47

Работает, Гифтс!

Я говорю по пяти разделам!
У меня согласно данному скрипту реализуется только по одному разделу!

Получается 5 инклудов!

Скрипта гифта, только с разным обращением к таблице!

serg-php 15.08.2008 18:49

Например 1000 хостов в сутки 5 инклудов!

Будет ли это максимально оптимальным вариантом реализации моего замысла?

Gifts 15.08.2008 18:50

>.< Зачем кроном? Каждый раз пользователь заходя на страницу будет получать либо кешированную страницу, либо он своим заходом ее и обновит, лишние телодвижения совершать не надо. Задержка между обновлениями в строчке if ($cur>2500) Число 2500 - это количество СЕКУНД между обновлениями

serg-php 15.08.2008 18:53

Цитата:

>.< Зачем кроном? Каждый раз пользователь заходя на страницу будет получать либо кешированную страницу, либо он своим заходом ее и обновит, лишние телодвижения совершать не надо. Задержка между обновлениями в строчке if ($cur>2500) Число 2500 - это количество СЕКУНД между обновлениями
Принято! Понятно! Согласен!

А как быть по други вопросам?

serg-php 15.08.2008 19:00

Вообще, Гифтс!

Сейчас шлифую твой вариант! Весьма удачный, должен заметить!

serg-php 15.08.2008 20:04

Вообщем, сделал 5 инклудов! Все выводит рандомится с интервалом 2500 секунд!

serg-php 15.08.2008 20:10

Прошу тему пока не закрывать! Возможно, что-то работать не будет!

serg-php 16.08.2008 22:55

Благодарю всех, кто мне помогал!

Особенно благодарю Гифта его вариант настолько дельный.
Жаль, что я раньше такого способа не знал!

Заменил 2500 на 86400 и наслаждаюсь рандомизацией 1 в сутки!


Время: 10:48