т.е. ты имеешь ввиду что запись в БД лежит лежит, прошло время, она там сама удалилась. Хз, по моему такого не бывает. Для таких вещей что-то слышал про handler или триггер. Ну т.е. на таблицу вешается триггер, и по определенному событию он срабатывает и делает DELETE | UPDATE | INSERT /* могу путаться в терминах */ и еще момент, удалять запись из таблицы плохая практика. Если со временем запись перестанет быть нужна, на нее лучше повесить какой-нибудь флаг, чтобы она перестала выводиться.
Можно. С типами datetime, timestamp можно делать операции сравнения. Т.е. где-нибудь в начале скрипта делаешь запрос к БД PHP: $time = date("Y-m-d H:i:s", strtotime("5 minutes ago")); $db->query("delete from table where time_column < '$time'");
@mkramer классно, хорошо объяснил а если я использую для вычисления времени int поле в базе данных, не пойдет для вычисления?
Ну int тем более можно сравнивать Хотя время должно храниться как время, а не как число. Но, если тип int, то просто не нужен вызов date. Посмотри, что возвращает strtotime
@mkramer Я тебя не понял, мне запрос сделать что ли? Если просто через var_dump(strtotime($timePoleBase)); то выводит false. Подставил поле время int из базы.
@mkramer PHP: echo strtotime("now"), "\n"; echo strtotime("10 September 2000"), "\n"; echo strtotime("+1 day"), "\n"; echo strtotime("+1 week"), "\n"; echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; echo strtotime("next Thursday"), "\n"; echo strtotime("last Monday"), "\n"; Мануал в моем браузере ! Ты все время комментируешь в х*ю сторону. Мне не нравится так, можно было бы ставить палец вниз поставил бы Я не помню когда ты положительный ответ мне ставил.
Ну так начинай соображать. Если у тебя время хранится в int, значит там unix-метка. strtotime возвращает unix-метку. Одну unix-метку можно сравнить с другой unix-меткой. Значит из кода, который я привёл, достаточно убрать date, оставить один strtotime. И обязательно надо, чтоб так разжёвано всё было? А мануалы надо читать, те, что русским языком написаны.
@mkramer Лучше лишний раз похвалить чем сразу рога наставлять, я читаю мануал когда вижу не понятную функцию. А пока мне все было понятно в твоем примере. Можно его использовать даже без крона?
Можно и без крона, да. Просто на инициализацию приложения. Он не должен замедлить загрузку. Понятно было не всё, иначе не спросил бы такое: После прочтения мануала по strtotime передавать в неё timestamp в виде целого числа в голову приходить не должно
Вот сылка на юпуп Тебе обязательно надо посмотреть хотя бы 4 лекции, там почти все ответы на твои вопросы. @mkramer предлагает тебе сделать новый запрос к БД, можно и так, но смысл, если это простой сайт одно, а если у тебя высоконагруженная база? если 1 000 000 записей и 1 000 пользователей в час?? 1000 бесполезных запросов к базе в час? плохая логика, если ты хочешь быть хорошим разработчиком, надо делать четко, продумывать логику заранее, а не ждать когда система упадет, а потом переделывать. Мне кажется это плохой вариант, и сама логика... int? скажи, нахрена хранить дату в int?? Опиши саму логику, зачем удалять запись из БД, только пошагово опиши, как ты пишешь скрипт.
@karmay, это же не какой-нибудь тяжёлый запрос, этот delete займёт не больше времени, чем предлагаемая тобой установка флага, который конкретно в данном случае не нужен. По поводу int для времени - мне тоже не нравится, согласен. В базе уже есть хорошие типы для времени
@_ne_scaju_, и в результате убил возможность работать с датой средствами MySQL: http://www.mysql.ru/docs/man/Date_and_time_functions.html
@mkramer Ок если я выбираю тип timestamp нужно ли всегда указывать что по умолчанию будет использоваться CURRENT_TIMESTAMP или это не всегда нужно? И если я проверку времени делал так с иcпользованием int: PHP: $infoList = $checkIdKey -> fetch(); //Вытащили данные из запроса SELECT # Расчет времени для проверки не прошло ли время $send_unix_date = $infoList['time_activation']; # время из базы $time = $_SERVER['REQUEST_TIME']; # получаем время начала запроса веб-страницы $activation_period = 3600; # время на активацию 1 час $difference = floor(($time - $send_unix_date) / $activation_period); # если время из базы не превышает период показываю форму иначе удаляем запись и делаем редирект if(!$difference) { echo 'все ок'; //показываем форму }else{ echo 'time out'; //удалить запись //перенаправить пользователя } а как же проверить с использованием timestamp? Что бы я с уверенностью мог перейти на него и пользоваться им!!!
Ну я же дал ссылку на strtotime, дал ссылку на функции БД работы со временем... Вот ещё одна: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampdiff Можно даже сразу сделать Код (Text): select *, TIMESTAMPDIFF(MINUTE, NOW(), time_activation) as difference from table_name where .....
@mkramer Хорошо почему лучше использовать именно этот тип для базы а не int, по удобству чтения согласен видно реальную дату и время. По весу не знаю что тяжелей по оптимизации тоже не знаю. Приведи пару аргументов. --- Добавлено --- Правильно ли собираюсь хранить дату и время пишу в базе так как на скриншоте:
Я уже привёл - можно использовать родные функции mysql для работы со временем, организации выборок. Потом, если будет индексация по этому полю, то, возможно, если mysql будет точно знать, что это - время, а не просто целое число, он сможет организовать индекс более эффективно. Возможно, в будущем изменит формат хранения (внутренний) так, чтоб не было проблемы 2035-го (если я не ошибаюсь) года. И опять вопрос - правильно/неправильно. Под задачу. Вот ты там на скрине ставишь, чтоб при обновлении записывался current_timestamp. Я не знаю твоей задачи, нужно тебе это или нет.
Ну значит в твоём случае уместно. Всё зависит от решаемой задачи. Сказать, что что-то в корне неправильно, можно лишь о какой-нибудь глупости, типа попытке передать целое число в strtotime
Почему у меня в базу сохраняется дата на час вперед, хотя у меня время не такое? Такое поведение и в timestamp что в int сохраняю тоже самое на час вперед в базу сохраняется поле. Ах да и я решил работать чисто с int разницы нет в каком формате я храню дату, все ровно оно все будет преобразовываться из unix в нормальную дату.
@mkramer Подскажи пожалуйста как исправить можно на компе проверил все правильно стоит и часовой пояс тоже правильный стоит.