Изтриване от дб с време

pro12

Registered
Как да направя да се задава време на обява имам селект меню за време като там има 10, 30 и 120дена задам примерно 10 а да се изтрие обявата на 10ден?
 
записваш времето, когато трябва да се изтрие (+10 days) и с cron проверяваш всеки ден кои трябва да се изтрият.
 
В mysql имаш събития (events). В таблицата ти с обявите слагаш три полета - флаг за архивиране (не е добре да триеш данни - по-доброто решение е да ги маркираш като изтрити, но те да и стоят в базата), дата на публикуване и дата на валидност (според това колко дена ще е активна конкертната обява - 10, 30 или 120 дена). Създаваш ново събитие, зацикляш го да речем на един час и в тялото правиш един ъдейт на всички обяви, които датата им на валидност е изтекла към текущия момент, като им вдигаш архивния флаг за да не се показват повече.
 
lamerko каза:
В mysql имаш събития (events). В таблицата ти с обявите слагаш три полета - флаг за архивиране (не е добре да триеш данни - по-доброто решение е да ги маркираш като изтрити, но те да и стоят в базата), дата на публикуване и дата на валидност (според това колко дена ще е активна конкертната обява - 10, 30 или 120 дена). Създаваш ново събитие, зацикляш го да речем на един час и в тялото правиш един ъдейт на всички обяви, които датата им на валидност е изтекла към текущия момент, като им вдигаш архивния флаг за да не се показват повече.

Защо е по-добре да седят в базата данни?

Не се ли получават така зомби записи?
 
Fakeheal каза:
lamerko каза:

Защо е по-добре да седят в базата данни?

Не се ли получават така зомби записи?
Това май се получава. Мисля, че OLX-а работи точно на този принцип? Можеш да си архивираш обявата.. съответно по - късно да я ъпдейтнеш и да махнеш флага за архив, като и се задава и ново време на активност.
 
Fakeheal каза:
lamerko каза:
В mysql имаш събития (events). В таблицата ти с обявите слагаш три полета - флаг за архивиране (не е добре да триеш данни - по-доброто решение е да ги маркираш като изтрити, но те да и стоят в базата), дата на публикуване и дата на валидност (според това колко дена ще е активна конкертната обява - 10, 30 или 120 дена). Създаваш ново събитие, зацикляш го да речем на един час и в тялото правиш един ъдейт на всички обяви, които датата им на валидност е изтекла към текущия момент, като им вдигаш архивния флаг за да не се показват повече.

Защо е по-добре да седят в базата данни?

Не се ли получават така зомби записи?

По този начин се архивират. Току-виж без да искаш си изтрил някой запис, можеш да го върнеш доста лесно.
Естествено, такива записи не е нужно да се пазаят години. Пазаят се за определен период от време, след това се чисти базата данни.

Ако са данни, които и след 1 година биха били в полза да се върнат, то ще се сложи времеви флаг.

По принцип ORM-ите го поддържат това. Само трябва да имаш колона с име deleted_at.


Laravel или по-точно Eloquent библиотеката го има, нарича се soft delete.
 
По всяко време можеш да подновиш обявата, без да я въвеждаш отново. За изчистване на базата от паразитни записи - може да се пуска скрип за изчистане веднъж годшно например за стари записи
 
PHP:
<?php
include("conf.php");

if(isset($_POST['izprati'])){ 
$data = date("j/n/Y G:i:s"); 
$ime = $_POST['ime']; 
$ime = htmlspecialchars($ime); 
$ime = addslashes($ime);  
$opisanie = $_POST['opisanie']; 
$opisanie = htmlspecialchars($opisanie); 
$valdata = $_POST['valdata']; 
$valdata = htmlspecialchars($valdata); 
$valdata = addslashes($valdata);    

$sql = ("INSERT INTO obqvi(ime, opisanie, data, valdata) VALUES('$ime','$opisanie','$data', '$valdata' )"); 
if ($conn->query($sql) === TRUE) {
    echo "добавена!";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}

?>
Това ми е кода за добавяне на обявата.

Скруктората на дб.
Код:
CREATE TABLE `obqvi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ime` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `opisanie` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `data` int(11) NOT NULL,
  `valdata` int(11) NOT NULL,
  PRIMARY KEY (`id`)
Как да направя събитие за изтриване на дадена обява? valdata Тук се записва след колко време да се изтрие.[/php]
 
Като за начало ползвай date/datetime тип за дати, а не int.

За самото събитие ти трябва нещо от рода (при положение, че нямаш флаг за триене и работиш с таймстамп):

[sql]CREATE EVENT `delete_ad` ON SCHEDULE
EVERY 10 MINUTE STARTS '2015-09-28 01:01:01'
ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO BEGIN
DELETE FROM `obqvi` WHERE UNIX_TIMESTAMP(NOW()) >= `valdata`;
END[/sql]

Ако имаш подчинени таблици без външен ключ - трябва и тях да обработиш в този случай...
 
lamerko каза:
Като за начало ползвай date/datetime тип за дати, а не int.

За самото събитие ти трябва нещо от рода (при положение, че нямаш флаг за триене и работиш с таймстамп):

[sql]CREATE EVENT `delete_ad` ON SCHEDULE
EVERY 10 MINUTE STARTS '2015-09-28 01:01:01'
ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO BEGIN
DELETE FROM `obqvi` WHERE UNIX_TIMESTAMP(NOW()) >= `valdata`;
END[/sql]

Ако имаш подчинени таблици без външен ключ - трябва и тях да обработиш в този случай...
Не става дава ми това #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7
 
Трябва да си предефинираш знака за терминиране и после да си го върнеш... например:

[sql]delimiter |

CREATE EVENT `delete_ad` ON SCHEDULE

EVERY 10 MINUTE STARTS '2015-09-28 01:01:01'

ON COMPLETION PRESERVE

ENABLE

COMMENT ''

DO BEGIN

DELETE FROM `obqvi` WHERE UNIX_TIMESTAMP(NOW()) >= `valdata`;

END |

delimiter ;
[/sql]

Повече за синтактиса на фумкции и процедури в mysql: https://dev.mysql.com/doc/refman/5.6/en/create-procedure.html
 
Не става дава ми това Error deleting record: Cannot proceed because system tables used by Event Scheduler were found damaged at server start
 

Back
Горе