Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Zapytanie, wyświetlenie tylko z danego miesiąca
Forum PHP.pl > Forum > Przedszkole
in5ane
Hi,
chciałem spytać jak zrobić zapytanie, aby pokazywało mi dane tylko z danego miesiąca, a mianowicie jeżeli mamy wrzesień, to żeby wyświetlało tylko dane z września.

  1. <?php
  2. $query = "SELECT * FROM page_news WHERE status = '2' ORDER BY id DESC";
  3. ?>


Datę w bazie mam przykładowo tak: 20.09.2007, 22:42:30 w polu text.


Z góry dziękuję za pomoc.
Daimos
bez sens zapisywac date w postaci tekstowej, jesli juz to int i za pomoca funkcji time(), a jak nie to date mysql wstawic
teraz to musisz rozbijac to za pomoca explode i wogole kupa roboty, serwer nie nadazy
popraw to lepiej, jak zapiszesz date np. za pomoca funkcji time to pozniej mozesz ja wyswietlac w taki sam sposob
in5ane
No i powiedzmy, że teraz mam datę np. taką w bazie w polu INT: 1191302400

I teraz jak mam zrobić, żeby wyświetlić tylko newsy z tego miesiąca, który właśnie jest?
Daimos
przy wyswietlaniu rekordow, sprawdzasz miesiac:
  1. <?
  2. $time='12234234345'; // przyklad ;) tutaj czas z time()
  3. $miesiac = date('m', $time);
  4. if($miesiac==date('m'){ // tutaj sprawdza czy miesiac jest jak bierzący
  5. // wyswietlaj
  6. }
  7. ?>
in5ane
Dzięki smile.gif

@edit: Zrobiłem i trochę nie za bardzo działa tongue.gif

W bazie mam dwa newsy o datach:
1171002000 - 20.10.2007, 07:20:15
oraz
1190265615 - 20.9.2007, 07:20:15

  1. <?php
  2. $query = "SELECT * FROM page_news WHERE status = '2' ORDER BY id DESC LIMIT 10";
  3. $result = mysql_query($query);
  4. $num_rows = mysql_num_rows($result);
  5. $i=1;
  6. while ($row = mysql_fetch_array($result)) {
  7. $miesiac = date('m', $row[data_dodania]);
  8. if($miesiac = date('m')) {
  9. echo '<p>
  10. <strong>'.$row[tytul].'</strong><br />';
  11. echo date('m.d.y, H:i:s', $row[data_dodania]);
  12. echo '<br />Autor: <a href="forum/profile.php?mode=viewprofile&u='.$row[autor].'">'.$row[autor].'</a><br /><br />
  13. <table><tr><td valign="top">
  14. <img src="'.$row[miniaturka].'"></td>
  15. <td valign="top" style="color: #007981; font-size: 10pt; font-family: Verdana;">
  16. '.$row[tresc].'
  17. </td></tr></table>
  18. </p>';
  19. if ($num_rows != $i) {
  20. echo '<br /><hr style="border: none; width: 100%; height: 1px; background-color: #6e7a7b;" /><br />';
  21. }
  22. $i++;
  23. }
  24. }
  25. ?>
Cienki1980
Zamiast sprawdzać datę na poziomie php sprawdzaj ją w poziomie bazy poprzez dobrze stworzone zapytanie.

Skoro masz zapisany timestamp w postaci INT to wykorzystaj coś takiego:
- sprawdzasz jaki masz aktualnie miesiac
- sprawdzasz ile miesiac ma dni
- generujesz znacznik czasu dla 1szego danego miesiaca ( czyli mktime(0,0,0,$miesiac,1,$rok) )
- generujesz znacznik czasu dla ostatniego danego miesiaca
- tworzysz zapytanie do bazy
- wyswietlasz rekordy.
in5ane
Nie bardzo to rozumiem:
- generujesz znacznik czasu dla 1szego danego miesiaca ( czyli mktime(0,0,0,$miesiac,1,$rok) )
- generujesz znacznik czasu dla ostatniego danego miesiaca
Zrobiłem to tak:
  1. <?php
  2. $znacznik1 = mktime(0,0,0,$dni_miesiac,1,date('Y'));
  3. $znacznik2 = mktime(0,0,0,$dni_miesiac,12,date('Y'));
  4. ?>


I druga rzecz, jak z tego stworzyć zapytanie?
Cienki1980
A czego tu nie rozumieć questionmark.gif

Poza faktem, że znaczniki które stworzyłeś to znaczniki pierwszego i dwunastego dnia miesiąca określonego w zmiennej $dni_miesiac.

Zakładając, że miesiąc dostajesz z formularza w postaci cyfr z zakresu 1-12 ( styczeń - grudzień ) i chcesz pokazać newsy z dni od 1 do ostatniego dnia wybranego miesiąca wykonujesz następujące czynności:
- obliczasz znacznik czasu dla pierwszego dnia wybranego miesiąca - czyli mktime" title="Zobacz w manualu PHP" target="_manual // sprawdź jaka jest kolejność parametrów w tej funkcji
- sprawdzasz ile dni ma dany miesiąc - date" title="Zobacz w manualu PHP" target="_manual z odpowiednim parametrem
- wartość z poprzedniego kroku wstawiasz do mktime i obliczasz znacznik czasu ostatniego dnia miesiąca
- tworzymy zapytanie ... skoro data wpisania newsa to też znacznik czasu w postaci INT to po prostu sprawdzasz czy data wpisania newsa jest >= od znacznika_start i czy jest <= od znacznika_stop ... albo jakoś tak tongue.gif ( liczy się zasada a dokładnie wyjdzie w testach ) Działać działa poprawnie bo sam korzystałem tak w jakiejś aplikacj.
Inzabi
Nie wiem po co wyciągasz wszyskie rekordy z bazy, skoro potrzebujesz tylko z danego miesiąca. Mając date w postaci DATETIME
Kod
$miesiac = date('m');
$query = "SELECT * FROM page_news WHERE status = '2'  AND MONTH(datadodania) = $miesiac ORDER BY id DESC LIMIT 10";
in5ane
No coś to nie bardzo działa, popróbuje jednak cienkiego smile.gif
-phpion.com-
Inzabi dobrze prawi! Poczytaj o [url="http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html"MySQL 5.0 Reference Manual :: 11.6 Date and Time Functions[/url]. Wybieranie wszystkich rekordów i sprawdzanie daty w PHP jest po prostu absurdalnie bez sensu...
in5ane
Czy to jest tylko do PHP5 i MySQL5 ?
Bo jeżeli tak, no to jednak będę musiał zrobić tak jak cienki podał.
Inzabi
PHP nie ma nic do zapytań SQL i działa to też na starszych wersjach.
http://dev.mysql.com/doc/refman/4.1/en/dat...#function_month
in5ane
Zrobiłem tak:
  1. <?php
  2. $miesiac = date('m');
  3. $query = "SELECT * FROM page_news WHERE status = '2' AND MONTH(data_dodania) = $miesiac ORDER BY id DESC";
  4. ?>

i nie śmiga.. nic nie pokazuje.

Takie mam daty w bazie:
1191449216 i 1191449093
Inzabi
Pisałem, że to zadziała tylko dla formatu DATE, DATETIME.

W twoim przypadku musisz zrobić konwersję

  1. <?php
  2.  $miesiac = date('m');
  3.  $query = "SELECT * FROM page_news WHERE status = '2' AND MONTH(FROM_UNIXTIME(data_dodania)) = $miesiac ORDER BY id DESC";
  4.  ?>
in5ane
Nadal nie idzie, chociaż teraz wyświetla rekordy, ale wszystkie.
Daty mam takie:
04.10.2007, 00:04:53 - 972086460
21.10.2000, 02:01:00 - 1191449093
Inzabi
Widzę że nie przejrzałeś treści pod linkami, które ci podaliśmy, tam masz wszystko.

To samo co zrobiłeś z MONTH zrób dla YEAR.
in5ane
Dzięki smile.gif
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.