Avatar billede woowii Nybegynder
29. august 2004 - 18:34 Der er 18 kommentarer og
1 løsning

Comment system med svar

Hej.

Jeg har lavet et nyhedssystem, som også har en comment del - den comment del har jeg nu bygget lidt videre på ved at gøre 'svar' mulige. Hvis man svarer på et indlæg dukker ens indlæg op under det man svarede på - det har jeg fået til at virke, sådan da.

Problemet: som det er lavet nu kan den kun håndtere et 'trin' svar. Altså, person x svarer på person y's indlæg, det bliver vist fint - hvis så der kommer en og svarer på person x's indlæg bliver det ikke vist. Det er bygget op således: jeg har en while sætning der spytter alle indlæg (som ikke er et svar) ud og inde i den en anden while sætning som skriver de svar der er til det pågældende indlæg - der er problemet, den tager kun svar til indlæg som bare er skrevet (som altså ikke er svar). Hvordan får jeg lavet en kode som forsætter med at spytte ud og ikke stopper efter første trin? Skal jeg have fat i en for sætning?

En løsning kunne naturligvis være at lave 1000 while sætninger magen til den der er lavet - men det holder jo ikke. :P

Hvis der er brug for noget kode poster jeg det med glæde - ser bare ikke umildbart grund til det, da jeg egentlig bare skal bruge måden det skal laves på (tror jeg i hvert fald ;)).
Avatar billede dennismp Nybegynder
29. august 2004 - 18:42 #1
Kan du ikke pakke din runtine ind i en funktion og benytte rekursion? Det lyder som om at det burde være nemt med din kode:

function visSvar($tilId) {

  while( ) .. {
    vis svar-tekst
    visSvar(med eget id);
  }
}
Avatar billede woowii Nybegynder
29. august 2004 - 18:50 #2
Hmm, den må jeg lige have forklaret yderligere.

Smider lige koden:
-----------------------
$query = mysql_query("select * FROM news_comments WHERE tal=$id AND svar='' limit $s,$pr_side ");

while($row = mysql_fetch_array($query)) {

selve indlægget

$query2 = mysql_query("select * FROM news_comments WHERE svar=$row[pri] AND tal=$id");
while($row = mysql_fetch_array($query2)) {
   
svar

}}
Avatar billede dennismp Nybegynder
29. august 2004 - 18:54 #3
Hmm hvordan har du bygget din tabel op? Hvilken felter.. hvad bruger du tal, svar og pri til?
Avatar billede woowii Nybegynder
29. august 2004 - 19:00 #4
pri er det unikke id.
svar er det tal (pri) som der er svaret på.
tal er nyhedens id.

Ikke de mest logiske navne, nej - men jeg kan da finde rundt i det. ;)
Avatar billede woowii Nybegynder
29. august 2004 - 19:04 #5
Uddyber lige svar cellen:

'svar' bliver bestemt af 'pri'. Når man svarer på et indlæg, bliver pri tallet sat ind i den celle - samtidig med indlægget naturligvis får 'sit eget' 'pri'-tal.
Avatar billede dennismp Nybegynder
29. august 2004 - 20:53 #6
Her er et bud..

function visSvar($tal,$svarId='') {
  $query = mysql_query("SELECT * FROM news_comments WHERE tal=$tal AND svar=''");
  while($row = mysql_fetch_array($query)) {
    // udskriv indlægget

    // og skriv svar til pågældende indlæg
    visSvar($tal,$row['pri']);
  }
}
Avatar billede woowii Nybegynder
29. august 2004 - 22:29 #7
Hm, kan ikke umildbart se hvordan det skulle komme til at virke. Hvor skal koden der viser indlægget ligge og hvor skal koden der viser svaret ligge? De kan vel ikke ligge i samme while sætning.. ?
Avatar billede woowii Nybegynder
29. august 2004 - 22:34 #8
Som jeg skrev i start indlægget, kan det så ikke løses med en 'for' sætning? Har ikke brugt 'for' endnu, så kender meget lidt til det.
Avatar billede woowii Nybegynder
29. august 2004 - 22:40 #9
Forresten.. udover de skal stå under hinanden, skal den også rykkes ind.. havde forestillet mig at gøre det ved at lave en tom <td> med et stigende antal pixels (alt efter hvor mange 'trin' man er inde').

Eftersom jeg er så krævende har jeg hævet pointtallet - kom så med nogle gode bud. ;)
Avatar billede dennismp Nybegynder
29. august 2004 - 22:50 #10
Et indlæg er vel det samme som et svar. Forskellen er vel, at et svar refererer til et indlæg (eller et svar).

Derfor, i while(), viser du indlægget, og kalder visSvar funktionen (som så viser alle svar til indlægget - og evt undersvar.).. Men hvis du ikke har brugt rekursion før, så kan det godt være svært at overskue.

Du kan nok godt lave det med en for-sætning. For minder lidt om while..

while( en betingelse ) {
  kodeblok.
}

.. som så bliver udført indtil betingelsen er falsk.

"for" minder lidt om den. Men den udmærker sig ved at man kan bruge den til at tælle.. fx

for($i=0;$i<10;$i++) {
  print "$i<br>";
}

Den vil skrive tallene fra 0 til 9.

$i=0 - delen bliver altid udført første gang. Det bruger man typisk til at initierer variabler, som eksemplet viser.

$i<10; er en betingelse, som bestemmer om kroppen af for() skal udføres. Hvis det returnerer sandt, forsætter den, hvis ikke stopper den.

Den sidste del, $i++, bliver udført efter hver interation. Så man kan tælle op eller ned.. eller hvad man nu ønsker.

Sætningen svarer til denne while:

$i=0
while($i<10) {
  print "$i<br>";
  $i++
}

Så for kan ikke mere end while - men indimellem er det nemmere :)
Avatar billede dennismp Nybegynder
29. august 2004 - 22:52 #11
Hvordan ser din tabel ud - hvilke felter er der.. Så skal jeg prøve at lave et eksempel som du kan bruge..
Avatar billede woowii Nybegynder
29. august 2004 - 22:57 #12
Har følgene felter:
pri (indlæggets unikke id)
dato
tal (nyhedens id)
besked (indlægget)
ip
navn
svar (hvilket 'pri' der er svaret på)

Indlæg og svar er det samme, ja - udover svarene som nævnt også gerne må rykkes lidt ind (mere og mere efter som det bliver 'dybere'). :)
Avatar billede dennismp Nybegynder
29. august 2004 - 23:27 #13
Sådan her?

http://dennis.moellegaard.dk/v4/php/534277.php?source=2

HTML'en skal du nok lige rette på - jeg er ikke webdesigner :-)
Avatar billede woowii Nybegynder
29. august 2004 - 23:31 #14
Det ser godt ud - tester det i morgen, må hellere få lidt søvn. :)
Avatar billede woowii Nybegynder
30. august 2004 - 16:18 #15
Det virker. :D Smid så det svar så du kan få point. ;) Tak for hjælpen.
Avatar billede woowii Nybegynder
30. august 2004 - 17:12 #16
eller.. der er et lille problem - den viser samme comments ligemeget hvilken nyhed. De comments den viser hører til nyhed nr. 1.
Avatar billede dennismp Nybegynder
30. august 2004 - 17:35 #17
du skal rette:
showComments(1);

så den bruger id'et på nyheden istedet for 1.
Avatar billede woowii Nybegynder
30. august 2004 - 17:54 #18
Ah ja.. naturligvis. :p Igen, tak for hjælpen. :)
Avatar billede dennismp Nybegynder
30. august 2004 - 17:59 #19
Det var så lidt.. Som du kan se, er reskursive funktioner ret elegante :-) Man kan godt gøre det med løkker, men jeg foretrækker den rekursive løsning, da den er nemmere at læse..

Men held og lykke med projektet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester