Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wygaszanie rekordów
Forum PHP.pl > Forum > PHP
kajzur
Witam,
napisałem skrypt, który docelowo będzie wykonywany przez CRON'a. Ma on za zadanie wygaszanie rekordów w bazie (tj. zmiana statusu na deactive). Wygasznie ma zajść w 2 przypadkach:
  • Gdy ilość będzie równa 0
  • Gdy czas z bazy danych + 10 dni będzie dalej (przejdzie lub będzie równy) od aktualnej daty.


Skrypt wygląda tak, jednak że, nie wygasza aukcji których data przeszła:
  1. include("pdo.php");
  2. $kt = time();
  3. $dane = $pdo -> query("select `date` from `goods` where `status` = 'activ'");
  4. $zmiana = 0;
  5. while($data = $dane->fetch(PDO::FETCH_NUM))
  6. {
  7.  
  8. $zmiana = 0;
  9. if(strtotime($data[0]) + (86400*10) >= $kt )
  10.  
  11. {
  12. $d = $data[0];
  13. $zmiana++;
  14. $zmiana = $pdo->exec("Update `goods` SET `status`='deactive' WHERE `date`='$d'");
  15.  
  16.  
  17. }
  18.  
  19. }

Proszę o pomoc.

PS. Jest jakiś inny sensowny sposób poza CRON'em, a by tego dokonać?
tjaden
zamień exec na query
kajzur
Nic to nie zmieniło..
vokiel
Możesz ewentualnie przy pierwszym wejściu na stronę danego dnia. Jednak cron np o 01:15 będzie bardzo dobrym rozwiązaniem.

Pomijając to, ciekawi mnie po co pobierasz te dane, sprawdzasz i następnie dla każdego oddzielnie robisz update. Nie lepiej rozwiązać to w jednym zapytaniu?

btw: czy goods to ilość?
  1. UPDATE `goods` SET `status`='deactive' WHERE DATE_ADD(`date` INTERVAL 10 DAY)>=CURDATE() OR 'goods'=0

Lub
  1. UPDATE `goods` SET `status`='deactive' WHERE DATEDIFF(`date`,CURDATE())>=10 OR 'goods'=0
kajzur
Oby dwa zapytania nie działają. Data w bazie jest datą dodanie rekordu, ważność rekordu to 10 dni. Rekord na którym robimy testy, został dodany 2009-08-02 00:26:13, więc kończy się 2009-08-12 0:26:13, dziś mamy 13, więc skrypt powinien zmienić status na deactive, jednak tego nie robi ;>
Fifi209
Cytat(kajzur @ 13.08.2009, 12:04:26 ) *
Oby dwa zapytania nie działają. Data w bazie jest datą dodanie rekordu, ważność rekordu to 10 dni. Rekord na którym robimy testy, został dodany 2009-08-02 00:26:13, więc kończy się 2009-08-12 0:26:13, dziś mamy 13, więc skrypt powinien zmienić status na deactive, jednak tego nie robi ;>


Może powiesz w jakim formacie przetrzymujesz ów datę w bazie danych? Bo to jest dość istotne.
wookieb
Nie napiszesz człowiekowi jak krowie na miedzy TO NI W ZĄB sam nie pomyśli.

w Pierwszym zapytaniu powinno być <= a nie >= i ten goods=0 wywal narazie.

P.s. Nie powiedziałeś o co ci chodzi w twoim pierwszym punkcie w słowie "ilosc"
kajzur
vokiel
Najpierw sprawdź co zwracają Ci dane zapytania:

  1. SELECT * FROM `goods` WHERE DATE_ADD(`date` INTERVAL 10 DAY)<=CURDATE() OR 'ilosc'=0;
  2. SELECT * FROM `goods` WHERE DATEDIFF(CURDATE(),`date`)>=10 OR 'ilosc'=0;
  3.  
  4. SELECT * FROM `goods` WHERE DATE_ADD(`date` INTERVAL 10 DAY)<=CURDATE();
  5. SELECT * FROM `goods` WHERE DATEDIFF(CURDATE(),`date`)>=10;

kajzur
vokiel,
1 zapytanie - zwraca wszytkie rekordy.
2 zapytanie - wszystkie rekordy.
3 zapytanie - wydaje się że zwrócił poprawne rekordy.
4 zapytanie - również wydaje się że poprawne rekordy zwrócił.

wookieb, ilosc to pole w bazie danych, które jeśli posiada wartość 0, równiez kwalifikuje się do wygaszenia.
vokiel
Możesz pójść na łatwiznę i zrobić 2 zapytania:
  1. UPDATE `goods` SET `status`='deactive' WHERE DATEDIFF(CURDATE(),`date`)>=10;
  2. UPDATE `goods` SET `status`='deactive' WHERE 'ilosc'=0;

Lub pokusić się o zrobienie joina tabeli z nią samąsmile.gif
kajzur
Witam, nadal nie działa to, popatrzmy, mam tak spreparowaną baze:


Po wykonaniu się tego skrypt, wyłączone powinny być rekordy:
1 - ze względu na ilość
6 - ze względu na datę
natomiast 4 powinien zostać aktywny, lecz skrypt wyłącza wszystkie.


smile.gif
vokiel
Odświeżasz tą wypowiedź i odświeżasz;)

  1. INSERT INTO `goods` (`date`,`ilosc`,`status`,`id`) VALUES
  2. ('2009-08-12 12:28:20',0,'activ',1),
  3. ('2009-08-12 12:28:20',0,'activ',2),
  4. ('2009-06-22 21:23:49',5,'deactive',3),
  5. ('2009-06-22 21:25:30',4,'deactive',4),
  6. ('2009-08-16 00:18:57',13,'activ',5),
  7. ('2009-08-19 15:59:54',20,'deactive',6),
  8. ('2009-07-21 22:36:39',1,'activ',7),
  9. ('2009-08-05 00:26:13',1,'deactive',8);



  1. SELECT * FROM `goods` WHERE DATEDIFF(CURDATE(),`date`)>=10 OR `ilosc`=0;



  1. UPDATE `goods` SET `status`='deactive' WHERE DATEDIFF(CURDATE(),`date`)>=10 OR `ilosc`=0;



No nie wiem, ale wg mnie wszystko działa prawidłowo...
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.