Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kasowanie rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
monika0021
Cześć:)

problem przedstawia się następująco:

Z bazy, po upływie określonego terminu, mają się automatycznie wykasować nieaktualne rekordy. Niestety, to nie działa. Zamiast usuwania tylko tych rekordów, które przekroczyły określoną datę, usuwają się wszystkie rekordy wpisane dzisiaj ( tylko) do bazy i pojawia się komunikat:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource on line 25 - ( nr linii z pętlą while)

Po wpisaniu na nowo do bazy rekordów, w których termin ważności jeszcze nie upłynął, warning się nie pojawia i wszystko działa ok, do momentu, kiedy w bazie zostanie wpisany rekord "przedawniony". Wtedy znowu wszystkie dzisaj wpisane rekordy są usuwane.

Gdzie jest bład?
kod:
  1. <?php
  2. mysql_connect ("host", "user", "password") or
  3.  die ("Nie można połączyć się z MySQL");
  4. mysql_select_db ("db") or
  5.  die ("Nie można połączyć się z bazą danych");
  6.  
  7.  $query = "SELECT * FROM tabela WHERE rok IS NOT NULL" ;
  8.  $wynik = mysql_query($query) or die (mysql_error());
  9.  
  10. while ($rekord = mysql_fetch_assoc ($wynik)) {
  11.  $rok = $rekord['rok']; // pole w bazie typ varchar(4)
  12. $mies = $rekord['mies']; // pole w bazie typ char(2)
  13. $dzien = $rekord['dzien']; // pole w bazie typ char(2)
  14.  
  15.  
  16. if ($rok && $mies && $dzien) {
  17. $dzien=$dzien+1; //data kasowania 
  18. $timestamp = strtotime($rok."-".$mies."-".$dzien);
  19. $kasuj=date("Y-m-d", $timestamp);
  20.  
  21.  if (date("Y-m-d")>=$kasuj) {
  22. $query = "DELETE FROM tabela WHERE CURDATE() >='".$kasuj."' AND rok IS NOT NULL";
  23.  
  24. $wynik = mysql_query($query) or die (mysql_error());
  25.  
  26. print "Rekordy nieaktualne skasowano"; 
  27.  }
  28. }
  29. }
  30. ?>
nocnyMark()
dla czego nie trzymasz daty w polu date ?
masz wtedy mozliwosc uzywania funkcji z mysql

jezeli zamiast trzech pol, mies, rok i dzien, bedziesz miala pole typu date

mozesz skasowac rekordy uzywajac np zapytania:

  1. DELETE
  2. FROM tabela
  3. WHERE data<CURDATE() - INTERVAL 2 MONTH


powyzsze zapytanie kasuje rekordy w ktorych w pole data sa wpisane daty starsze niz 2 miesiace od dnia dzisiejszego

poczytaj w mysql manualu:
http://dev.mysql.com/doc/refman/5.0/en/dat...-functions.html

skrypt dzieki temu zabiegowi uprosci sie mocno
monika0021
Cofam moją poprzednią odpowiedź ( o ile do ciebie doszła), masz rację, o ile w polu date umieszczę datę terminu ważności rekordu, to rzeczywiście będzie prościej

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