Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlanie danych z bazy z podziałem na dni
Forum PHP.pl > Forum > Przedszkole
arturpiotrowski
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ę.
Niree
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 biggrin.gif
arturpiotrowski
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 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 smile.gif skoro da się inaczej to chętnie poznam sposób.
nospor
@Niree juz ci raz tlumaczylem co oznacza operator roznosci <>. Naprawde jeszcze nie zakumales? 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.  
arturpiotrowski
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
nospor
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
arturpiotrowski
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.

nospor
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
arturpiotrowski
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.
Niree
Cytat(nospor @ 26.03.2017, 20:09:33 ) *
@Niree juz ci raz tlumaczylem co oznacza operator roznosci <>. Naprawde jeszcze nie zakumales? tongue.gif


Zgadza się, wybacz, nie zaglądałem na forum. Korzystam częściej z operatora "!=" tongue.gif
nospor
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.
arturpiotrowski
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.
nospor
Az przeczytalem jeszcze raz i nigdzie nie wynika wczesniej ze tak wlasnie zrobiles wink.gif No nic, dobrze ze jednak to zrobiles smile.gif
arturpiotrowski
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ę 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>';
nospor
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 smile.gif


Nom i tak jak zrobiles jest dobrze 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
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.