Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wyświetlanie danych z tabeli
m_09
post
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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.
Go to the top of the page
+Quote Post
m_09
post
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
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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
Go to the top of the page
+Quote Post
m_09
post
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
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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.
Go to the top of the page
+Quote Post
m_09
post
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
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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.
Go to the top of the page
+Quote Post
m_09
post
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
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No bo dales warunek na miesiac
if($mie == "01")
to wyswietla ci tylko go. Po co ten warunek?
Go to the top of the page
+Quote Post
m_09
post
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
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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
Go to the top of the page
+Quote Post
m_09
post
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
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




spojrz na moj PS z poprzedniego posta. Tam jest wyjasnienie
Go to the top of the page
+Quote Post
m_09
post
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
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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.
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: 24.08.2025 - 02:30