| -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... |
|
|
|
Wieviór Autokasowanie rekordu... 2.03.2005, 19:18:59
krzemian Zainteresuj się Cronem. 2.03.2005, 21:39:55
crash A nie łatwiej:
[SQL] pobierz, plaintext DELETE FRO... 2.03.2005, 21:50:58
Wieviór No ale własnie o to chodzi Crashu że wtedy musiałb... 3.03.2005, 06:02:15
shima Cytat(Wieviór @ 2005-03-03 06:02:15)No ale wł... 3.03.2005, 12:36:08
Wieviór No na to też wpadłem shima. No nic myślałem, że je... 3.03.2005, 16:27:56
krzemian Oczywiście, że jest inny sposób - jak już mówiłem ... 3.03.2005, 17:06:44
jedrus4 Cytat(Fixer @ 2005-03-06 00:14:29)Ponieważ ni... 14.04.2005, 22:26:25
lorix Bez sensu, lepiej to zrobić właśnie przy pierwszym... 15.04.2005, 12:40:05
jedrus4 Cytat(lorix @ 2005-04-15 11:40:05)Jak przez d... 15.04.2005, 12:43:50
cudny Cytat(jedrus4 @ 2005-04-15 11:43:50)Cytat(lor... 15.04.2005, 13:05:02 ![]() ![]() |
|
Aktualny czas: 25.12.2025 - 01:08 |