Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Wyświetlanie danych z bazy z podziałem na dni
arturpiotrowski
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Wybieram sobie z bazy dane takim oto zapytaniem:
Kod
SELECT name,day,odm FROM tabela ORDER BY day,odm

Myślę że nigdy w tabeli nie będzie więcej jak 50 rekordów.
Potrzebuje mieć wynikowy kod w podobnej formie:
  1. <div>
  2. <div class='row' id='day-1'>
  3. <div class="row">
  4. <div class="col-3">[odm]</div>
  5. <div class="col-9">[name]</div>
  6. </div>
  7. <div class="row">
  8. <div class="col-3">[odm]</div>
  9. <div class="col-9">[name]</div>
  10. </div>
  11. </div>
  12. <div class='row' id='day-2'>
  13. <div class="row">
  14. <div class="col-3">[odm]</div>
  15. <div class="col-9">[name]</div>
  16. </div>
  17. <div class="row">
  18. <div class="col-3">[odm]</div>
  19. <div class="col-9">[name]</div>
  20. </div>
  21. <div class="row">
  22. <div class="col-3">[odm]</div>
  23. <div class="col-9">[name]</div>
  24. </div>
  25. </div>
  26. // dalsze dni
  27. // ...
  28. <div class='row' id='day-7'>
  29. <div class="row">
  30. <div class="col-3">[odm]</div>
  31. <div class="col-9">[name]</div>
  32. </div>
  33. </div>
  34. </div>

udało mi się na te chwilę coś takiego napisać i stanąłem:
  1. $results = ; // wynik powyższego zapytania select
  2. if(!empty($results)) {
  3. $day = 0;
  4. $content .= '<div>';
  5. foreach ($results as $row ){
  6. if($row->day<>$day){
  7. $content .= '<div class="row" id="day-'.$row->day.'">';
  8. /**
  9. * tu pewnie jakaś pętla foreach()
  10. * zwracająca name i odm dla danego day
  11. * tylko nie wiem jak ją zapisać
  12. **/
  13. $content .= '</div>';
  14. }
  15. $day = $row->day;
  16. }
  17. $content .= '</div>';
  18. }

Pomóżcie proszę.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Niree
post
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 18
Dołączył: 5.02.2016
Skąd: Polska

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


Przecież już jedną pętlę wykonałeś, po co chcesz robić pętlę w pętli?
  1. if($row->day<>$day){


Tego warunku nie rozumiem (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Cytat(Niree @ 26.03.2017, 16:11:46 ) *
Przecież już jedną pętlę wykonałeś, po co chcesz robić pętlę w pętli?
  1. if($row->day<>$day){


Tego warunku nie rozumiem (IMG:style_emoticons/default/biggrin.gif)

  1. if($row->day<>$day)

Porównuje czy dzień w bazie danych nie ma numeru takiego jak ten przypisany do zmiennej $day żeby wyświetlać tylko raz dany dzień, jakby było 50 rekordów to poco mi wyświetlać 50 razy diva z numerem dnia? Pewnie zamiast <> mogłem dać !== też by robiło to samo.

Wydawało mi się że tak powinienem to zrobić że powinna być koleja pętla która iteruje po rekodach z danego dnia, ale przecież nie napisałem że tak ma być napewno (IMG:style_emoticons/default/smile.gif) skoro da się inaczej to chętnie poznam sposób.

Ten post edytował arturpiotrowski 26.03.2017, 19:11:29
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




@Niree juz ci raz tlumaczylem co oznacza operator roznosci <>. Naprawde jeszcze nie zakumales? (IMG:style_emoticons/default/tongue.gif)

@artur zrobiles prawie dobrze, niestety w pewnym momencie zamotales sie w dwoch stylach. Pierwszy styl to grupowanie na "zywo". Drugi styl to wpierw przygotowanie danych, a potem ich wyswietlanie.
Ja ci opisze drugi styl, gdyz uwazam za go za bardziej poprawny - najpierw logika, potem wyswietlanie.

A wiec, najpierw przygotowujesz sobie tablice by miec tablice z dniami a w niej dane

  1. $data = [];
  2. foreach ($results as $row ){
  3. $day = $row->day;
  4. if (!isset($data[$day]) {
  5. $data[$day] = [];
  6. }
  7. $data[$day][] = $row;
  8. }
  9.  

Wyswietl sobie $data na koniec by zrozumiec co powstalo: print_r($data);

A teraz to juz tylko proste wyswietlanie:


  1. $content .= '<div>';
  2. foreach ($data as $day => $rows ){
  3. $content .= '<div class="row" id="day-'.$day.'">';
  4. foreach ($rows as $row) {
  5. $content.= $row->odm;
  6. //tutaj sobie dostosuj ten content jaki chcesz miec
  7. }
  8. $content .= '</div>';
  9. }
  10.  
  11. $content .= '</div>';
  12.  
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #5





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Dzięki nospor chyba o to chodzilo.

Moglbym jeszcze prosic o podpowiedz co zrobic aby w tablicy data day bylo zawsze 7 kluczy od 1 do 7 a zmienna row byla przypisana tylko do tego dnia ktory jest w kolumnie day w bazie. Przepraszam ale pidze ze smartfona
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




Cytat
aby w tablicy data day bylo zawsze 7 kluczy od 1 do 7

Moge zapytac po co tak bzdurny wymog odnosnie kluczy?

Cytat
a zmienna row byla przypisana tylko do tego dnia ktory jest w kolumnie day w bazie
No przeciez jest... albo ja nie rozumiem co tu wlasnie napisales
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #7





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


No właśnie, pisałem krótko bo ze smartfona trudno się pisze, a więc wyjaśniam

Ad 1. Tydzień ma 7 dni i będę robił terminarz 7-dniowy jak puste to nic nie wyświetli w divie ale chcę mieć tego diva z id dnia, bo na górze nad tym będą linki ajaksowe które po kliknięciu będą przenosić do konkretnego diva, a jak nie będzie diva to gdzie mają przenieść?

Ad 2. Jest i jest ok tylko że jak dodałbym klucze 1-7 do tej tablicy to chcę wyświetlać dane tylko przy tych kluczach które mają dane w bazie danych.

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




Niby napisales wiecej ale dalej nic nie kumam o co ci chodzi

1-7 to sa dni tygodnia. Majac date, masz tez dzien tygodnia wiec na dobra sprawe masz wszystko co chcesz. Nadal nie wiem w czym problem
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #9





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Tu nie ma dat w tej bazie są tylko numery dla dni tygodnia. Załózmy że mam 2 zadania 3 dnia tygodnia, godziny 15-16, i 16-19 moj kod html fragmentu strony chcę aby wyglądał wtedy mniej więcej tak
  1. <ul>
  2. <li><a href="#day-1">Poniedziałek</a></li>
  3. <li><a href="#day-2">Wtorek</a></li>
  4. <li><a href="#day-3">Środa</a></li>
  5. <li><a href="#day-4">Czwartek</a></li>
  6. <li><a href="#day-5">Piątek</a></li>
  7. <li><a href="#day-6">Sobota</a></li>
  8. <li><a href="#day-7">Niedziela</a></li>
  9. </ul>
  10. <div class="tab-content">
  11. <div class="row hide" id="day-1">
  12. Brak danych
  13. </div>
  14. <div class="row hide" id="day-2">
  15. Brak danych
  16. </div>
  17. <div class="row hide" id="day-3">
  18. <div>15:00 - 16:00 Tytuł nr 18</div>
  19. <div>16:00 - 19:00 Tytuł nr 19</div>
  20. </div>
  21. <div class="row hide" id="day-4">
  22. Brak danych
  23. </div>
  24. <div class="row hide" id="day-5">
  25. Brak danych
  26. </div>
  27. <div class="row hide" id="day-6">
  28. Brak danych
  29. </div>
  30. <div class="row hide" id="day-7">
  31. Brak danych
  32. </div>
  33. </div>

Jak widać każdy dzień tygodnia ma swój div - domyślnie ukryty. Po odpowiednim oprogramowaniu tego np w jQuery jak teraz kliknę w Poniedziałek to div id=day-1 zmieni klasę z hide na show i wyświetli mi zawartość diva o id day-1, kliknę na wtorek zmieni się klasa hide na show w div id = day-2 i powróci hide w poniedziałek itd. przy kolejnych dniach.

W twojej wersji przy założeniu powyższych danych stworzy się tylko
  1. <ul>
  2. <li><a href="#day-1">Poniedziałek</a></li>
  3. <li><a href="#day-2">Wtorek</a></li>
  4. <li><a href="#day-3">Środa</a></li>
  5. <li><a href="#day-4">Czwartek</a></li>
  6. <li><a href="#day-5">Piątek</a></li>
  7. <li><a href="#day-6">Sobota</a></li>
  8. <li><a href="#day-7">Niedziela</a></li>
  9. </ul>
  10. <div class="tab-content">
  11. <div class="row hide" id="day-3">
  12. <div>15:00 - 16:00 Tytuł nr 18</div>
  13. <div>16:00 - 19:00 Tytuł nr 19</div>
  14. </div>
  15. </div>

Pytanie co się pokaże w twojej wersji jak kliknę na wtorek, w założeniu powinien się pokazać div id = day-2 ale go nie ma w tym kodzie.
Go to the top of the page
+Quote Post
Niree
post
Post #10





Grupa: Zarejestrowani
Postów: 220
Pomógł: 18
Dołączył: 5.02.2016
Skąd: Polska

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


Cytat(nospor @ 26.03.2017, 20:09:33 ) *
@Niree juz ci raz tlumaczylem co oznacza operator roznosci <>. Naprawde jeszcze nie zakumales? (IMG:style_emoticons/default/tongue.gif)


Zgadza się, wybacz, nie zaglądałem na forum. Korzystam częściej z operatora "!=" (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #11





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




No to skoro day to dzien tygodnia, to w tablicy ktora ci generuje wygeneruj brakujace klucze. No naprawde nie wiem w czym problem.
Skoro ja na podstawie danych generuje ci kluce powiedzmy 1,4,7 to jaki problem przeleciec petla FOR od 1 do 7 i sprawdzic jakich kluczy brakuje i dogenerowac je sztucznie? Przedszkole przedszkolem no ale nie przesadzaj za bardzo.
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #12





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Tak tez zrobilem juz wczesniej tylko ci teraz opisalem jak to ma wygladac skoro wczesniej nie dosc czytelnie opisałem. Jak bede w domu przekleje tu caly kod jaki zmajstrowalem, bo znowu piszę z komórki celem weryfikacji czy dobrze to zrobiłem.
Go to the top of the page
+Quote Post
nospor
post
Post #13





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




Az przeczytalem jeszcze raz i nigdzie nie wynika wczesniej ze tak wlasnie zrobiles (IMG:style_emoticons/default/wink.gif) No nic, dobrze ze jednak to zrobiles (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
arturpiotrowski
post
Post #14





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 6.12.2016

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


Zrobiłem to wczoraj wieczorem po tym jak napisałem posta, ta pętla for chodziła mi po głowie, ale poza tym pisałeś że to bzdurny pomysł te klucze, więc się nie wychylałem z tym co zrobiłem bo myślałem że może walne jakąś głupotę (IMG:style_emoticons/default/smile.gif)
  1. $data = [];
  2. for($i = 1; $i<=7; $i++){
  3. $data[$i] = [];
  4. }
  5. foreach($results as $row){
  6. $day = $row->day;
  7. // to w ifie niżej sumie niepotrzebne
  8. // chyba ze trafi się inna cyfra jak 1 do 7
  9. if(!isset($data[$day])){
  10. $data[$day] = [];
  11. }
  12. $data[$day][] = $row;
  13. }

i reszta z twojego postu, tj kolejne pętle foreach
  1. $content .= '<div>';
  2. foreach ($data as $day => $rows ){
  3. $content .= '<div class="row" id="day-'.$day.'">';
  4. foreach ($rows as $row) {
  5. $content.= $row->odm;
  6. //tutaj sobie dostosuję ten content jaki chce miec
  7. }
  8. $content .= '</div>';
  9. }
  10. $content .= '</div>';


Ten post edytował arturpiotrowski 30.03.2017, 17:25:58
Go to the top of the page
+Quote Post
nospor
post
Post #15





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




Cytat
ale poza tym pisałeś że to bzdurny pomysł te klucze
Bo zle cie zrozumialem. Myslalem ze masz normalne daty i chcesz rekordy numerowac od 1 do 7 (IMG:style_emoticons/default/smile.gif)


Nom i tak jak zrobiles jest dobrze (IMG:style_emoticons/default/smile.gif)

edit: jedyne co to teraz mozesz wywalic to:
if(!isset($data[$day])){
$data[$day] = [];
}
poniewaz $data[$day] jest zawsze ustawione przez ciebie wczesniej
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 - 13:32