Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z zapytaniem mysql
Forum PHP.pl > Forum > Przedszkole
Savail
Witam
Napisalem sobie skrypt rejestracji, gdzie zapisuje w pewnym polu wartosc z "time()+60"(to jest termin). Chcialem tez napisac skrypt ktory bedzie usuwal wszystkie dany o uzytkowniku (caly rzad) jesli nie kliknie w link aktywacyjny w okreslonym czasie.Oto aktualny skrypt:
  1. <?php
  2. mysql_connect('', '', '');
  3. $czas = time();
  4. $zapytanie = "select `termin` from `uzytkownicy`";
  5. $idz = mysql_query($zapytanie) or die(mysql_error());
  6. while($wiersz = mysql_fetch_row($idz)){
  7. $ile = count($wiersz);
  8. for($i=0; $i<$ile; $i++){
  9. echo $wiersz[$i];
  10. if($czas>$wiersz[$i]){
  11. $zapytanie2 = 'delete from `uzytkownicy` where `termin`<$czas';
  12. $idz2 = mysql_query($zapytanie2);
  13. }
  14. else{
  15. echo "nie ma nic do skasowania";
  16. }
  17. }
  18. }
  19. ?>

Z tego co widac w kodzie mozna wywnioskowac ze mam problem z usunieciem wybranych rzedow. Chodzi mi glownie o
  1. $zapytanie2 = 'delete from `uzytkownicy` where `termin`<$czas';

Jak skonstruowac te zapytanie aby usuwalo rzedy tam gdzie $czas jest wieksza od pojedynczych (nie zsumowanych) wartosci w kolumnie termin?
Mam nadzieje ze dobrze wyjasnilem problem ;p. Bede ogromnie wdzieczny za kazda pomoc.
PS. wartosci `termin` to sa wlasnie "time()+60"
smietek
  1. DELETE FROM `tabela` WHERE `termin` < UNIX_TIMESTAMP();

Usuwa każdy rekord, który w polu termin ma wartość mniejszą, niż aktualny znacznik czasu.
croc
Przede wszystkim zmienną do zapytania musisz wrzucić tak, by PHP potraktowało ją jak zmienną. Na chwilę obecną porównujesz pole termin z ciągiem znaków $czas. Czyli zrób tak:

  1. $zapytanie2 = 'delete from `uzytkownicy` where `termin` < \'' . $czas . '\'';


Jakiego typu polem jest pole termin? DATETIME, DATE czy INT?
Savail
Wielkie dzieki za odpowiedz, niestety narazie serwer jest nieczynny i spr. wasze odpowiedzi bede mogl pozniej... Croco `termin` ma typ CHAR tongue.gif, po to zebym mogl wstawic wartosc 'ok' jesli uzytkownik juz kliknal w link aktywacyjny. Mozliwe ze moja metoda jest niepoprawna
smietek
To lepiej zrób sobie to pole jako INT(10) i gdy użytkownik aktywuje konto ustaw jego wartość na 0. Nie opłaca się stosować pól dla znaków alfanumerycznych, gdy praktycznie korzystasz tylko z liczb.
Savail
ale gdy wartosc bedzie wynosic 0 to skrypt wykasuje dane o uzytkowniku
smietek
No to ustaw to na 1. Przecież nigdy nie osiągniesz znacznika czasu o wartości 1, musiałbyś się cofnąć w czasie!
Savail
ok, dziala dzieki wam obu za pomoc ^^

a tak przy okazji, zadam pytanie odnosnie time(). Czy 1 jednostka time() odpowiada jednej skundzie w rzeczywistosci?
croc
A nie lepiej zrobić pole typu DATETIME i wstawiać null kiedy jest już aktywny?

Chociaż ja o tak zdecydowałbym się chyba na dwie osobne tabele i po aktywacji konta kopiował część danych do drugiej tabeli. Na pewno aktywni użytkownicy posiadają więcej danych niż nieaktywni, tj. jakieś związane z aktywnością na stronie itd.

Tak, w time() 1 jednostka to 1 sekunda.
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.