Zanim wykonamy prostą procedurę kasowania starych danych niezbędne będzie prawidłowe skonstruowanie samej tabeli. Musi ona zawierać pole z datą rekordu, aby można było określić czy wpis jest starszy niż 30 dni czy nie.
Może to być pole typu DATE (mamy do dyspozycji gotowy typ daty w formacie RRRR-MM-DD) lub nawet zwykłe pole tekstowe, gdzie możesz zdefiniować własny format daty. Grunt, aby data występowała w każdym rekordzie, więc takie pole powinno być zawsze wypełnione. Najlepiej zadeklarować je jako data DATE NOT NULL.
Kod
<?
$r = gmmktime()-60*60*24*30; // 30 dni do tyłu
$data30 = gmdate("Y",$r)."-".gmdate("m",$r)."-".gmdate("d",$r);
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
$wynik = mysql_select_db("baza",$baza);
if ($wynik) {
mysql_query("DELETE FROM tabela WHERE data<'$data30'",$baza);
}
mysql_close($baza);
}
?>
Pierwsze co musimy zrobić to wyliczyć datę cofniętą o 30 dni. W tym celu można pobrać aktualny znacznik czasu i cofnąć go o określoną liczbę sekund. Liczba sekund dla jednej doby to 60*60*24, więc gdy pomnożymy wynik przez 30 mamy sekundy dla 30 dni wstecz (pamiętaj o odejmowaniu).
Na bazie cofniętego znacznika czasu tworzymy datę w formacie pola DATE z tabeli (RRRR-MM-DD) w zmiennej $data30. Następnie łączymy się z bazą i wykonujemy polecenie DELETE FROM, które kasuje w określonej tabeli rekordy starsze niż 30 dni.
Kasowane rekordy mają mieć pole data mniejsze niż data cofnięta o 30 dni. W ten sposób pozbywamy się starych rekordów w bazie.
Ponieważ nie ma zwykle potrzeby aby operacja kasowania zachodziła stale, można procedurę umieścić w jakimś mniej popularnym dziale lub na stronie, która nie jest zbyt często odwiedzana. W ten sposób przy dużej odwiedzalności serwisu, rekordy nie będą co chwilę kasowane, co przy sporej bazie chwilę trwa i obciąża serwer, jak każda operacja na bazie danych.
Powyższy sposób jest uniwersalny, ale wymaga użycia języka php. Możesz to samo uzyskać za pomocą funkcji MySQL w pytaniu:
Kod
DELETE FROM tabela WHERE data<DATE_SUB(NOW(),INTERVAL 30 DAY);
Usuwa ono wszystkie rekordy, które mają datę starszą niż 30 dni, a więc działa tak samo, jednak na poziomie MySQL. Funkcja DATE_SUB() odejmuje od chwili obecnej NOW() interwał 30 dni. Robi więc to samo, co wykonałem w php.
Możesz też skorzystać z takiej konstrukcji, jeżeli wolisz:
Kod
DELETE FROM tabela WHERE TO_DAYS(NOW())-TO_DAYS(data)>30;
Funkcja TO_DAYS() zwraca liczbę dni od początku kalendarza do chwili obecnej dla NOW() i do chwili pola daty dla data, jeżeli różnica tych dni wynosi więcej niż 30 dni, mamy wyselekcjonowane stare rekordy do usunięcia...
Jak widzisz, sposobów wyliczania okresu (u nas: starych rekordów) może być wiele...