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 biggrin.gif Ma ktoś pomysł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
krzemian
post
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.01.2004
Skąd: Świętochłowice

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


Zainteresuj się Cronem.


--------------------
“Twój czas jest ograniczony, więc nie marnuj go żyjąc tak jak inni. Nie daj się znaleźć w potrzasku przez dogmaty, którymi żyją. Nie ulegaj opiniom, które zagłuszą twój wewnętrzny głos. I najważniejsze, miej odwagę pójść za twoim sercem i intuicją. Wszystko inne jest mniej ważne.”
Steve Jobs
Go to the top of the page
+Quote Post
crash
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

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


A nie łatwiej:
  1. DELETE
  2. FROM jogurt WHERE CURDATE() >= datawaznosci
?


--------------------
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #4





Goście







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
Go to the top of the page
+Quote Post
shima
post
Post #5





Grupa: Zarejestrowani
Postów: 245
Pomógł: 0
Dołączył: 9.09.2002

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


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.


--------------------
Nie ma nic stałego prócz zmiany...
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #6





Goście







No na to też wpadłem shima. No nic myślałem, że jest jakiś sposób. Dzięki za pomoc anyway tongue.gif
Go to the top of the page
+Quote Post
krzemian
post
Post #7





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.01.2004
Skąd: Świętochłowice

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


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.


--------------------
“Twój czas jest ograniczony, więc nie marnuj go żyjąc tak jak inni. Nie daj się znaleźć w potrzasku przez dogmaty, którymi żyją. Nie ulegaj opiniom, które zagłuszą twój wewnętrzny głos. I najważniejsze, miej odwagę pójść za twoim sercem i intuicją. Wszystko inne jest mniej ważne.”
Steve Jobs
Go to the top of the page
+Quote Post
Fixer
post
Post #8





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
jedrus4
post
Post #9





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 6.04.2005
Skąd: Międzyborów

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


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.


--------------------
pozdrawiam
jedrus4
Go to the top of the page
+Quote Post
lorix
post
Post #10





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.04.2005

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


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
Go to the top of the page
+Quote Post
jedrus4
post
Post #11





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 6.04.2005
Skąd: Międzyborów

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


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


--------------------
pozdrawiam
jedrus4
Go to the top of the page
+Quote Post
cudny
post
Post #12





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


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...


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 05:51