Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Problem z odejmowaniem dat
karolusgt
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.08.2008

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


Witam. Próbowałem stworzyć skrypt, który byłby w stanie pobrać datę ostatniej wiadomości w aktualnościach oraz datę bieżącą. Z tym problemu nie ma (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Problem pojawia się, gdy chcę te daty odjąć od siebie. Generalnie chodzi o to, żeby w menu na stronie przy zakładce "aktualności" pojawiał się jakiś tam znaczek, sygnalizujący że ostatnio coś nowego pojawiło się w aktualnościach. Przykładowo w ciągu 3 dni od ostatniego wpisu w menu przy aktualnościach widniałby jakiś "!", a po upływie 3 dni zniknąłby automatycznie do czasu wprowadzenia nowej wiadomości. Sam algorytm jest chyba prosty, jednak brak mi wiedzy z zakresu php, żeby przeskoczyć odejmowanie dat. Może jakaś mądra duszyczka będzie znała rozwiązanie. Próbowałem też z strtotime ale wychodziły cuda (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Poniżej moje dotychczasowe (skromne) wypociny. Z góry dzięki za pomoc!!!!

<?php

&connection = mysql_connect("xxx", "xxx", "xxx")
or die ("Nie można połączyć się z serwerem");
&db = mysql_select_db("xxx", $connection)
or die ("Nie można wybrać bazy danych");
&query1 = "SELECT max(data) as data FROM komunikaty";
&result = mysql_query(&query1)
or die("Wykonanie zapytania nie powiodło się: ".mysql_error());

while (&row = mysql_fetch_array(&result))
{

&komunikat = &row['data']; /* data wprowadzenia komunikatu*/
&teraz = date('d-m-Y'); /* data obecna*/

if(&teraz-&komunikat <=3) /* czy komunikat jest młodszy/równy niż 3 dni */
{ /* jeśli komunikat jest młodszy/równy niż 3 dni */
/* czyli wyświetl nazwę zakładki z gifem*/
} else { /* w innym przypadku */
/* wyświetl zakładkę bez "!" */
}
}
mysql_close($connection);
?>

PS: Wybaczcie mały chaos w kodzie

Ten post edytował karolusgt 20.11.2008, 23:24:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
ddiceman
post
Post #2





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

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


przekonweruj na unix_timestamp, i dopeiro odejmuj od siebie - roznica to ilosc sekund dzielacych daty. Doba ma 24*60*60 sekund, wiec
  1. <?php
  2. if(   time() - strtotime($pobrana_data_z_bazy) > 3*24*60*60   ){ echo 'data starsza niz 3 dni od teraz'; }
  3.    else{ echo 'data nie jest starsza niz 3 dni od teraz'; }
  4. ?>
Go to the top of the page
+Quote Post
karolusgt
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.08.2008

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


Dzięki śliczne. POMOGŁO (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
vokiel
post
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Cytat(ddiceman @ 21.11.2008, 01:02:39 ) *
przekonweruj na unix_timestamp, i dopeiro odejmuj od siebie - roznica to ilosc sekund dzielacych daty. Doba ma 24*60*60 sekund, wiec
  1. <?php
  2. if(   time() - strtotime($pobrana_data_z_bazy) > 3*24*60*60   ){ echo 'data starsza niz 3 dni od teraz'; }
  3.    else{ echo 'data nie jest starsza niz 3 dni od teraz'; }
  4. ?>


Po co 4 działania mnożenia? Serwer się nudzi? 3*24*60*60 = 259200 i to wystarczy wpisać
A tak w ogóle to po to są funkcje operujące na datach, żeby z nich korzystać. Np:
  1. <?php
  2. echo ($pobrana_data_z_bazy<date('Y-m-d',strtotime('-3 days')))? 'starsza niz 3 dni od teraz' :'nie jest starsza niz 3 dni od teraz';
  3. // '-3 days' jest bardziej czytelna, zrozumiała od 3*24*60*60
  4. // zawsze można wpisać potem np 1 week itd
  5. ?>
Go to the top of the page
+Quote Post
ddiceman
post
Post #5





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

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


vokiel
a ) Masz racje, oczywiscie, ze nie ma sensu 3 mnozen, tylko czy bys latwo zrozumial, jakbym napisal 259 200? Ty zapewne tak, ale piszac wyrazenie w postaci mnozenia myslalem pod katem tych, co tego nie rozumieja.
b ) Porownujesz stringa (bo to wyjdzie z bazy danych) z data. I dobrze. Pod warunkiem, ze jest w formacie malejacych jednostek czasu, np. najpierw rok, potem miesiac (koniecznie z leading zeros), potem dzień itd. Natomiast autor watku dal do zrozumienia, ze date trzyma w formacie ''d-m-Y" (na podstawie linii &teraz = date('d-m-Y'); /* data obecna*/), wiec ten sposob porownywania nie sprawdzi sie: wg niego "02-01-2000" jest pozniej niz "01-02-2000"
c ) Jezeli bawimy sie w optymalizacje, to po co zatrudniac strtotime()? Lepiej mktime() przeciez, ktore nie bedzie musialo analizowac ciagu. Nie bylo moja intencja przedstawienie idealnego rozwiazania a dzialajace i przede wszystkim dydaktyczne

Ten post edytował ddiceman 21.11.2008, 15:51:39
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 17.09.2025 - 11:43