Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autokasowanie rekordu...
Forum PHP.pl > Forum > Bazy danych > MySQL
Wieviór
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 biggrin.gif Ma ktoś pomysł?
krzemian
Zainteresuj się Cronem.
crash
A nie łatwiej:
  1. DELETE
  2. FROM jogurt WHERE CURDATE() >= datawaznosci
?
Wieviór
No ale własnie o to chodzi Crashu że wtedy musiałbym gzieś to zapytanie zadawać. A ja chcę, żeby baza to robiła automatycznie, bez mojej wiedzy. Polookam co to Cron jak wrócę ze szkoły
shima
Cytat(Wieviór @ 2005-03-03 06:02:15)
No ale własnie o to chodzi Crashu że wtedy musiałbym gzieś to zapytanie zadawać. A ja chcę, żeby baza to robiła automatycznie, bez mojej wiedzy. Polookam co to Cron jak wrócę ze szkoły

Skrypt może być wywoływany w trakcie np. pierwszego w danym dniu ładowania strony.
Wieviór
No na to też wpadłem shima. No nic myślałem, że jest jakiś sposób. Dzięki za pomoc anyway tongue.gif
krzemian
Oczywiście, że jest inny sposób - jak już mówiłem Cron. Tylko że coponiektórzy próbują cię do tego zniechęcić (pewno nieświadomie:) ) poprzez nieumiejętność czytania:

Cytat
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.
Fixer
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...
jedrus4
Cytat(Fixer @ 2005-03-06 00:14:29)
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.

Matko, czy naprawde tak trudno przeczytac co koleg chce naprawde osiagnac?
Przeciez chodzi wlasnie chyba o to, aby nie wywolywac tego przez wywolywanie skryptu gdy uzytkownik wchodzi na strone, ale o OKRESLONEJ GODZINIE CZY OKRESLONEGO DNIA.
Bardzo piekny ten Twoj wywod, ale co jesli nikt przez 2 lata nie wejdzie na strone na ktorej bedzie skrypt kasowania?
Pomyśl waćpan zanim napiszesz.
lorix
Bez sensu, lepiej to zrobić właśnie przy pierwszym odpaleniu strony danego dnia.
Jak przez dwa lata nikt nie wejdzie na strone, to przez te dwa lata będzie odpalane to kasowanie rekordów - po co niepotrzebnie obciążać ? Przecież jak ktoś wejdzie po dwóch latach to rekordy zostaną skasowane i i tak ich nie zobaczy...

Pozdrawiam
jedrus4
Cytat(lorix @ 2005-04-15 11:40:05)
Jak przez dwa lata nikt nie wejdzie na strone, to przez te dwa lata będzie odpalane to kasowanie rekordów - po co niepotrzebnie obciążać ? Przecież jak ktoś wejdzie po dwóch latach to rekordy zostaną skasowane i i tak ich nie zobaczy...

napisze tylko tyle:
buahahahahahahahahhahahahahahahahahahhaha
cudny
Cytat(jedrus4 @ 2005-04-15 11:43:50)
Cytat(lorix @ 2005-04-15 11:40:05)
Jak przez dwa lata nikt nie wejdzie na strone, to przez te dwa lata będzie odpalane to kasowanie rekordów - po co niepotrzebnie obciążać ? Przecież jak ktoś wejdzie po dwóch latach to rekordy zostaną skasowane i i tak ich nie zobaczy...

napisze tylko tyle:
buahahahahahahahahhahahahahahahahahahhaha

Przylaczam sie do twojej wypowiedzi i wspieram cala dusza exclamation.gif!

buuuuahahahaha...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.