ďťż

[PHP] Najbliższe urodziny poszukuje spryptu lub wskazówek :p ...

       

Podstrony


telcocafe

Witam!
Poszukuję spryptu który dał by daki efekt:


Najblizsze urodziny:
10-10-2006
obchodzi Kuba
Pozostalo: 111 dni


Szukałem, bezskutecznie :/
Najlepiej bez bazy danych, jeśli możecie to dajcie chociaż jakieś wskazówki jak to zrobić.
przykład można zobaczyć na http://www.grupa3.pl/



napisz se sam jak ci takowy potrzebny

wykozystasz do tego funkcje date() i operatory matematyczne

powodzenia!

Dam wskazówki
* przykład 1 (PHP)
1. pobierasz date urodzin ludzika i zamieniasz ją np. na timestamp (zmienna $a)
2. pobierasz dzisiejszą datę i zamienaisz ja na timestamp (zmienna $B)
3. obliczasz różnice $a - $b, jeśli jest większa od 0 znaczy ze urodziny ludika dopiero będą. (zmienna $roznica)
4. zamieniasz zmienna $roznica na ilosc dni i masz to co chciales :)

* przyklad 2 (MySQL 4.1)
1. czytasz http://dev.mysql.com...-functions.html
2. korzystasz z DATEDIFF


Dam wskazówki
* przykład 1 (PHP)
1. pobierasz date urodzin ludzika i zamieniasz ją np. na timestamp (zmienna $a)
2. pobierasz dzisiejszą datę i zamienaisz ja na timestamp (zmienna $B)
3. obliczasz różnice $a - $b, jeśli jest większa od 0 znaczy ze urodziny ludika dopiero będą. (zmienna $roznica)
4. zamieniasz zmienna $roznica na ilosc dni i masz to co chciales :)

* przyklad 2 (MySQL 4.1)
1. czytasz http://dev.mysql.com...-functions.html
2. korzystasz z DATEDIFF



Tak na wstępnie wyjaśnię, że piszę post pod postem, bo chcę zwrócić uwagę na ten temat, a nie tworzyć nowego tematu.
Mam pewnien problem, bo nie wiem jak zmienić datę na ten timestamp .
Czytałem artykuł tutaj, ale nic mi to nie dało. Nadal nie wiem jak się za to zabrać :( .


Tak na wstępnie wyjaśnię, że piszę post pod postem, bo chcę zwrócić uwagę na ten temat, a nie tworzyć nowego tematu.
Mam pewnien problem, bo nie wiem jak zmienić datę na ten timestamp .
Czytałem artykuł tutaj, ale nic mi to nie dało. Nadal nie wiem jak się za to zabrać :( .


Jak nie możesz tą metoda to spróbuj tak (zakładam ,że masz w tabeli zapisane oddzielnie dzień i miesiąc):
najpierw pobierasz te dane i przypisujesz do zmiennych ,następnie pobierasz poprzez funkcję date aktualny miesiąc i dzień , teraz sprawdzasz czy miesiąc jest ten sam ,jak tak to sprawdzasz czy ten sam dzień jesli tak to urodziny są dziś jak nie to urodziny są za tyle dni ile wynosi róznica pomiędzy dniem urodzin ,a dniem aktualnym...

Jeśli miesiące sie nie zgadzają (znaczy jest powiedzmy miesiąc przed urodzinami) wtedy: sprawdzasz czy rok jest przestępny czy nie (działaniem modulo) następnie robisz sobie tablicę miesięcy według wzoru $rok[numer miesiąca] = 'ilość dni'; uwzględniając czy rok jest przestępny czy nie ;) Następnie za pomoca pętli zaczynajac od miesiąca aktualnego sumujesz dni (wykorzystując tablicę) dopóki liczba miesiąca nie bedzie mniejsza od liczby miesiąca urodzin... A jak owa pętla się skończy wtedy dodajesz do całego wyniku wartość absolutną z różnicy dnia urodzin i dnia aktualnego :) Trochę na około ale powinno działać :D


Dzięki za pomoc, ale trochę to zagmatwane, tzn. rozumiem jak to zrobić, lecz niezbyt to funkcjonalne ;) . Chciałem, aby kod wykonał się szybko :) . Może jakieś inne propozycje?


Ekhm... a myślisz ,że te wszystkie przetwarzania na timestampy itd. to nie zabierają czasu na obliczenia ? Po prostu w pierwszym wypadku wykorzystujesz wbudowaną funkcję ,a w drugim piszesz coś na wzór tej funkcji :P Zresztą IMHO te kilka if-ów i petla zbytnio nie obciąża serwera ;) To nie jest jakiś skomplikowany skrypt gdzie trzeba się w optymalizacje bawić ;)

Piszę post pod postem, aby zwrcić uwagę na temat, a nie tworzyć nowego ;) (ryzykuję ostrzeżeniem :P ). Może mi ktoś pomóc w tym kodzie na górze? Albo podać jakiś bardziej optymalny pomysł ^_^ ?

No to dobra nie wiem skąd chcesz brać daty urodzin userów ale o ty mza chwile:

<?php function daysToBirthday($data){      $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970      $diff = time() - $born;  //obliczamy różnice między obecną datą a datą urodzin      return $diff/(3600*24); //zmiana sekund na dni }?>

Funkcja time() zwraca liczbę sekund, która upłynęła od 1 stycznia 1970 do teraz (tzw. uniksowy znacznik czasu).

Mając tę funkcję możemy spokojnie sprawdzać ile kto ma dni do urodzin np.
<?php daysToBirthday('10-02-2004'); ?>

Teraz załóżmy, że dane przechowywane są w pliku o takim formacie
imie,data imie,data
Zakładam, że data jest przechowywana w formacie czytelnym dla użytkownika, a nie jako znacznik czasu. Tak łatwiej się wpisuje ręcznie. Gdyby było inaczej trzeba byłoby zmodyfikować powyższą funkcję (usunęli byśmy linie z $born = ... i $ born w drugiej zmienilibyśmy na $data).

Przykładowy plik
asd,20-02-2004 Artur,  10-01-1900

Kod
<?php $lines = file('urodziny.txt'); $min = 1000; $minName = ''; foreach($lines as $line){    list($name, $date) = explode(',',$line);    $days = daysToBirthday($date);    if($days < $max){          $min = $days;          $minName = $name;    } } echo 'Najwczesniej urodziny ma '.$minName.' bedzie to za '.$min.' dni.'; ?>

Jejku! Bardzo dziękuję :) .

PS. Nie miałem zamiaru pobierać daty urodzenia od userów. Skrypt miał pokazywać ilość dni do urodzin kilku moich znajomych (przy każdym odświeżaniu ma się pokazywać inna data). Ale za ten kod również bardzo dziękuję. Może się przyda ;) .

A jednak coś nie gra :( :
<?php function daysToBirthday($data){     $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970     $diff = time() - $born;  //obliczamy różnice między obecną datą a datą urodzin     return $diff/(3600*24); //zmiana sekund na dni } $lines = file('urodziny.txt'); $min = 100;    <-------------------------------------tutaj dałem na max $minName = ''; foreach($lines as $line){   list($name, $date) = explode(',',$line);   $days = daysToBirthday($date);   if($days < $max){         $min = $days;         $minName = $name;   } } echo 'Najwczesniej urodziny ma '.$minName.' bedzie to za '.$min.' dni.'; ?>
http://ekspert.freeh...pl/urodziny.php

Ponadtto wyniki wychodż dziwne np. -3318.090787037
Użytkownik rys.marcin edytował ten post 26 czerwiec 2006, 20:29
No wziąłeś zbyt wczesną datę:D (a nie to ja wziąłem, sorki:D) strtotime zwykle obsługuje najwcześniej od 13 grudnia 1901 20:45:54.

poza tym jest błąd :P podając datę urodzin obliczamy ile ktoś ma lat :P
Zmiana do funkcji:

function daysToBirthday($data){    $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970    $m = date('m', $born);    $d  = date('d', $born);    $y = date('Y');    $born = strtotime($d.'-'.$m.'-'.$y);    $diff = $born - $time;  //obliczamy różnice między obecną datą a datą urodzin    if($diff < 0)$diff += 3600*24*365;    if(($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0)$diff+=3600*24;    return $diff/(3600*24); //zmiana sekund na dni }

Nie jest to najładniejsze wyjście, ale nie chce mi sie kombinować:P

Nadal coś nie działa. Nie ma zdefiniowanej $max.
Wyskakuje mi tutaj tylko wartość zmiennej min.
<?php function daysToBirthday($data){   $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970   $m = date('m', $born);   $d  = date('d', $born);   $y = date('Y');   $born = strtotime($d.'-'.$m.'-'.$y);   $diff = $born - $time;  //obliczamy różnice między obecną datą a datą urodzin   if($diff < 0)$diff += 3600*24*365;   if(($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0)$diff+=3600*24;   return $diff/(3600*24); //zmiana sekund na dni } $lines = file('urodziny.txt'); $min = 100; $minName = ''; foreach($lines as $line){  list($name, $date) = explode(',',$line);  $days = daysToBirthday($date);  if($days < $max){        $min = $days;        $minName = $name;  } } echo 'Najwczesniej urodziny ma '.$minName.' bedzie to za '.$min.' dni.'; ?>


Nadal coś nie działa. Nie ma zdefiniowanej $max.



No fakt nie zauważyłem, zmień $max na $min i bedzie ok

<?php function daysToBirthday($data){  $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970  $m = date('m', $born);  $d  = date('d', $born);  $y = date('Y');  $born = strtotime($d.'-'.$m.'-'.$y);  $diff = $born - time();  //obliczamy różnice między obecną datą a datą urodzin  if($diff < 0)$diff += 3600*24*365;  if(($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0)$diff+=3600*24;  return (int)($diff/(3600*24)); //zmiana sekund na dni } $lines = file('urodziny.txt'); $min = 100; $minName = ''; foreach($lines as $line){ list($name, $date) = explode(',',$line); $days = daysToBirthday($date); if($days < $min){       $min = $days;       $minName = $name; } } echo 'Najwczesniej urodziny ma '.$minName.' bedzie to za '.$min.' dni.'; ?>

Tu już mam nadzieje nie ma błędów :D

Kurcze, ciężki orzech do zgryzienia :D . Nadal nie działa...
http://www.ekspert.freehost.pl/uro.php


<?php function daysToBirthday($data){  $born = strtotime($data); //zmieniamy datę urodzin na liczbe sekund od 1 stycznia 1970  $m = date('m', $born);  $d  = date('d', $born);  $y = date('Y');  $born = strtotime($d.'-'.$m.'-'.$y);  $diff = $born - time();  //obliczamy różnice między obecną datą a datą urodzin  if($diff < 0)$diff += 3600*24*365;  if(($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0)$diff+=3600*24;  return (int)($diff/(3600*24)); //zmiana sekund na dni } $lines = file('urodziny.txt'); $min = 100; $minName = ''; foreach($lines as $line){ list($name, $date) = explode(',',$line); $days = daysToBirthday($date); if($days < $min){       $min = $days;       $minName = $name; } } echo 'Najwczesniej urodziny ma '.$minName.' bedzie to za '.$min.' dni.'; ?>

Tu już mam nadzieje nie ma błędów :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.