Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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