Avatar billede riefart Seniormester
05. marts 2016 - 20:33 Der er 10 kommentarer og
1 løsning

Hen kommentarer til blogindlæg

Jeg er i gang med at lave et forum/blog til en hjemmeside, og har et problem i forbindelse med at hente kommentarer til bloggens indlæg.

Blogindlæggene ligger i tabellen "blog" og kommentarer til blogindlæggene i tabellen "kommentarer"

Mit script, som viser indholdet i bloggen:
if($stmt=$mysqli->prepare("SELECT * FROM `blog`"))
    {
    $stmt->execute();
    $stmt->bind_result($opslagsnr, $id, $overskrift, $kategori, $tekst, $billede);
    while($stmt->fetch())
        {
?>
<div> Blogindlæggene udskrives</div>

//kommentarer vises under blogindlægget
<div class="vis_kommentar">
<a href="#<?php echo $opslagsnr; ?>" onclick="visText('kommentar<?php echo $opslagsnr; ?>')"> Kommentarer</a></div>

<div id="kommentar<?php echo $opslagsnr; ?>"  style='display:none;'>

<div class="luk_kommentar"><a href="#<?php echo $opslagsnr; ?>"  onclick="visText('kommentar<?php echo $opslagsnr; ?>')">Luk igen</a></div>
</div>
<?php
        }
    $mysqli->close();
    }
?>

Jeg burger dette til visText-funktionen:
<script type="text/javascript">
function visText(objekt){
if (document.getElementById(objekt).style.display=="block") {
document.getElementById(objekt).style.display="none"}
else {
document.getElementById(objekt).style.display="block"
}}
</script>
I tabellen "kommentarer har jeg følgende kolonner: kommentar_nr, opslagsnr (refererer til opslagsnr i 'blog'), navn, kommentar, tid og id.

Hvordan sammensætter jeg en søgestreng, som kan hente kommentarer til de respektive blogindlæg - eller begge dele på en gang i denne opsætning?
Avatar billede Slater Ekspert
05. marts 2016 - 20:53 #1
Skal det forstås sådan, at du vil udskrive alle blogindlæggene på samme side efter hinanden, med alle kommentarer udskrevet under hver?

Det er lidt utraditionelt, men i så fald henter du jo bare alle kommentarerne med "select * from kommentarer" og bruger PHP til at udskrive dem de rigtige steder.

Det mere normale at gøre er jo at lade brugeren klikke sig ind på et enkelt blogindlæg, og først der hente kommentarerne for det indlæg.
Avatar billede riefart Seniormester
05. marts 2016 - 22:49 #2
De enkelte blogindlæg vises (pager kommer på), og der kan klikkes på kommentarlink, hvor kommentarer åbnes for det enkelte blogindlæg.
Ses måske lidt her:
http://riefart.dk/kunder/puck/blog/forum2.php

Og det er lige netop det med at få dem skrevet ud de rigtige steder, der er problemet, og til hvilket jeg søger hjælp.
Avatar billede Slater Ekspert
05. marts 2016 - 23:09 #3
Så der skal klikkes for at kommentarerne kommer frem. Så ville det normale være som jeg siger, at først hente dem ved klik. I dette tilfælde via AJAX i stedet for sideskift, men ikke den store forskel.

Ved at hente alle kommentarer samlet, kan det blive et temmelig tungt kald med mange indlæg og kommentarer. For ikke at tale om, at det er lidt mere besværligt.


Hvis du stadig vil hente dem alle samlet, så er den letteste måde at indlæse dem alle først.

$comments = [];
$result = $mysqli->query("select * from kommentarer");
while ($row = $result->fetch_assoc())
    $comments[ $row['opslagsnr'] ] = $row;


På denne måde har du alle kommentarerne indlæst og opdelt per opslagsnummer, og du kan udskrive dem efter hvert blogindlæg, ved at bruge f.eks.

foreach ($comments[$opslagsnr] as $comment)
    echo $comment['text'];

Ulempen ved denne metode er, at du indlæser det hele i hukommelse og beholder det der under eksekveringen af siden, hvilket bruger noget mere RAM.
Det kan godt laves om at benytte streaming i stedet, men det er mere besværligt - og hvis du støder ind i nogen som helst RAM-problemer her, så vil jeg igen sige, at det er den forkerte måde at gøre det på at indlæse dem alle samtidig.
Avatar billede Slater Ekspert
05. marts 2016 - 23:09 #4
Hov, der skulle stå

$comments[ $row['opslagsnr'] ][] = $row;

i stedet for

$comments[ $row['opslagsnr'] ] = $row;
Avatar billede riefart Seniormester
05. marts 2016 - 23:32 #5
Jeg har prøvet at indlæse ovenstående, men det resulterer alene i en serverfejl (500)
Avatar billede Slater Ekspert
06. marts 2016 - 10:56 #6
500-fejl betyder noget dybere end bare en PHP-fejl. Har du mulighed for at vise den kode du har nu? Eventuelt smide det ind i en Pastebin.
Avatar billede riefart Seniormester
06. marts 2016 - 12:18 #7
Fejlen opstår kun, når jeg smider din kode ind i scriptet.
Avatar billede Slater Ekspert
06. marts 2016 - 14:00 #8
Og stadig har det ikke noget med en syntaksfejl eller lignende at gøre. Det kan være et uendeligt loop eller lignende, men det er der ikke i det jeg skrev, så jeg spørger igen: kan du vise hvad du har?
Avatar billede riefart Seniormester
07. marts 2016 - 15:28 #9
Jeg har fundet en anden løsning. Smid et svar, så lukker jeg tråden.
Avatar billede Slater Ekspert
08. marts 2016 - 08:39 #10
Du fandt selv løsningen, så du tager bare pointene selv.

Men for at hjælpe andre, der kunne finde denne tråd i fremtiden med samme problem, ville det være pænt af dig at skrive løsningen.
Avatar billede riefart Seniormester
08. marts 2016 - 16:56 #11
Jeg havde allerhelst ønsket at få indlæst kommentarene til de enkelte blogindlæg umiddelbart under disse, med "fold-ud"-funktion. I stedet valgte jeg løsningen; at medsende en variabel(indlægs-id) i url'en til en ny side hvor det aktuelle indlæg med kommentarer vises.
Ganske lavpraktisk, men vist også den mest almindelige.
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