Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Odpowiedzi wielu poziomów na forum
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Cześć ludziska. Chcę u siebie na forum zaimplementować taką funkcjonalność jak odnoszenie się do istniejących postów/komentarzy. Mogą być dwa przypadki: możliwość odpowiadania do posta poziomu 1, czyli na poniższym przykładzie da się odpowiadać do postów z ID 1, 2 i 4. Posty z ID 3, 5 i 7 są odpowiedziami do postów poziomu 1. Jak widzimy post ID 7 jest wyświetlony wcześniej niż post ID 4, mimo, że był dodany później (sortowanie wg daty lub ID).


| ID 1 - 01.02.2025
..| ID 7 - 07.02.2025
| ID 2 - 02.02.2025
..| ID 3 - 03.02.2025
..| ID 5 - 05.02.2025
| ID 4 - 04.02.2025

Oraz drugi przypadek - możliwośc odpowiadania do każdego postu. Widzimy wiele poziomów postów, tutaj akurat 3. Czyli jest odpowiedź do odpowiedzi, np posty ID 9 i 11 są odpowiedziami do postu ID 8 a ten jest odpowiedzią do postu ID 7 podobnie jak 10 i 12 są odpowiedziami do 7, który to jest odpowiedzią do pierwszego postu o ID 1.


| ID 1 - 01.02.2025
..| ID 7 - 07.02.2025
....| ID 8 - 08.02.2025
......| ID 9 - 09.02.2025
......| ID 11 - 11.02.2025
........| ID 13 - 13.02.2025
....| ID 10 - 10.02.2025
....| ID 12 - 12.02.2025
| ID 2 - 02.02.2025
..| ID 3 - 03.02.2025
..| ID 5 - 05.02.2025
| ID 4 - 04.02.2025

Myślę, że w obu przykadach baza powinna wyglądać mniej więcej tak:

ID | Data | treść | odpowiedź_do

Dla drugiego przypadku (odpowiedzi do odpowiedzi) wyglądało by to tak:

ID | Data | treść | odpowiedź_do
1 | 01.02 | blabla | 0
2 | 02.02 | blabl2 | 0
3 | 03.02 | blabla | 2
4 | 04.02 | blabl4 | 0
5 | 05.02 | blabl5 | 2
7 | 07.02 | blabla | 1
8 | 08.02 | blabl8 | 7
9 | 08.02 | blabla | 8
10| 10.02 | blabla | 7
11| 10.02 | blabla | 8
12| 01.02 | blabla | 7
13| 13.03 | blabla | 11



O ile dodawanie tego do bazy to pikuś to mam problem z wymyśleniem jak to wyświetlać, tak aby została zachowana kolejność post-odpowiedź_1-...-odpowiedź_n oraz data. No i wcięcia - tj post niższego poziomu, czyli odpowiedź żeby była wcięta (większy margin left) względem posta nadrzędnego.
Jak to zrobić? Naprowadźcie mnie pls. Pętla w pętli była by rozwiązaniem tylko w przypadku pierwszym gdy wiemy że są tylko dwa rodzaje postów - główne i odpowiedzi. Ale w przypadku drugim może być odpowiedź do odpowiedzi, do odpowiedzi, do odpowiedzi i tak właściwie 100 razy. Czyli odpada pętla w pętli, w pętlei, w pętli...


PS. Jeszcze nie ma żadnego kodu na papierze. Na razie wszystko dzieje się w mojej głowie smile.gif

EDIT: hmmm, chyba wymyśliłem.
  1. $sql = "SELECT id, data, odpowiedz FROM test_posty";
  2. $result = $conn->query($sql);
  3.  
  4. while($row = $result->fetch_assoc()){
  5. echo "<div>post $row[id], $row[data]";
  6. $sql2 = "SELECT id, data,odpowiedz FROM test_posty WHERE odpowiedz = $row[id] ORDER BY id ASC";
  7. $result2 = $conn->query($sql2);
  8. while($row2 = $result2->fetch_assoc()){
  9. if($row2['odpowiedz'] == $row['id']){
  10. echo "<div style=\"margin-left:4px;\">post $row2[id], $row2[data]</div>";
  11. }
  12. }
  13. echo '</div>';
  14. }

To wyświetla posty... właściwie tylko traktuje każdą odpowiedź jako odpowiedź do 1 poziomu oraz powtarza wyświetlanie odpowiedzi jako post najwyższego poziomu. Czyli w skrócie - nie działa jak należy sad.gif No i nie wygląda zbyt optymalnie - pierdylion zapytań do bazy sad.gif

Nie wiem, może dodać w wewnętrznej pętli tablicę do której będę zapisywał ID wyświetlonego posta a następnie w pętli nadrzędnej sprawdzać czy Id jest w tablicy i jeśli tak to już tego rekordu nie wyświetlać?
trueblue
Dodaj kolumnę id_parent. Dla pierwszego przykładu posty o id 1/2/4 będą mieć wartość id_parent=null, id=7 id_parent=1, id=3/5 id_parent=2.
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.