Отсроченный рандомайзер

Discussion in 'PHP' started by serg-php, 3 Aug 2008.

  1. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Имеется скрипт:

    Code:
    <?
    /* Замените нижеследующие переменные на свои */
    $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 записи?
     
    #1 serg-php, 3 Aug 2008
    Last edited: 3 Aug 2008
  2. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Уточни, не понятно что надо сделать.
     
  3. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Чтобы условие рандома выполнялось через нное кол-во времени!
     
  4. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    поставить его на Cron
     
  5. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    На крон, думаю, нерационально!
     
  6. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Благодарь всех, кто помог разобраться!

    Огромная благодарноть blaga!
     
  7. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Все-таки решил сделать рандомайзер отсроченым!

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

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Таблицу создал

    CREATE TABLE eu_random_delayed (
    id smallint(5) unsigned NOT NULL auto_increment,
    ldate datetime NOT NULL,
    PRIMARY KEY (id)
    );
     
  9. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Что дальше делать?

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

    Что дописывать, не знаю!
     
  10. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    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>";
    ?>
     
  11. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    интегрировать в твой код некогда .. но примерно вот такой выбор по дате последнего обновления рандома
    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 {
    //тут идет код без рандома 
    }
    ?>

    п.с. я не пхп-программер.. если наду будет на руби )) то будет полный код
     
    #11 geezer.code, 15 Aug 2008
    Last edited: 15 Aug 2008
  12. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Вариант понятен, но не понятно его внедрение.

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

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    если так то нужно создать еще одну промежуточную таблицу. в которую выводить результаты последнего рандома.
     
  14. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Тогда ситуация в корне меняется!

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

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

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

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Подсказали такой вариант:

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


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

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


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


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

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    можно не кроном... для этого при каждом запросе к скрипту будет выполняться минимум 1 лишний запрос к базе. поэтому лучше кроном.
     
  17. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Тогда я делаю так:

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

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

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

    И все!
     
  18. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    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";


    ?>
     
  19. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    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";
     
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    А не проще ли вместо извращений с БД выводить результат запроса в файл и его просто инклудить? Преимущества на лицо - в десятки раз уменьшаем количество запросов к базе (так как надо раз обновлять файл раз в час/сутки), не надо создавать лишних, да и ненужных таблиц

    Получится что-то вроде:
    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'); // Всегда выводим содержимое файла
     
    _________________________
    1 person likes this.