Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wygaszanie rekordów
kajzur
post
Post #1





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


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ć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
tjaden
post
Post #2





Grupa: Zarejestrowani
Postów: 42
Pomógł: 1
Dołączył: 18.02.2009

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


zamień exec na query
Go to the top of the page
+Quote Post
kajzur
post
Post #3





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


Nic to nie zmieniło..
Go to the top of the page
+Quote Post
vokiel
post
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


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 ;>
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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"
Go to the top of the page
+Quote Post
kajzur
post
Post #8





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


(IMG:http://image.mmazur.info/files/151592.jpg)
Go to the top of the page
+Quote Post
vokiel
post
Post #9





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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;

Go to the top of the page
+Quote Post
kajzur
post
Post #10





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


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





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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ą(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kajzur
post
Post #12





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


Witam, nadal nie działa to, popatrzmy, mam tak spreparowaną baze:
(IMG:http://image.mmazur.info/files/799442.jpg)

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.


(IMG:style_emoticons/default/smile.gif)

Ten post edytował kajzur 18.08.2009, 17:51:25
Go to the top of the page
+Quote Post
vokiel
post
Post #13





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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);

(IMG:http://img43.imageshack.us/img43/6643/tabelac.png)

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

(IMG:http://img26.imageshack.us/img26/9848/wynikid.png)

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

(IMG:http://img22.imageshack.us/img22/3905/updatev.png)

No nie wiem, ale wg mnie wszystko działa prawidłowo...
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 10:37