[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить код продления срока хранения!!!
segazav
Всем доброго дня!

В базе данных есть некая запись с датой занесения в базу и датой удаления из базы.

При вычислении даты занесения в базу использовал:

$date_ok = date ("YmdHis"); // Определяем дату и время в настоящий момент


При вычислении даты удаления из базы использовал:

$dney = 5; // Задаём срок хранения в базе (дней)
$date_ok = date ("YmdHis");// Определяем дату и время в настоящий момент
$y = date ("Y"); //год
$m = date ("m"); //месяц
$d = date ("d"); //день
$H = date ("H"); //час
$i = date ("i"); //минута
$s = date ("s"); //секунда
$date_end = date("YmdHis", mktime($H, $i, $s, $m, $d+$dney, $y)); // Задаём дату и время окончания хранения записи в базе mktime(час, минута, секунда, месяц, день, год)
// Далее обновляем дату окончания срока хранения записи ($date_end) в базе




Но теперь возникла проблема, которую никак не могу решить!!!

Помогите пожалуйста составить код, чтобы автоматически продлить срок хранения записи в базе на 5 дней ($dney = 5 // величина постоянная) не от даты подачи, а именно от текущей даты + остаток дней от прежней даты окончания



Спустя 8 минут (19.11.2010 - 12:31) linker написал(а):
$dney = 5; // или 60* 60 * 24 * 5 - количество секунд
$secunds = 60* 60 * 24 * $dney; // чтоб понятнее было
$date_end = date('YmdHis', time() + $secunds);
По какому критерию определяется, что надо продлить время хранения?

Спустя 12 минут, 4 секунды (19.11.2010 - 12:44) segazav написал(а):
Извините, но я немного не понял вопроса?

А что означает эта запись (раньше я её не встречал):
$secunds = 60* 60 * 24 * $dney; // чтоб понятнее было

Спустя 1 минута, 37 секунд (19.11.2010 - 12:45) linker написал(а):
Это означает количество секунд в пяти днях.
Все просто, каким образом предполагается, что нужно продлить время хранения на пять дней? Т.е. как ты или как скрипт понимает, что нужно продлить время хранения? Это кто-то указывает или как-то иначе?

Спустя 2 минуты, 34 секунды (19.11.2010 - 12:48) segazav написал(а):
А для чего узнавать кол-во секунд?
*По какому критерию определяется, что надо продлить время хранения?
По желанию пользователя.

Спустя 2 минуты, 53 секунды (19.11.2010 - 12:51) linker написал(а):
А чтоб вот эту простыню не писать
$y = date ("Y"); //год
$m = date ("m"); //месяц
$d = date ("d"); //день
$H = date ("H"); //час
$i = date ("i"); //минута
$s = date ("s"); //секунда
$date_end = date("YmdHis", mktime($H, $i, $s, $m, $d+$dney, $y));
и обойтись одной строкой
$date_end = date('YmdHis', time() + $secunds);
Т.е. пользователь решает у какой записи нужно продлить срок хранения нажатием кнопочки?

Спустя 6 минут, 59 секунд (19.11.2010 - 12:58) segazav написал(а):
Нет, не совсем так.
Сейчас объясню подробнее...

Спустя 3 минуты, 9 секунд (19.11.2010 - 13:01) segazav написал(а):
Есть специальная страница с присвоением даты окончания и даты начала хранения, на ней весь этот код.
Если пользователь ещё раз подаёт запись и она уже есть в базе - то срок хранения должен продлиться на число указанных мной дней, если записи нет, то добавляется новая запись.

Спустя 3 минуты, 1 секунда (19.11.2010 - 13:04) segazav написал(а):
и продлиться срок должен с момента повторной подачи записи (оставшееся кол-во дней + новый срок)!!!

Спустя 3 минуты, 31 секунда (19.11.2010 - 13:07) linker написал(а):
У записи есть идентификатор? Например так
$res = mysql_query("SELECT * FROM `table` WHERE `id` = " . $Id);
if (mysql_num_rows($res))
mysql_query("UPDATE `table` SET `date_end` = '" . $date_end . "' WHERE `id` = " . $id);
else
mysql_query("INSERT ...");
Собственно есть вопросы, в каком формате хранятся даты?

Спустя 5 минут, 5 секунд (19.11.2010 - 13:12) segazav написал(а):
Да именно так!
Все даты хранятся в формате date("YmdHis") поле varchar (14) (именно так мне нужно - это менять не нужно)

Спустя 6 минут (19.11.2010 - 13:18) segazav написал(а):
Извините, но мне нужно отлучиться на 2 часа.
Буду очень рад обсудить мой вопрос до конца, через пару часов!

Спустя 5 минут, 12 секунд (19.11.2010 - 13:24) linker написал(а):
Меняй сначала формат на DATETIME.

Спустя 35 минут, 58 секунд (19.11.2010 - 14:00) segazav написал(а):
И что это изменит???

Спустя 2 минуты, 37 секунд (19.11.2010 - 14:02) linker написал(а):
Как минимум сможешь общаться с этими полями как с датами, а не набором символов. Плюс можно придумать алгоритмы чтобы запросом менять дату, а не высчитывать ее в PHP.

Спустя 3 минуты, 27 секунд (19.11.2010 - 14:06) segazav написал(а):
Хорошо, но всё таки как подсчитать и прибавить к текущему сроку новый срок + остаток старого срока на момент обновления???

Спустя 31 минута, 59 секунд (19.11.2010 - 14:38) linker написал(а):
Зачем еще остаток прибавлять?
Способов масса

Если формат поля DATETIME, но перед этим запросом, нужно сначала вытянуть запись с id = 123, если таковая имеется то делаем запрос
UPDATE `table` SET `date_end` = DATE_ADD(`date_end` INVTERVAL 5 DAY) WHERE `id` = 123
если записи нет, то выполняем запрос
INSERT INTO `table` (`date_end`) VALUES(DATE_ADD(NOW() INVTERVAL 5 DAY))

Если id - уникальное поле, то можно извратиться так
INSERT INTO `table` (`id`, `date_end`) VALUES('123', DATE_ADD(NOW() INVTERVAL 5 DAY)) ON DUPLICATE KEY UDPATE `date_end` = DATE_ADD(`date_end` INVTERVAL 5 DAY)

Спустя 16 минут, 39 секунд (19.11.2010 - 14:54) segazav написал(а):
Но а как быть с остатком?
Именно вся проблема в том, чтобы высчитать остаток срока с момента обновления записи и прибавить его к новому сроку.

Как быть???

Спустя 19 минут, 30 секунд (19.11.2010 - 15:14) linker написал(а):
Ну так логически объясни необходимости высчитывать остаток: date_end минус текущее время. Смотри, добавили запись. Потом на следующий день зашли и решили продлить, получается: текущая дата + 5 - 1 + 5, где 5 - 1 это остаток срока. Ну хозяин барин, пишу подробно
$dney = 5;
$secunds = 60* 60 * 24 * $dney;
$res = mysql_query("SELECT UNIX_TIMESTAMP(`date_end`) AS `date_end` FROM `table` WHERE `id` = 123");
if ($data = mysql_fetch_assoc($res))
{
$date_end = $data['date_end'];
$sub_date = $date_end - time();
$date_new = time() + $sub_date + $secunds;
mysql_query("UPDATE `table` SET `date_end` = '" . date('Y-m-d H:i:s', $date_new) . "'");
}
else
mysql_query("INSERT INTO `table` VALUES('123', DATE_ADD(NOW() INVTERVAL 5 DAY))");

Спустя 14 минут, 52 секунды (19.11.2010 - 15:29) segazav написал(а):
Извиняюсь, может я не правильно объяснил.
Пример: я подал платное объявление 01.01.10 на срок до 05.01.2010 (на 5 дней), затем 03.01.10 я захотел продлить это объявление ещё на 5 дней. Но я же заплатил за 5 + 5 дней, если срок считать с 03.01.10 + 5 дней = 07.01.10 (а заплатил до 10.01.10), т.е. 3 дня выпадают.

Спустя 8 минут, 41 секунда (19.11.2010 - 15:37) linker написал(а):
Ну это теперь понятно. Код см. выше. Поле date_end надо конвертнуть в DATETIME.

Спустя 6 минут, 1 секунда (19.11.2010 - 15:43) segazav написал(а):
Спасибо огромное!!!!!!!!!!

А ваш приведённый пример кода соответствует моему примеру?

Спустя 57 секунд (19.11.2010 - 15:44) linker написал(а):
Если я где-то не ошибся или опечатался, то да.

Спустя 24 минуты, 39 секунд (19.11.2010 - 16:09) segazav написал(а):
У меня есть уникальный ID, как переделать код под такой вариант?

Спустя 6 минут, 57 секунд (19.11.2010 - 16:16) linker написал(а):
Получить его из $_GET, потом все мои '123' заменить на '$id'. Плюс, выборку нужно делать не только по ID записи, но и по ID-юзверя, т.е. в таблице должно быть соответствующее поле.

Спустя 9 минут, 7 секунд (19.11.2010 - 16:25) segazav написал(а):
Ага, понял!
А что такое *по ID-юзверя?

Спустя 2 минуты, 37 секунд (19.11.2010 - 16:28) segazav написал(а):
Откуда в вашем коде $data?

Спустя 5 минут, 23 секунды (19.11.2010 - 16:33) linker написал(а):
Вот отсюда
$data = mysql_fetch_assoc($res)
. Ну ты как-то понимаешь какой юзер зашел? Какой юзер добавил объявление?

Спустя 1 минута, 30 секунд (19.11.2010 - 16:34) segazav написал(а):
Да по IP адресу!

Спустя 1 минута, 56 секунд (19.11.2010 - 16:36) segazav написал(а):
О кстати у меня такой вопрос, может вы знаете?????

Как забанить пользователя, если у него нет IP адреса?

Спустя 7 минут, 58 секунд (19.11.2010 - 16:44) Basili4 написал(а):
segazav
нет адреса нет юзера wink.gif в этих ваших интернетах все равны smile.gif

Спустя 10 минут, 37 секунд (19.11.2010 - 16:55) segazav написал(а):
Ваш код не работает!
Не добавляется дата в поле data_end таблицы
Поле date_end сделал DATETIME!

Спустя 7 минут, 54 секунды (19.11.2010 - 17:03) segazav написал(а):
Показываю весь код:


<?php
// PHP скрипт присвоения объявлению статуса VIP
$dney = 2; // Задаём колличество дней
$order_id = 358; // Задаём номер объявления

- здесь скрипт подключения базы данных -

$result = mysql_query ("SELECT * FROM doska WHERE id='$order_id'",$db);
$myrow = mysql_fetch_array ($result); /*Безопасное извлечение данных из базы*/
$id = $myrow["id"];
$region = $myrow["region"];
$gorod = $myrow["gorod"];
$razdel = $myrow["razdel"];
$podrazd = $myrow["podrazd"];
$zagolovok = $myrow["zagolovok"];
$foto_mini1 = $myrow["foto_mini1"];
$foto_mini2 = $myrow["foto_mini2"];
$foto_mini3 = $myrow["foto_mini3"];
$foto_mini4 = $myrow["foto_mini4"];
$foto_mini5 = $myrow["foto_mini5"];
$foto_mini6 = $myrow["foto_mini6"];

$secunds = 60* 60 * 24 * $dney;
$res = mysql_query("SELECT UNIX_TIMESTAMP(date_end) AS date_end FROM vip WHERE id = $order_id");
if ($data = mysql_fetch_assoc($res))
{
$date_end = $data['date_end'];
$sub_date = $date_end - time();
$date_new = time() + $sub_date + $secunds;
mysql_query("UPDATE vip SET date_end = '" . date('Y-m-d H:i:s', $date_new) . "'");
}
else
{
// Устанавливаем срок подачи нового VIP объявления
$date_razmeheniya = date ("Y-m-d H:i:s");
$date = date ("Y-m-d");
$date_ok = date ("YmdHis");// Определяем дату и время в настоящий момент
$y = date ("Y"); //год
$m = date ("m"); //месяц
$d = date ("d"); //день
$H = date ("H"); //час
$i = date ("i"); //минута
$s = date ("s"); //секунда
$date_end = date("Y-m-d H:i:s", mktime($H, $i, $s, $m, $d+$dney, $y)); // Задаём дату и время окончания объявления mktime(час, минута, секунда, месяц, день, год)
$result3 = mysql_query ("INSERT INTO vip (id,date_razmeheniya,date,date_end,region,gorod,razdel,podrazd,zagolovok,foto_mini1,foto_mini2,foto_m ini3,foto_mini4,foto_mini5,foto_mini6) VALUES('$id','$date_razmeheniya','$date','$date_end','$region','$gorod','$razdel','$podrazd','$zagolovok','$foto_mini1','$foto_mini2','$foto_mini3','$foto_mini4','$foto_mini5','$foto_mini6')");
$vip = "vip";
$result4 = mysql_query ("UPDATE doska SET vip='$vip' WHERE id ='$order_id'",$db);
}
?>

Спустя 10 минут, 35 секунд (19.11.2010 - 17:13) segazav написал(а):
doska - таблица с обычными объявлениями
vip - таблица с VIP объявлениями

Спустя 6 минут, 59 секунд (19.11.2010 - 17:20) linker написал(а):
Тут в конце добавить
mysql_query("UPDATE vip SET date_end = '" . date('Y-m-d H:i:s', $date_new) . "' WHERE id = " . $order_id);
Проблем было бы меньше, если бы приучились имена полей, названия таблиц заключать в апострофы ``, date - зарезервированное слово в мускуле. Тут оно
$result3 = mysql_query ("INSERT INTO `vip` (`id`, `date_razmeheniya`, `date`, ... ");

Спустя 8 минут, 12 секунд (19.11.2010 - 17:29) segazav написал(а):
Вот теперь date_end оновляется!!!

Это у меня для другого назначения

$date_razmeheniya = date ("Y-m-d H:i:s");
$date = date ("Y-m-d");

Спустя 10 минут, 22 секунды (19.11.2010 - 17:39) segazav написал(а):
Нет подождите, $date_razmeheniya = date ("Y-m-d H:i:s"); это начальная дата.

У меня теперь date_end обновляется, но без учёта $date_razmeheniya, просто при каждом обновлении прибавляется 2 дня ($dney = 2;).

Что делать?

Спустя 11 минут, 6 секунд (19.11.2010 - 17:50) linker написал(а):
Ну ты сам говоришь, что разница между датой в date_end и текущая дата, плюс интервал и плюс от date_end. Причем здесь дата размещения?

Спустя 7 минут, 4 секунды (19.11.2010 - 17:57) segazav написал(а):
Нет, нет все нормально!
Я просто уже запутался в этих датах!!!!!!!!!

Проверить работу можно только завтра, когда сменится текущая дата, да ведь?

А вообще может посмотрите мой сайт www.pc01.ru, я как раз разрабатываю для него VIP объявления (ему ещё месяца даже нет).

Может, что посоветуйте (я смотрю вы отличный и умный программист)

Спустя 3 минуты, 42 секунды (19.11.2010 - 18:01) linker написал(а):
Нет, время-то должно меняться, сейчас и час назад - это разные значения даты и времени.

Спустя 5 минут, 24 секунды (19.11.2010 - 18:06) segazav написал(а):
А время в поле date_end не меняется, меняется только число!

Спустя 36 минут, 45 секунд (19.11.2010 - 18:43) segazav написал(а):
Вы здесь?

Спустя 18 часов, 13 минут, 3 секунды (20.11.2010 - 12:56) segazav написал(а):
Но всё таки, в чём ошибка?

Спустя 1 час, 27 минут, 35 секунд (20.11.2010 - 14:24) linker написал(а):
В чем ты считаешь ошибку?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.