Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Autokasowanie rekordu..., ...gdy data 'xx' nastąpi
-Wieviór-
post
Post #1





Goście







Tabela 'jogurt'
Kod
id | nazwa | producent | dataprodukcji | datawaznosci
--------------------------------------------------------------
0 | Naturalny | Danone | 2005-03-02 | 2005-03-05
1 | Megajogurt | Bakoma | 2005-03-01 | 2005-03-07


I teraz chcę by rekord kasował się w momencie, gdy data ważności będzie dzisiejszą datą. Czy Naturalny danona w sobotę się sam usunie.

Oczywiscie można napisać skrypt, który najpierw wyczyta dane z bazy, potem zobaczy te, których data ważności jest taka jak data dzisiejsza, ale wiąże się to z tym, że każdego dnia trzeba będzie wchodzić na stronę z tym skryptem.

Można to jakoś zrobić przez mySQL? Napewno można (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Ma ktoś pomysł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Fixer
post
Post #2





Grupa: Zarejestrowani
Postów: 123
Pomógł: 0
Dołączył: 24.10.2004
Skąd: TG

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 22:50