Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][PHP] sortowanie wyświetlania
phpuser88
post 16.05.2022, 12:29:33
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

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


Mam problem z wyświetleniem sub-komentarzy pod określonym komentarzem.
Ogółem, zależy mi aby komentarze i subkomentarze trzymać w jednej tabeli.
Sub-komentarz jest rozpoznawany za pomocą id komentarza, tzn. jeśli `id_subkom`>0 == to jest to subkomentarz, a numer odpowiada `id` komentarza pod którym został napisany.
Komentarz zawsze zawiera `id_subkom`=0.
Mam taką tabele:
  1. //`komentarze` (`id`, `id_wyz`, `id_subkom`, `autorid`, `autorlogin`, `tresckom`, `data`, `ocenakom`, `zalacznik`, `widocznosckom`)

A tak wyświetlam komentarze:
  1. $sqlkom="SELECT * FROM `komentarze` WHERE `id_wyz`='".$row['id']."' ORDER BY id DESC LIMIT 10";
  2. if($resultkom = mysqli_query($con, $sqlkom)){while($rowkom = mysqli_fetch_assoc($resultkom)){
  3. if($rowkom['id_subkom']==0){//wyświetlam tylko komentarze
  4. echo komentarz($rowkom['avkom'],$rowkom['autorkom'],$rowkom['datakom'],$rowkom['tresckom'],$rowkom['ocenakom']);
  5. }else{//wyświetlam tylko subkomentarze
  6. echo komentarz($rowkom['avkom'],$rowkom['autorkom'],$rowkom['datakom'],$rowkom['tresckom'],$rowkom['ocenakom']);
  7. }

Teraz tu pojawia się pytanie jak połączyć subkomentarze, aby wyświetlały się pod danym komentarzem? Chyba w warunku:else muszę zastosować kolejną pętle while(), mam rację? bo nie jestem pewny, a próby są dalekie od prawidłowego rezultatu...
Go to the top of the page
+Quote Post
trueblue
post 16.05.2022, 12:37:09
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Użyj biblioteki PDO.
Jednym zapytaniem pobierasz komentarze "główne".
Drugim zapytanie subkomentarze (tu w trybie PDO::FETCH_GROUP), co utworzy tablicę z indeksem o wartości kolumny id_subkom (tą kolumnę należy ustawić jako pierwszą w zapytaniu), pod którym będą wszystkie subkomentarze dla danego id.

Faktycznie będą dwie pętle (while czy też for). W drugiej mając id głównego komentarza, należy iterować tylko po indeksie o tej wartości z głównej tablicy. Wyświetl wynik drugiego zapytania poprzez print_r, to stanie się jasne co i jak.

Oczywiście zakładamy dwupoziomowe zagłębienie.


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 16.05.2022, 12:59:02
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

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


Dzięki za odpowiedź. Zanim ogarnę PDO do takiego stopnia takiej znajomości minie co najmniej doba i trochę niekomfortowo byłoby mieć w kodzie fragment PDO gdzie całość jest pisana strukturalnie.
Właśnie mam problem z tą drugą pętlą, obstawiam że struktura i ogólne założenie jest nie prawidłowe, wyświetla mi subkomentarz, ale dubluje wyniki i w złym miejscu, a próbuję tak:
  1. $sqlkom="SELECT * FROM `komentarze` WHERE `id_wyz`='".$row['id']."' ORDER BY id DESC LIMIT 10";
  2. if($resultkom = mysqli_query($con, $sqlkom)){while($rowkom = mysqli_fetch_assoc($resultkom)){
  3. if($rowkom['id_subkom']==0){//wyświetlam tylko komentarze
  4. echo komentarz($rowkom['avkom'],$rowkom['autorkom'],$rowkom['datakom'],$rowkom['tresckom'],$rowkom['ocenakom']);
  5. }else{//wyświetlam tylko subkomentarze
  6. $rowsubkom="SELECT * FROM `komentarze` WHERE `id_wyz`='".$row['id']."' AND `id_subkom`='".$rowkom['id_subkom']."' ORDER BY id DESC LIMIT 10";
  7. if($rowsubkom = mysqli_query($con, $rowsubkom)) {while($rowsubkom = mysqli_fetch_assoc($rowsubkom)) {
  8. echo subkomentarz($rowsubkom['avkom'],$rowsubkom['autorkom'],$rowsubkom['datakom'],$rowsubkom['tresckom'],$rowsubkom['ocenakom']);
  9. }
  10. }
Go to the top of the page
+Quote Post
trueblue
post 16.05.2022, 14:32:56
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


1. Wydaje mi się, że dal subkomentarzy, id_wyz nie jest kompletnie potrzebne, bo ta wartość jest determinowana przez komentarz nadrzędny dla subkomentarza.
2. Tu:
  1. AND `id_subkom`='".$rowkom['id_subkom']."

chyba powinno być:
  1. AND `id_subkom`='".$rowkom['id']."

3. Tu:
  1. if($rowsubkom = mysqli_query($con, $rowsubkom)) {while($rowsubkom = mysqli_fetch_assoc($rowsubkom)) {

nadużywasz tą samą zmienną.



--------------------
Go to the top of the page
+Quote Post
phpuser88
post 16.05.2022, 17:31:18
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

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


1. Też się nad tym zastanawiałem, ale ostatecznie (bez testów) doszedłem do wniosku, że jeżeli wywalę id_wyz, to wyświetli mi id_subkom dla innego id_wyz w bazie - jest taka możliwość.
2. Zmieniłem na `id_subkom`='".$rowkom['id']." - w ten sposób wyświetla mi komentarz pod którym powinny znaleźć się subkomentarze i co dziwne sypie mi błędem, którego nie ogarniam...
  1. $rowsubkom="SELECT * FROM `komentarze` WHERE `id_wyz`='".$row['id']."' AND `id`='".$rowkom['id_subkom']."' ORDER BY id DESC LIMIT 10";//ZWRACA: SELECT * FROM `komentarze` WHERE `id_wyz`='41' AND `id`='2' ORDER BY id DESC LIMIT 10
  2. if($rowsubkom = mysqli_query($con, $rowsubkom)) {//ZWRACA: mysqli_result Object ( [current_field] => 0 [field_count] => 11 [lengths] => [num_rows] => 1 [type] => 0 )
  3. while($rowsubkom = mysqli_fetch_assoc($rowsubkom)) {//ZWRACA: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, array given in
  4. //print_r($rowsubkom); //ZWRACA: Array ( [id] => 2 [id_wyz] => 41 [id_subkom] => 0 [avkom] => 33.jpg [autoridkom] => 123456 [autorkom] => TO JEST ID2 [tresckom] => tresc komenta z SQL22222 [datakom] => 2022-05-16 13:56:53 [ocenakom] => 0 [zalacznik] => 1 [widocznosckom] => 1 )
  5. echo komentarz($rowsubkom['avkom'],$rowsubkom['autorkom'],$rowsubkom['datakom'],$rowsubkom['tresckom'],$rowsubkom['ocenakom']); //WYŚWIETLA

3. Taaak, zazwyczaj nadpisuje zmienne, ale tutaj żeby się nie pogubić zmieniłem.
Jak narazie myślę aby zmienić sposób, bo ten chyba nie jest rozsądnie przemyślany. Myślałem, że zejdzie mi to w kilka minut, a tu nauka mnie czeka.. haha
edit: tak to wygląda:

edit @trueblue: źle zrozumiałem Twój przekaz. Poprawione, błędu już nie ma.

Ten post edytował phpuser88 16.05.2022, 17:45:48
Go to the top of the page
+Quote Post
trueblue
post 16.05.2022, 17:36:04
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Sypie błędem właśnie z powodu nadpisywania zmiennej, o której pisałem w punkcie 3.
Porównaj while z while'em dla zapytania dotyczącego głównych komentarzy. Zresztą błąd wyraźnie mówi gdzie leży problem.


--------------------
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: 19.04.2024 - 04:12