Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlanie danych z tabeli
Forum PHP.pl > Forum > Przedszkole
m_09
Witam,

Mam problem z wyświetleniem danych z tabeli, chciałbym żeby dane na stronie z tabeli produkty, która ma następujące kolumny

ID | Produknt | cena | data dodania | dział | wartosc

zostały wyświetlone w następujący sposób:

Produkty | styczeń | Luty | marzec itd...
---------------------------------------
żywność | 350 | 400 | 213
---------------------------------------
rozrywka | 50 |333 | 20

mam na razie zrobione coś takiego ale nie wiem jak rozbić to na poszczególne miesiace, tzn wiem ale nie wiem jak to zrobić żeby było to wyświetlane w formie tabeli i żeby w przypadku gdy w danym miesiącu nie było danego wydatku nie było wyświetlane nic.

  1. $res = $mysqli->query("SELECT SUM(cena) AS suma, dzial FROM products WHERE wartosc='ujemna' GROUP BY dzial");
  2.  
  3. while ($row = $res->fetch_assoc()){
  4.  
  5. echo $row['dzial'] . " - " . $row['suma'] . " zł<br>";
  6. }


Z góry dzięki za pomoc smile.gif
nospor
Pierwszy blad jaki masz a ktory robia wszyscy na poczatku:
pobierasz dane z tabeli i od razu je chcesz wyswietlac.
Lepiej jest pobrac dane, przygotowac jak nalezy a dopiero potem wyswietlac. W tym przypadku przygotowanie jak nalezy to:
stworzenie tablicy z produktami gdzie kazdu produkt ma jeszcze tablice z miesiacami i wartosciami dla kazdego miesiaca

Po drugie: twojemu zapytaniu brakujesz grupowania po miesiacu by miec od razu wartosci dla danego produktu dla danego miesiaca.
m_09
Dzięki za nakierowanie, zrobiłem coś takiego ale nie wiem jak zrobić żeby do tablicy tej ze wszystkimi działami były dopisywane wartości, a tam gdzie w danym miesiącu nie ma żadnej wartości była pomijana
chodzi mi żeby do wybranego produktu była dopisana wartość tego produktu z tej tabeli products

  1. $res1 = $mysqli->query("SELECT * FROM dzial");
  2.  
  3. while ($row = $res1->fetch_assoc()){
  4.  
  5. $dzial[] = $row['dzialy'];
  6. }
  7.  
  8.  
  9.  
  10. for($i = 1 ; $i <= 9; $i++){
  11.  
  12. $res = $mysqli->query("SELECT SUM(cena) AS suma, dzial FROM products WHERE add_data LIKE '2018-0".$i."-%' AND wartosc='ujemna' GROUP BY dzial");
  13.  
  14. while ($row = $res->fetch_assoc()){
  15.  
  16. echo $row['dzial'] . " - " . $row['suma'] . " zł<br>";
  17. }
  18.  
  19.  
  20. }
  21.  
nospor
Zacznij od poprawy zapytania. Nie po to ci pisalem ze brakuje grupowania po miesiacu bys to calkowicie olal.
Ma byc jedno zapytanie na pobranie danych a nie tyle zapytan ile miesiecy. Pisz optymalnie. Mowilem, ze procz grupowania po dzial ma byc tez grupowanie po miesiacu. To zalatwi problem pobrania danych
m_09
Okej, zapytanie mam już chyba poprawne, mógłbyś nakierować mnie jeszcze jak to dobrze zrobić, żeby efekt wyświetlania był taki jak podałem? Próbuję zrobić coś takiego ale nie wiem czy nie da się tego zrobić jakoś w prostszy sposób

  1. $res = $mysqli->query("SELECT SUM(cena) AS suma, dzial, add_data FROM products WHERE wartosc='ujemna' GROUP BY dzial, EXTRACT(YEAR_MONTH FROM add_data) ASC");
  2.  
  3. while ($row = $res->fetch_assoc()){
  4.  
  5. $data = substr($row['add_data'], 5, 2);
  6.  
  7.  
  8. if($data == "01"){
  9.  
  10. $miesiace = Array(
  11. 'styczen' => array($row['dzial'] => $row['suma']),
  12. );
  13. }
  14.  
  15.  
  16.  
  17. }
nospor
1) Dat nie rozdzielaj przez substring... Od tego masz funkcje do dat, np. date()
2) W tablicy nie potrzebujesz trzymac STYCZEN. 01 jest w porzadku

Mniej wiecej cos takiego
  1.  
  2. $dane = [];
  3. while ($row = $res->fetch_assoc()){
  4.  
  5. $miesiac = 'Tutaj miesiac numeryczny. Tym razem uzyj date()';
  6.  
  7. $dane[$row['dzial']][$miesiac] = $row['suma'];
  8.  
  9.  
  10. }
  11.  

Tak na szybko pisane.
m_09
Mam jeszcze dwa pytanie:

Mówiłeś, żeby wyświetlać datę za pomocą date() ale jak używam poniższego kodu to wyświetla mi tylko 01, co jest nie tak?
i jak mogę dopasować, żeby do danego miesiąca zostały dopisywane wartości z tego samego miesiąca? próbowałem zrobić to za pomocą if ale chyba tak się nie da.

  1. while ($row = $res->fetch_assoc()){
  2.  
  3. //$miesiac = substr($row['add_data'], 5, 2);
  4.  
  5. $miesiac = $row['add_data'];
  6. $miesiac = date("m", $miesiac);
  7.  
  8. $dane[$row['dzial']][$miesiac] = $row['suma'];
  9.  
  10. }
  11.  
  12. echo "<table border='1'><tr>
  13. <td>produkty</td>
  14. <td>Styczeń</td>
  15. <td>Luty</td>
  16. <td>Marzec</td>
  17. <td>Kwiecień</td>
  18. <td>Maj</td>
  19. <td>Czerwiec</td>
  20. <td>Lipiec</td>
  21. <td>Sierpień</td>
  22. <td>Wrzesień</td>
  23. <td>Październik</td>
  24. <td>Listopad</td>
  25. <td>Grudzień</td>
  26. </tr>";
  27.  
  28. foreach ($dane as $klucz => $wartosc){
  29. echo "<tr><td>" . $klucz . "</td>";
  30.  
  31. foreach($wartosc as $mie => $ile){
  32.  
  33. if($mie == "01") { echo "<td>" . $ile . "</td>"; } else {"<td></td>";};
  34.  
  35. };
  36.  
  37. echo "</tr>";
  38.  
  39. };
nospor
Cytat
Mówiłeś, żeby wyświetlać datę za pomocą date() ale jak używam poniższego kodu to wyświetla mi tylko 01, co jest nie tak?

No skoro dajesz tylko date('m') to co sie dziwisz ze masz tylko miesiac? Chcesz cos wiecej, to masz dodac co wiecej. Wszystko masz w dokumentacji.
m_09
Cytat(nospor @ 17.07.2018, 16:09:55 ) *
No skoro dajesz tylko date('m') to co sie dziwisz ze masz tylko miesiac? Chcesz cos wiecej, to masz dodac co wiecej. Wszystko masz w dokumentacji.


Właśnie to jest dobrze, że jest tylko miesiąc, chodzi mi, że wyświetla tylko styczeń i tylko ten jeden miesiac
nospor
No bo dales warunek na miesiac
if($mie == "01")
to wyswietla ci tylko go. Po co ten warunek?
m_09
W tym warunku próbowałem jakoś dopasować żeby wyniki z danego miesiąca były w kolumnie z tym miesiącem, ale chyba to inaczej trzeba zrobić,

ale to i tak jeszcze gdzieś indziej jest błąd bo przy wywołaniu:

  1. echo '<pre>';
  2. print_r($dane);
  3. echo '</pre>';


też wyświetla dane tylko z jednego miesiąca, w bazie mysql mam dane zapisane w taki sposób:

2018-01-17 00:00:00.000000

przy użyciu date().
nospor
Pokaz zapytanie oraz co dokladnie wyswietla print_r($dane)

ps: date jako drugi argument przyjmuje timestamp a nie sformatowana date. Temu ci nie dziala. ZNowu nie zagladasz do manuala
m_09
print_r wyświetla:
  1. (
  2. [Inne] => Array
  3. (
  4. [01] => 21
  5. )
  6.  
  7. [książki] => Array
  8. (
  9. [01] => 65
  10. )
  11.  
  12. [paliwo] => Array
  13. (
  14. [01] => 180
  15. )
  16.  
  17. [Ubrania] => Array
  18. (
  19. [01] => 290
  20. )
  21.  
  22. [żywność] => Array
  23. (
  24. [01] => 76
  25. )
  26.  
  27. )


a zapytanie

  1. $res = $mysqli->query("SELECT SUM(cena) AS suma, dzial, add_data FROM products WHERE wartosc='ujemna' GROUP BY dzial, EXTRACT(YEAR_MONTH FROM add_data)");
  2.  
nospor
spojrz na moj PS z poprzedniego posta. Tam jest wyjasnienie
m_09
Okej, już działa, zrobiłem tak:

  1. $miesiac = date("m", strtotime($row['add_data']));


tylko teraz jak zrobić, żeby wyświetlać dane pod tymi miesiącami co należy? żeby przy miesiącu w którym nie ma danego wydatku była pusta kolumna?

nospor
Miesiecy wiesz ile masz. 12
Robisz petle for od 1 do 12 i sprawdzasz czy masz taki miesiac w tablicy. Jak masz to wyswietlasz. Jak nie to nie wyswietlasz.
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.