Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySql] + [PHP] Wyświetlanie pętli w pętli
damiansobolewski
post 25.08.2013, 18:41:52
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 31.03.2013

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


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?

Ten post edytował damiansobolewski 25.08.2013, 22:50:19
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
pmir13
post 26.08.2013, 15:43:50
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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.
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: 21.06.2025 - 23:55