Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z odejmowaniem dat
Forum PHP.pl > Forum > Przedszkole
karolusgt
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 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 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
ddiceman
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. ?>
karolusgt
Dzięki śliczne. POMOGŁO smile.gif
vokiel
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. ?>
ddiceman
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
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.