Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem - daty urodzenia uzytkownikow w bazie
Forum PHP.pl > Forum > Bazy danych > MySQL
shycat
Witam, pisze sobie serwis spolecznosciowy w PHP + MySQL. W jednej z tabel bazy danych trzymam dane takie jak imie, miejsce zamieszknia, wiek itp... raczej standardowe pierdoly. Date urodzenia zapisuje w formie 020485 - dla kogos kto urodzil sie 2 kwietnia 1989 roku... do sprawdzenia ile kto ma lat napisalem sobie mala, funkcje

  1. <?php
  2. function wiek($wiek)
  3. {
  4.  $d_wiek=$wiek{0}.$wiek{1};
  5.  $m_wiek=$wiek{2}.$wiek{3};
  6.  $r_wiek=&#092;"19\".$wiek{4}.$wiek{5};
  7.  
  8.  $r_jest=date(Y);
  9.  $m_jest=date(m);
  10.  $d_jest=date(d);
  11.  
  12.  $lat=$r_jest-$r_wiek;
  13.  
  14.  if ($m_wiek>$m_jest) $lat=$lat-1;
  15.  else if ($m_wiek==$m_jest)
  16.  {
  17.    if ($d_wiek > $d_jest)
  18.      $lat=$lat-1;
  19.  }
  20.  
  21.  return &#092;"$lat\";
  22. }
  23. ?>


Dziala ona ok jezeli odczytuje z bazy danych rekord (wiek) i "wtłaczam" go do mojej funkcji... problem pojawil sie kiedy chce napisac wyszukiwarke uzytkownikow - tez standardowa sprawa jak wszedzie, plec, przedzial wiekowy, miasto itp... no i z wspomnianym przedzialem wiekowym mam problem, mianowicie chcialem uzyc BETWEEN'a ale jak mam to zrobic skoro nie moge okreslic przedzialu... rozwiazaniem niby byloby zmienienie formanu dzien-miesiac-rok na rok ... wtedy nie byloby problemu, ale mi chodzi o to, zeby data byla dokladna... po kilku godzinach wpadlem na pomysl, zeby date urodzenia zapisywac w sekundach od poczatku ery unixowej z zaokragleniem do dni, no ale tu pojawia sie problem jezeli ktos urodzin sie przed era unixowa... chyba, ze jezeli ktos urodzil sie przed rokiem '70 wpisac wartosc na minusie (-), lecz nie wiem czy to dobre rozwiazanie... nie prosze tutaj o jakies gotowe rozwiazanie ale jakis ew. nowy pomysl... wiadomo, co dwie glowy to nie jedna, bycmoze za bardzo skupilem sie na jednym rozwiazaniu a jest inne, duzo prostrze... czekam na odpowiedz(i) i pozdrawiam serdecznie smile.gif
vokiel
W Twoim przypadku nie odróżnisz kogoś urodzonego w 1909 od tego urodzonego w 2009.
Od zapisywania dat jest format daty.
  1. <?php
  2. $data = date('Y-m-d'); // 2009-06-29
  3. $lat_18 = date('Y-m-d', strtotime('-18 years'));
  4. $pelnoletni = "SELECT * FROM USERS WHERE `DATA_URODZENIA`<'".$lat_18."' ;";
  5. ?>

Poza tym do zadań na bazie dobrze zainteresowac się wbudowanymi w MySQL'a funkcjami daty
Ważną funkcją w Twoim przypadku może być DATEDIFF

Przede wszystkim korzystaj z typów dedykowanych, nie rób takich szopek, bo za pół roku sam będziez miał problem zrozumieć o co chodzi w tym kodzie.
shycat
"W Twoim przypadku nie odróżnisz kogoś urodzonego w 1909 od tego urodzonego w 2009" -> Tak, wiek, ale zalozylem, ze najstarszy uzytkownik bedzie mial 80 lat - i tylko do tego wieku mozna sie zarejestrowac... wiec tu problemu nie ma, nie bardzo rozumiem to co mi podales, to sa funkcje, mi zalezalo na sposobie zaposu, ktory moglbym potem "betweenowac" ... no ale przeczytam dokladnie to co mi podales, moze moje spojrzenie sie zmieni... a co do "korzystaj z typów dedykowanych, nie rób takich szopek" -> nie bardzo rozumiem co to sa typy dedykowane... moze jakis maly przykladzik kodu? bo moze uzywam tego ale nie wiem, ze tak sie to nazywa winksmiley.jpg
maly_swd
W MySql masz typ Date, ktory idalnie nadaje sie do przechowywania daty w formacie rrrr-mm-dd i na tych polach mozesz operowac wbudowanymi funkcjami do dat (co bardzo ulatwia zycie). A po stronie php mozesz sobie to konwertowac do dd-mm-rr
vokiel
W MySQL możesz przechowywać datę w wielu formatach. Równie dobrze YYYY-MM-DD jak i DD-MM-YYYY. Gotowe funkcje do obsługi dat pomagają przy wyliczaniu różnicy dni, lat, sekund. Dają możliwość wybrania dat z przedziału, wybrania dat z przedziału w którym podaje się tylko rok, brania pod uwagę samego roku z daty etc. Na prawdę jest się czym pobawić.

Odnośnie szopek (taka metafora), miałem na myśli funkcję którą pokazałeś. Za pół roku jak do niej zajrzysz stracisz pół godziny zanim przypomnisz sobie co i jak ona robi. A jak użyjesz np datediff to od razu wiesz. Poza tym masz duuuuzo mniej kodu, i nawet jak ktoś po Tobie będzie musiał poprawiać (a może i szczególnie) bez problemu sobie poradzi.
shycat
Witam ok, dzieki Panowie za wyjasnienie. Uzyje ten funkcji do obslugi dat. Jak juz napisze co mam napisac to umieszcze tutaj kodzik - moze sie kiedys przyda jakiemus zblakanemu googlo'serczowi smile.gif Pozdrawiam.
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-2024 Invision Power Services, Inc.