Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql] + [PHP] Wyświetlanie pętli w pętli
Forum PHP.pl > Forum > Bazy danych > MySQL
damiansobolewski
Witam. Piszę na stronie panel kontaktowy i mam pewien problem z wyświetlaniem wątków. Na stronie głównej mają się wyświetlać wyniki, które użytkownik dotąd napisał.
status=o - otwarty wątek
status=z - zamknięty wątek
  1. $query = "SELECT * FROM panel_kontaktowy ORDER BY id DESC";
  2. $result = mysql_query($query);
  3. while ($data = mysql_fetch_array($result)) {
  4. IF ($_SESSION['nick'] == $data['nick']) {
  5. echo '<span class="wiadomosc"><a href="panel_kontaktowy.php?task=wiadomosc&id=' . $data['id'] . '">';
  6. IF ($data['status'] == 'o') {
  7. echo '<b style="background: yellow">[OTWARTY]</b>';
  8. }
  9. IF ($data['status'] == 'z') {
  10. echo '<b style="background: red">[ZAMKNIĘTY]</b>';
  11. }
  12. $query2 = "SELECT * FROM panel_kontaktowy_wiadomosci ORDER BY id";
  13. $result2 = mysql_query($query2);
  14. while ($data2 = mysql_fetch_array($result2)){
  15.  
  16. IF ($data['id'] == $data2['id_panelu']) {
  17. $ile = 60;
  18. $tresc = $data2['tresc'];
  19. echo ' <b>' . $data2['nick'] . '</b>: ' . ciach($tresc, $ile) . '';
  20. }
  21. }
  22. echo '</a></span>';
  23. }
  24. }


Otóż jeżeli ostatni warunek nie znajduje się w pętli, wiadomość wyświetla się tylko w dolnym wierszu. Screen: http://img401.imageshack.us/img401/1550/wj1t.png
Ale jeżeli znajduje się w pętli, to gdy w wątku znajduje się więcej niż jeden wpis, to wyświetlają się wszystkie. Screen: http://img22.imageshack.us/img22/5806/inmo.png

A teraz pytanie. Jak zrobić, aby w każdym wierszu wyświetlany był tylko jeden wynik?
pmir13
Patrząc na ten kod, pomijając ile razy coś tam się wyświetla a ile razy powinno, można sobie wyobrazić następującą sytuację:

Przychodzi czytelnik do biblioteki, prosi o wszystkie książki w bibliotece i sprawdza po kolei kto je napisał, porównując nazwisko autora z "X".
Gdy znajdzie taką książkę, prosi o listę wszystkich książek napisanych w roku Y i sprawdza czy ta książka znajduje się na tej liście.
Niezależnie od wyniku, odnosi listę z powrotem i szuka kolejnej pasującej książki, za każdym razem biorąc tę samą listę i odnosząc ją z powrotem.
Bibliotekarka trochę krzywo się patrzy, ale że jest inteligentna to nie odkłada tej listy na półkę, tylko trzyma ją w pogotowiu (query cache).
Po miesiącu czytelnik znajduje wszystko to co chciał i dziękuje bibliotekarce za cierpliwość i chce wychodzić, ale słyszy pytanie:
- Dlaczego po prostu nie poprosił pan o książki napisane przez X w roku Y?
- A to pani tak potrafi?

Otóż tak, baza danych (bibliotekarka) potrafi takie rzeczy i robi to o wiele szybciej wykorzystując sobie znane mechanizmy takie jak na przykład indeksy (katalogi książek).
Wygląda na to, że napisałeś od nowa implementację WHERE oraz JOIN, wymagającą przesłania całych tabel między mysql a php i bez żadnych usprawnień, które mysql oferuje.

A przecież wystarczy odpowiednio zapytać (nie podałeś struktur tabel, więc trzeba je zgadywać z kodu):
  1. SELECT pk.id AS id_panelu, pkw.id AS id_wiadomosci, pk.nick AS nick_autora, pkw.nick AS nick_odpowiedzi, pk.STATUS, pkw.tresc
  2. FROM panel_kontaktowy pk JOIN panel_kontaktowy_wiadomosci pkw ON pk.id = pkw.id_panelu
  3. WHERE pk.nick = 'Damian'
  4. ORDER BY pk.id, pkw.id


Otrzymujesz jeden obcięty zestaw, w całości do wyświetlenia, jedyne co musisz dodać to jakieś przerywniki gdy zmienia się id_panelu by oddzielić od siebie różne wątki.
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.