Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][PHP] Data najbliższa obecnej
nitroo
post
Post #1





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


Witam. Chcę napisać skrypt pokazujący urodziny użytkowników, którzy znajdują się bazie.

Pole data_urodzenia w bazie jest typu DATE (czyli np. 2010-01-01).

Napisałem taki kod:

  1. $lacz = lacz_bd();
  2. $lacz->query("SET NAMES 'latin2'");
  3.  
  4. $wynik = $lacz->query("select imie_nazwisko, data_urodzenia from zawodnik_pl order by data_urodzenia desc");
  5. while ($pokaz = $wynik->fetch_assoc())
  6. {
  7. /* Wiek - lata*/
  8. $data_urodzenia = substr($pokaz['data_urodzenia'], 0, 4);
  9. $teraz = date("Y");
  10. $wiek = $teraz-$data_urodzenia;
  11.  
  12. /* Miesiac urodzenia */
  13. $miesiac_nazwa = array (01 => 'stycznia', 02 => 'lutego', 03 => 'marca', 04 => 'kwietnia', 05 => 'maja', 06 => 'czerwca', 07 => 'lipca', 08 => 'sierpnia', 09 => 'wrzeŚnia', 10 => 'paĽdziernika', 11 => 'listopada', 12 => 'grudnia');
  14. $miesiac = substr($pokaz['data_urodzenia'], 5, 2);
  15.  
  16. /* Wyswietlanie urodzin */
  17. print $pokaz['imie_nazwisko'].' - '.$wiek.' lat (miesiac: '.$miesiac_nazwa[$miesiac].')<br />';
  18. }


Problemem jest jeszcze to, iż nie do końca dobrze pokazuje mi nazwy miesięcy... Wyświetla mi tylko w przedostatnim, tj. 19-stym, rekordzie.

Proszę o pomoc smile.gif Nie wiem, jak się zabrać do wyświetlania urodzin użytkownika najbliższej dzisiejszej dacie. Patrzyłem na funkcje mktime, ale nie za dużo wywnioskowałem.
Go to the top of the page
+Quote Post
sadistic_son
post
Post #2





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


zainteresuj się funkcją strtotime. Fantastycznie "obrabia" wszystkie stringi datowe.


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
nitroo
post
Post #3





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


Cytat(sadistic_son @ 8.09.2010, 00:05:27 ) *
zainteresuj się funkcją strtotime. Fantastycznie "obrabia" wszystkie stringi datowe.

Ok, to jest do wyświetlenia daty, ale jak zabrać się za posortowanie użytkowników wg daty najbliższych urodzin?
Go to the top of the page
+Quote Post
Darti
post
Post #4





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


pisane z palca ale ogólnie użyłbym datediff()
  1. SELECT DATEDIFF(DATE_FORMAT(CURDATE(),'%m-%d'),DATE_FORMAT('data_urodzenia','%m-%d')) AS roznica WHERE roznica > 0 ORDER BY roznica LIMIT 1


Ten post edytował Darti 8.09.2010, 08:28:04


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
nitroo
post
Post #5





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


Zrobiłem tak:
  1. SELECT id, imie_nazwisko, DATEDIFF(DATE_FORMAT(CURDATE(),'%m-%d'), DATE_FORMAT('data_urodzenia','%m-%d')) AS roznica FROM zawodnik_pl WHERE roznica > 0 ORDER BY roznica LIMIT 1

i jest Fatal error: Call to a member function fetch_assoc() on a non-object sad.gif

Ten post edytował nitroo 8.09.2010, 09:31:29
Go to the top of the page
+Quote Post
Darti
post
Post #6





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


to jest błąd php a nie mysql ... jak już to mysql_fetch_assoc()


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
nitroo
post
Post #7





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


Zauważyłem w SQL, iż nie wykonuje się DATE_FORMAT('data_urodzenia','%m-%d'), tzn. jest równy NULL, a roznica jest nieznaną klauzurą where.

Ten post edytował nitroo 8.09.2010, 09:31:59
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


1. Nazw pól w bazie nie dajemy w apostrofy
2. Funkcja datediff nie porówna dat w tym formacie
3. Where nie zadziała
Go to the top of the page
+Quote Post
nitroo
post
Post #9





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


Cytat(Pilsener @ 8.09.2010, 11:34:06 ) *
1. Nazw pól w bazie nie dajemy w apostrofy
2. Funkcja datediff nie porówna dat w tym formacie
3. Where nie zadziała

To co mam zrobić?
Go to the top of the page
+Quote Post
Noidea
post
Post #10





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


Konwertuj sobie daty do formatu MMDD. Takie "daty" możesz sobie odejmować, porównywać, sortować, itp.

  1. SELECT DATE_FORMAT( '1966-09-05', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;
  2. SELECT DATE_FORMAT( '1972-09-08', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;
  3. SELECT DATE_FORMAT( '1986-09-13', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;


--------------------
Go to the top of the page
+Quote Post
Pilsener
post
Post #11





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat(nitroo @ 8.09.2010, 10:16:15 ) *
To co mam zrobić?


Myśleć i korzystać z netu.

1. Podstawy składni SQL, nazwy pół dajemy albo bez niczego, typu select nazwa_pola albo w `` select `nazwa_pola` (taki piksel pod tyldą), jak dajesz funkdji date_format string typu 'blablabla' to chyba oczywiste, że nie zamieni tego na datę?
2. A jakiego formatu może oczekiwać datediff jak w bazie masz datę w formacie rrrr-mm-dd? Format mm-dd raczej nie zadziała i funkcja zwróci błąd lub wartość zero, musisz dodać rok.
http://dev.mysql.com/doc/refman/5.1/en/dat...nction_datediff
3. Zamiast where użyj having.
Go to the top of the page
+Quote Post
nitroo
post
Post #12





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 10.02.2008

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


A jak poradzić sobie w końcu z tymi nazwami miesiąca i dlaczego napisany przeze mnei sposób nie działa?

Jestem początkującym programistą i naprawdę nie mam zielonego pojęcia, jak poprawnie ma wyglądać to zapytanie SQL. Próbowałem różnymi metodami, ale przy DATEDIFF bierze mi pod uwagę rok, przez co źle oblicza mi osobę, która ma najbliższe urodziny. Może mi ktoś pomóc?

Ten post edytował nitroo 9.09.2010, 10:18:06
Go to the top of the page
+Quote Post
nitro11
post
Post #13





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 30.08.2010

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


Dużo ciekawych rzeczy:

  1. http://www.bigresource.com/PHP-Search-Members-By-Birthday-dRE0oo8w.html#related
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 03:37