За последние 24 часа нас посетили 52394 программиста и 1757 роботов. Сейчас ищут 939 программистов ...

Очистка данных в 00:00

Тема в разделе "PHP для новичков", создана пользователем Invision, 2 янв 2011.

  1. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Честно говоря с датами вообще на php не дружу и никак не могу разобраться... Да и гугл не помогает :(

    Задача: Необходимо очистить таблицу после 00:00 часов один раз.

    $date - переменная с текущей датой

    Думаю может быть достать значения из таблицы (хранятся в формате datetime) или подсчитать записи которые имеются за вчерашний день? И если такие имеются то чистить. Не знаю как выбрать данные за вчера. Не 24 часа назад а вчера т.е до 00:00..

    Сам подсчет ~
    [sql]$access_usertoday = mysql_query("SELECT * FROM access WHERE date **** (хз что дальше)**** ");
    $ac_usertoday=mysql_num_rows($access_usertoday);[/sql]

    ну и сам if нужно заюзать.. и еще перед удалением нужно подсчитать все и занести в отдельную таблицу. + в той же таблице чистить данные которые привышают 90 дней.. Вообще основная задача чтобы ничего не задерживалось)



    if ($date) ...{
    delete from table ...бла бла бла
    exit();
    }
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    запускай крон в 00:01 и удаляй всё :D
     
  3. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Не тогда проще нужно подсчитать есть ли записи за вчера. 0 нет 1 есть, если 1 то чистить и делать другие операции =) Пусть все делается не через крон а как только обращение на серв идет от первого юзера после 00:00
     
  4. Feiron

    Feiron Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    22
    Симпатии:
    0
    [SQL]
    SELECT id FROM access WHERE date = DATE_SUB(CONCAT(CURDATE(), ' 00:00:00'), INTERVAL 1 DAY)
    [/SQL]

    Делает следующие: Получи ткущую дату - добавить время полуночи, сдвинь интервал на один день.

    Так мне кажется более правильно - потому что то что ты хранишь в переменной Дата может в общем то поменяться, можно конечно преобразовывать её через date и mktime но во первых сиквел сам под себя все быстрее сделает -а во вторых он сделает так как ему удобней и приятней, а значит сэкономит время.

    ЗЫ Выбирать надо primary index если ты просто проверяешь наличие валидных записей, звёздочку старайся не использовать. На самом деле не на нубо фронте звезду используют тогда когда у тебя таблица расширяется в ширь (добавляются новые столбцы фиг знает когда и при фиг знает каком условие)- например ленточная таблица. А так это лишний вынос мозга сиквелу - за который он тебя наградит задержкой)

    Have fun and enjoy the dark side with cookies!
     
  5. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Сама проверка, первый ли это юзер или n-ый бессмысленна. Если это первый юзер, то данные удаляться, если нет, то запрос на подсчет кол-ва вчерашних записей вернет 0 и скрипт остановится. Т.е. защита уже присутствует в самом алгоритме.
    Код (Text):
    1. <?php
    2.  
    3. $res = mysql_query("SELECT COUNT(*) FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1");
    4. $count = mysql_result($res, 0);
    5. if ($count > 0)  {
    6.     // очистка новой таблицы
    7.     mysql_query("DELETE FROM `new_table` WHERE DATEDIFF(NOW(), `date`) = 90");
    8.     // $count - уже содержит подсчет
    9.     // перенос в новую таблицу
    10.     // ...    
    11.  
    12.     // Очистка старой таблицы
    13.     mysql_query("DELETE FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1");
    14. }
    15.  
    16. ?>
     
  6. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Код (Text):
    1. $access_today = mysql_query("SELECT * FROM access WHERE date = DATE_SUB(CONCAT(CURDATE(), ' 00:00:00'), INTERVAL 1 DAY)");
    2. $ac_today=mysql_num_rows($access_today);
    Как я понял CURDATE - это текущая дата.

    Сейчас есть запись 2011-01-01 12:32:15 он мне выводит 0 записей вчерашних..
    Соре php только учу все в новинку но даты для меня еще непонятны))
     
  7. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Jampire, в вашем случае по моему не с "прошлого дня до 00:00" берет значения. Или я ошибаюсь? Если ошибаюсь то гуд) Мне какбы только запросы заставить потом само собой решится все =) И еще что значит mysql_result($res, 0); всм. сам ноль он ведь и без этого скажет что 0 если нет записей?..

    Соре если вопросы глупые :)
     
  8. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Jampire, прекрасно работает =)
     
  9. Feiron

    Feiron Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    22
    Симпатии:
    0
    Конечно, заменить = на >= я для примера написал думал вы догадаетесь )
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    [sql]SELECT * FROM `dates` WHERE DATE(`my_datetime`) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);[/sql]
     
  11. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    В чем отличие
    SELECT * FROM `table` WHERE DATE(`date`) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
    от
    SELECT COUNT(*) FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1

    если второй вариант работет.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    DATEDIFF(NOW(), `date`) = 1
    Отличие в том что последнее условие верно как для вчера, так и для завтра.
     
  13. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Спасибо большое.
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Хм... Хотя нет, сейчас поэкспериментировал - понял, что не так, я ошибся. Разница между датами в 1 день в одну сторону даст 1, а в другую сторону -1.
    Так что возможно, отличий и нет. Не знаю, может если DATEDIFF в качестве аргументов давать DATETIME, а не просто DATE, то он будет учитывать ещё и время, высчитывая количество дней между датами. В первом же примере временная часть не учитывается и в любом случае выбираются все записи за вчера.
     
  15. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    DATEDIFF() в качестве аргументов передается именно DATETIME и возвращает разницу в днях, а не в часах. А вот разницу в часах возвращает TIMEDIFF(). Читайте мануалы.
    Извлечь первую ячейку результата запроса.
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Jampire, я знаю, что он возвращает разницу в днях. Передавать ему можно не только DATETIME, но и DATE. Не знаю только будут ли учитываться часы и минуты (если они указаны) для высчитывания дней между датами. Это не сложно проверить, конечно, но чё-то нехочу.
     
  17. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Не будут. И проверять не надо. Достаточно прочесть мануал. Но если вы не верите мануалу, я вам отвечу, что перед тем, как запостить сюда код, я его проверил - учитываются только дни.
     
  18. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Вы мне очень помогли) Но тут задумался, что постоянно у меня считает
    Я уже и лимит поставил на 1 мне больше и не нужно, но не знаю снижает ли это нагрузку) Вот теперь думаю сделать еще проверку на время. т.е с 00:00 до скажеи 00:10. Пусть в течение 10 минут скрипт проверяет записи и считает в БД, т.к за это время хоть 1 обращение 100% будет и таблица почистится и сделает остальное свое дельце) Вчера проверял время генерации 0.0024... я думаю это уже тупизм, нужно вообще чтобы летало т.к обращений ну очень много будет... так вот, погуглил не нашел в параметре if как время проверяется... кто-нибудь знает?) я думаю естественно знаете)

    p.s большое спасибо всем что помогаете разобраться очень благодарен)
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    У меня, как правило есть какой-то конфиг, типа параметр - значение. Я обычно храню его в б.д. Там всякие настройки для работы программы. Этот конфиг по-любому загружается при каждом обращении к программе. Если у тебя есть что-то подобное, я бы просто добавил туда ещё один параметр, типа последняя очистка таблицы. Т.к. конфиг всё равно по-любому загружается, то мы, в общем-то, ничего не теряем. Типо как-то так:
     
  20. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    PHP:
    1. <?php
    2. if(date('z', $config['last_truncate']) !== date('z')) {
    3.    // Truncate table and anything else...
    4.    mysql_query("UPDATE `config` SET `p_value` = " . time() . " WHERE `p_key` = 'last_truncate'");
    5. }
     
  21. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Не поверите как я сделал криво но работает) выполняет в течение 15 минут =)

    Мило смотрится :D
    В среднем нагрузка упала с 0.003 до 0.002 =)
     
  22. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Invision
    Ужс, работать со временем, как со строками, хотя бы
    $h = (int)date('H');
    $m = (int)date('i');
     
  23. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Знаю, а от производительности зависит?)
     
  24. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    ну мб пару десятитысячных секунда выиграешь, если не меньше)))
     
  25. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    тогда не страшно)