![]() |
![]() |
-Wieviór- |
![]()
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ł? |
|
|
![]() |
![]()
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... |
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 22:50 |