Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пройденный срок, выполнение запроса через n-ое кол-во дне 
:(
    Опции темы
nz1
  Дата 11.2.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



имеется колонка в БД с типом datetime туда записывается дата последнего обращения к файлу

так вот встала задача чтобы удалять этот файл по последнему к нему обращению через 30 дней

дата следующего формата: 2001-01-01 01:01:01

пробовал химичить с переменными и вычеслять промежуток между ними (смотрел тут - http://php.com.ua/ru/tips/PRINT/php_mysql_date.htm), но так и ни чего не добился:

$time=date("d-m-Y", strtotime($date));
$today=date('d-m-Y');

$time - последняя дата
$today - сегодня

также нужно вывести информацию о том, когда будет удален файл, тоисть прибавить к $time 30 дней и вывести в том же формате: d-m-Y


спасибо за любую информацию
PM   Вверх
bars80080
Дата 11.2.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



возможно ли переправить поле в число?
тогда храним там число таймстэп и все вычисления становятся очень простыми
PM MAIL WWW   Вверх
GeneralElectric
Дата 11.2.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



вообще-то, вычисления с полем типа datetime ничуть не сложнее.

nz1, в MySQL богатейшие средства работы с датой. DATE_ADD() решит все твои проблемы. Химичить средствами РНР нет никауой необходимости
PM MAIL   Вверх
gemaglabin
Дата 11.2.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.2.2008

Репутация: нет
Всего: нет



Этот код выдаст тебе юникосвый таймстамп . С помощью time() узнаешь текущее время в unix формате.Вот и считай нужное тебе кол-во.Можно это сделать с помощью СУБД , но php это выполнит быстрее
Код

echo strtotime( '2001-01-01 01:01:01'), "\n";
php->978300061

PM MAIL WWW   Вверх
flashaa
Дата 11.2.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Если в момент, когда потребуется дата работаем в php - получаем в php, если в mysql - получаем дату в mysql.

таймстамп +30 дней в php:
Код

$ts = time();

$newTs = strtotime('+ 30 day', $ts);


Это сообщение отредактировал(а) flashaa - 11.2.2008, 13:27
PM MAIL   Вверх
GeneralElectric
Дата 11.2.2008, 13:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



flashaa, во-первых, у него не +30, а -30
Во-вторых, у него нет никакого таймстампа.
PM MAIL   Вверх
flashaa
Дата 11.2.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



GeneralElectric, если брать сначала дату последней модификации, то как раз плюс.
Код


if(strtotime('+ 30 day', $ts) >= time() ) {
    // удаляем файл
}


Если mysql :
Код

SELECT NOW() as currrentTime, date_add(last_edit_time INTERVAL 30 day) as fileTime;


Это сообщение отредактировал(а) flashaa - 11.2.2008, 13:41
PM MAIL   Вверх
nz1
Дата 12.2.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(flashaa @ 11.2.2008,  13:34)
GeneralElectric, если брать сначала дату последней модификации, то как раз плюс.
Код


if(strtotime('+ 30 day', $ts) >= time() ) {
    // удаляем файл
}


Если mysql :
Код

SELECT NOW() as currrentTime, date_add(last_edit_time INTERVAL 30 day) as fileTime;

сделал так:

 if(strtotime('+ 30 day', $sdate) >= time() ) {
//код
}

где $sdate - дата последнего доступа к файлу в формате datetime

но ничего не работает
PM   Вверх
GeneralElectric
Дата 12.2.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



прошу прощения, был неправ

Это сообщение отредактировал(а) GeneralElectric - 13.2.2008, 09:34
PM MAIL   Вверх
flashaa
Дата 12.2.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(nz1 @  12.2.2008,  15:06 Найти цитируемый пост)

 if(strtotime('+ 30 day', $sdate) >= time() ) {
//код
}

где $sdate - дата последнего доступа к файлу в формате datetime

но ничего не работает 

Что именно должно работать? если вы вставили // код.

Вот тестовый скрипт, который создает 2 файла с именами 1 и 2.
Первому устанаваливает дату модификации в далекое прошлое, второму - на позавчера - 10 февраля.
Затем получает информацию о файлах и проверяет устарели ли они по описанному в моем предыдущем посте алгоритму.
Если файл устарел, выводит сообщение. Все правильно выведет - первый устарел.
Код

fopen('1', 'w');
touch('1', strtotime('2007-08-09'));

fopen('2', 'w');
touch('2', strtotime('2008-02-09'));


$stat1 = stat('1');
$stat2 = stat('2');

if (strtotime('+ 30 day', $stat1['mtime']) < time()) {
    
    echo 'first is old';
    
}

if (strtotime('+ 30 day', $stat2['mtime']) < time()) {
    
    echo 'second is old';
    
}


Вообще если у вас дата модификации хранится в базе, то получение имен файлов, которые просрочены будет выглядеть так:

Код

mysql_connect('localhost', 'user', 'password');
mysql_select_db('your_database');

$q = 'SELECT * FROM files WHERE DATE_ADD(last_edit_time, 30 DAY) > NOW()'; // составляем запрос
$r = mysql_query($q); // выполняем запрос, получаем результат - записи просроченных файлов

// Перебираем все строки результата, рассматриваем каждую
for ($i = 0; $i < mysql_num_rows($r), $++) {

    $name = mysql_result($r, $i, 'fName'); // Получаем какое-то поле конкретного файла, наверно его имя

    // наверное удаляем файл
    unlink('/var/www/directory/'. $name);

}


Только не забудьте подставить ваши данные подключения к серверу, название бд, таблиц, полей , директорию

Это сообщение отредактировал(а) flashaa - 12.2.2008, 18:59
PM MAIL   Вверх
nz1
  Дата 12.2.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



flashaa, вот так код выглядит у меня:

Код

$result2 = $db->sql_query("SELECT sid, fid, sdate FROM ".$prefix."_getit_stat WHERE DATE_ADD(sdate, 2 DAY) > NOW()");
                      while(list($sid, $fid, $sdate) = $db->sql_fetchrow($result2)) {
                      echo "$sid - $sdate<br>";
                      }



где sdate - то самое поле с информацией о дате последнего доступа в поле типа datetime

не проходит(
PM   Вверх
CyClon
Дата 12.2.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Что заставляет людей хранить время в формате datetime? Чем unix-формат не устраивает?

Код
<?php

$current = '2001-01-01 01:01:01';
$current = strtotime($current);
$delay = 60 * 60 * 24 * 30;

if ($current + $delay < time()) {
    unlink('temp.file');
}

?>


Не проверял, но должно работать.


--------------------
user posted image
PM   Вверх
Golda
Дата 12.2.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 20
Всего: 42



Цитата(CyClon @  12.2.2008,  21:47 Найти цитируемый пост)
Что заставляет людей хранить время в формате datetime? Чем unix-формат не устраивает?


интересный разговор на тему работы с датами в SQL и PHP был здесь


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
flashaa
Дата 13.2.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(CyClon @  12.2.2008,  21:47 Найти цитируемый пост)
Что заставляет людей хранить время в формате datetime? Чем unix-формат не устраивает?

1) Тем, что unix_time выглядит как число и не читаем.
2) Метка времени строится относительно смещения GMT - серверы в разных часовых поясах покажут разное время и потому при неаккуратном обращении может быть путаница. Хотя это довольно редкий факт, у меня путаница случалась.
3) Ну и наконец тем, что timestamp не пригоден для дат в далеком прошлом и неближайшем будущем
PM MAIL   Вверх
flashaa
Дата 13.2.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(nz1 @  12.2.2008,  20:43 Найти цитируемый пост)
$result2 = $db->sql_query("SELECT sid, fid, sdate FROM ".$prefix."_getit_stat WHERE DATE_ADD(sdate, 2 DAY) > NOW()");
                      while(list($sid, $fid, $sdate) = $db->sql_fetchrow($result2)) {
                      echo "$sid - $sdate<br>";
                      }


Непонятно, что именно не работает?
Вообще при работе с SQL-запросами в целях быстрой отладки рекомендуется выводить получаемый запрос. И оценивать его.
Т.е. перед отправкой запроса необходимо сделать
Код

echo "SELECT sid, fid, sdate FROM ".$prefix."_getit_stat WHERE DATE_ADD(sdate, 2 DAY) > NOW()";

Дальше оцениваете запрос, исправляете ошибки, если они есть. Если нет,  тогда возьмите этот запрос
и напишите его в терминале работы с MySQL - сервером. Посмотрите, каков будет результат.
Если ошибка синтаксиса - исправляете. Если ошибок нет, но возвращается отличный от желаемого результат,
значит тогда проверяете ещё 2 пункта - 
корректны ли значения в запросе (хотя после проверки текста запроса этот вопрос должен отпасть),
и смотрите собственно вашу базу - есть ли в ней действительно значения, которые подлежат выводу по данному запросу.

Если не разберетесь, приводите текст запроса, структуру таблицы (получается с пом. запроса show create table `tbl_name`) и несколько строк таблицы.
PM MAIL   Вверх
CyClon
Дата 13.2.2008, 12:02 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Цитата
1) Тем, что unix_time выглядит как число и не читаем.
2) Метка времени строится относительно смещения GMT - серверы в разных часовых поясах покажут разное время и потому при неаккуратном обращении может быть путаница. Хотя это довольно редкий факт, у меня путаница случалась.
3) Ну и наконец тем, что timestamp не пригоден для дат в далеком прошлом и неближайшем будущем 


1) Для чего date("d.m.Y H:i:s", $time) ? Это более универсально, зная unix-time ты сможешь знать абсолютно все данные - день недели, кол-во секунд, месяц прописью и т.д. datetime придется конвертировать.
2) Проблем никогда не было. Да и вообще это не проблема, если голова на плечах есть - такие трудности преодолеваются с легкостью.
3) Извините, вы на сайте используете даты а-ля 1436 год до н.э. ? Или 208563 год? Я на 100% уверен, что даты будующего с обновлением интерпретатора PHP будут поддерживаться + ваш движок не будет использоваться в течение 50 лет.


--------------------
user posted image
PM   Вверх
flashaa
Дата 13.2.2008, 12:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(CyClon @  13.2.2008,  12:02 Найти цитируемый пост)
1) Для чего date("d.m.Y H:i:s", $time) ? Это более универсально, зная unix-time ты сможешь знать абсолютно все данные - день недели, кол-во секунд, месяц прописью и т.д. datetime придется конвертировать.

Вот не люблю я когда начинается перетягивание одеяла. Одно не лучше другого. У одного есть и достоинства и недостатки, так и у другого. Я просто ответил на вопрос, почему в бд не хранится таймстамп. А не утверждаю, что неудобен вообще во всем и тд и тп.
Кстати ничего не мешает мне получить метку из строкового представления даты с помощью strtotime, поиметь все возможности(и недостатки) временных меток.

Цитата(CyClon @  13.2.2008,  12:02 Найти цитируемый пост)
2) Проблем никогда не было. Да и вообще это не проблема, если голова на плечах есть - такие трудности преодолеваются с легкостью.

В бд хранится таймстамп, равный 600. Это 10 минут. На сервере в Москве date('i:S') покажет 3 часа 10 мин. На сервере в Германии 2 часа 10 мин. Это хорошо если храниться таймстапм относительно нулевого смещения. Тогда мы сможем использовать gmdate() и все будет ок. НО! Если сохранена была метка, полученная с пом. time() то значит в бд хранится локальное время. Очень интересно потом расчитывать все эти смещения временные.

Цитата(CyClon @  13.2.2008,  12:02 Найти цитируемый пост)
вы на сайте используете даты а-ля 1436 год до н.э. ?

Нет, но часто могут использоваться паспортные данные людей. А как известно людей, родившихся раньше 1970 года достаточно много сейчас.

Это сообщение отредактировал(а) flashaa - 13.2.2008, 12:14
PM MAIL   Вверх
nz1
Дата 13.2.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(CyClon @ 12.2.2008,  21:47)
Что заставляет людей хранить время в формате datetime? Чем unix-формат не устраивает?

Код
<?php

$current = '2001-01-01 01:01:01';
$current = strtotime($current);
$delay = 60 * 60 * 24 * 30;

if ($current + $delay < time()) {
    unlink('temp.file');
}

?>


Не проверял, но должно работать.

о да, то что нужно, спасибо!

вот так выглядит мой рабочий код:

             
Код

$result2 = $db->sql_query("SELECT sid, fid, sdate FROM ".$prefix."_getit_stat WHERE fid='$id'");
list($sid, $fid, $sdate) = $db->sql_fetchrow($result2);

$sdate = strtotime($sdate);
$delay = 60 * 60 * 24 * 30;
if ($sdate + $delay < time()) {

//удаление файла

}


остальным также спасибо smile 
PM   Вверх
flashaa
Дата 13.2.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Код

Не проверял, но должно работать.

Cкладывание меток - зло злейшее. Для первых шагов оно конечно годится, но для мало-мальски серьезных операций с датами - нет. Идут побоку переводы на летнее/зимнее время, февраль високосного года.
Вот так неравномерности времени были бы учтены: 
Код

strtotime('+' . gmdate('U', $delay) . ' second', $current);

PM MAIL   Вверх
GeneralElectric
Дата 13.2.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



CyClon, ты задал вопрос. Тебе на него ответили. Развернуто и подробно.
Надо сказать "спасибо" а не отфутболивать приведенные аргументы. Сказать "а у меня проблем не было и вообще проблемы только у дураков" можно в ответ вообще на любой довод, в любой дискуссии.

И уж тем более не писать совсем откровенную чушь вида "таймстамп можно сконвертировать функцией date(), а datetime придется конвертировать".

PM MAIL   Вверх
GeneralElectric
Дата 14.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Признаю, что был груб по форме и неправ по сути в отношении автора топика. И приношу ему свои извинения.

Однако я был введен в заблуждение тем фактом, что для данного вопроса, скорее всего, был выбран неправильный раздел, и поместить его надо было в Центр помощи, если автор, по его словам, не программист, а дизайнер, и самостоятельно написать и отладить скрипт не в состоянии.

Это сообщение отредактировал(а) GeneralElectric - 14.2.2008, 12:03
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.