Честно говоря с датами вообще на 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(); }
Не тогда проще нужно подсчитать есть ли записи за вчера. 0 нет 1 есть, если 1 то чистить и делать другие операции =) Пусть все делается не через крон а как только обращение на серв идет от первого юзера после 00:00
[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!
Сама проверка, первый ли это юзер или n-ый бессмысленна. Если это первый юзер, то данные удаляться, если нет, то запрос на подсчет кол-ва вчерашних записей вернет 0 и скрипт остановится. Т.е. защита уже присутствует в самом алгоритме. Код (Text): <?php $res = mysql_query("SELECT COUNT(*) FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1"); $count = mysql_result($res, 0); if ($count > 0) { // очистка новой таблицы mysql_query("DELETE FROM `new_table` WHERE DATEDIFF(NOW(), `date`) = 90"); // $count - уже содержит подсчет // перенос в новую таблицу // ... // Очистка старой таблицы mysql_query("DELETE FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1"); } ?>
Код (Text): $access_today = mysql_query("SELECT * FROM access WHERE date = DATE_SUB(CONCAT(CURDATE(), ' 00:00:00'), INTERVAL 1 DAY)"); $ac_today=mysql_num_rows($access_today); Как я понял CURDATE - это текущая дата. Сейчас есть запись 2011-01-01 12:32:15 он мне выводит 0 записей вчерашних.. Соре php только учу все в новинку но даты для меня еще непонятны))
Jampire, в вашем случае по моему не с "прошлого дня до 00:00" берет значения. Или я ошибаюсь? Если ошибаюсь то гуд) Мне какбы только запросы заставить потом само собой решится все =) И еще что значит mysql_result($res, 0); всм. сам ноль он ведь и без этого скажет что 0 если нет записей?.. Соре если вопросы глупые
В чем отличие SELECT * FROM `table` WHERE DATE(`date`) = DATE_SUB(CURDATE(), INTERVAL 1 DAY); от SELECT COUNT(*) FROM `table` WHERE DATEDIFF(NOW(), `date`) = 1 если второй вариант работет.
DATEDIFF(NOW(), `date`) = 1 Отличие в том что последнее условие верно как для вчера, так и для завтра.
Хм... Хотя нет, сейчас поэкспериментировал - понял, что не так, я ошибся. Разница между датами в 1 день в одну сторону даст 1, а в другую сторону -1. Так что возможно, отличий и нет. Не знаю, может если DATEDIFF в качестве аргументов давать DATETIME, а не просто DATE, то он будет учитывать ещё и время, высчитывая количество дней между датами. В первом же примере временная часть не учитывается и в любом случае выбираются все записи за вчера.
DATEDIFF() в качестве аргументов передается именно DATETIME и возвращает разницу в днях, а не в часах. А вот разницу в часах возвращает TIMEDIFF(). Читайте мануалы. Извлечь первую ячейку результата запроса.
Jampire, я знаю, что он возвращает разницу в днях. Передавать ему можно не только DATETIME, но и DATE. Не знаю только будут ли учитываться часы и минуты (если они указаны) для высчитывания дней между датами. Это не сложно проверить, конечно, но чё-то нехочу.
Не будут. И проверять не надо. Достаточно прочесть мануал. Но если вы не верите мануалу, я вам отвечу, что перед тем, как запостить сюда код, я его проверил - учитываются только дни.
Вы мне очень помогли) Но тут задумался, что постоянно у меня считает Я уже и лимит поставил на 1 мне больше и не нужно, но не знаю снижает ли это нагрузку) Вот теперь думаю сделать еще проверку на время. т.е с 00:00 до скажеи 00:10. Пусть в течение 10 минут скрипт проверяет записи и считает в БД, т.к за это время хоть 1 обращение 100% будет и таблица почистится и сделает остальное свое дельце) Вчера проверял время генерации 0.0024... я думаю это уже тупизм, нужно вообще чтобы летало т.к обращений ну очень много будет... так вот, погуглил не нашел в параметре if как время проверяется... кто-нибудь знает?) я думаю естественно знаете) p.s большое спасибо всем что помогаете разобраться очень благодарен)
У меня, как правило есть какой-то конфиг, типа параметр - значение. Я обычно храню его в б.д. Там всякие настройки для работы программы. Этот конфиг по-любому загружается при каждом обращении к программе. Если у тебя есть что-то подобное, я бы просто добавил туда ещё один параметр, типа последняя очистка таблицы. Т.к. конфиг всё равно по-любому загружается, то мы, в общем-то, ничего не теряем. Типо как-то так:
PHP: <?php if(date('z', $config['last_truncate']) !== date('z')) { // Truncate table and anything else... mysql_query("UPDATE `config` SET `p_value` = " . time() . " WHERE `p_key` = 'last_truncate'"); }
Не поверите как я сделал криво но работает) выполняет в течение 15 минут =) Мило смотрится В среднем нагрузка упала с 0.003 до 0.002 =)
Invision Ужс, работать со временем, как со строками, хотя бы $h = (int)date('H'); $m = (int)date('i');