Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wyświetlanie danych z tabeli
m_09
post 25.06.2018, 14:29:46
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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
Go to the top of the page
+Quote Post
nospor
post 25.06.2018, 14:33:27
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 27.06.2018, 10:18:04
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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.  


Ten post edytował m_09 27.06.2018, 10:18:38
Go to the top of the page
+Quote Post
nospor
post 27.06.2018, 10:23:26
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 30.06.2018, 10:43:53
Post #5





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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. }
Go to the top of the page
+Quote Post
nospor
post 2.07.2018, 09:18:21
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 17.07.2018, 15:07:21
Post #7





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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. };
Go to the top of the page
+Quote Post
nospor
post 17.07.2018, 15:09:55
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 17.07.2018, 15:23:48
Post #9





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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
Go to the top of the page
+Quote Post
nospor
post 17.07.2018, 15:42:58
Post #10





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No bo dales warunek na miesiac
if($mie == "01")
to wyswietla ci tylko go. Po co ten warunek?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 17.07.2018, 16:38:19
Post #11





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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().
Go to the top of the page
+Quote Post
nospor
post 17.07.2018, 16:45:10
Post #12





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 17.07.2018, 16:53:12
Post #13





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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.  
Go to the top of the page
+Quote Post
nospor
post 17.07.2018, 16:54:51
Post #14





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




spojrz na moj PS z poprzedniego posta. Tam jest wyjasnienie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
m_09
post 17.07.2018, 17:24:02
Post #15





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 7.07.2007

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


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?

Go to the top of the page
+Quote Post
nospor
post 18.07.2018, 09:33:33
Post #16





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 02:03