Nyhedssystem med brugerkommentarer

Tags:    php
Skrevet af Bruger #1 @ 30.03.2003
Jeg har fået indtryk af at en del Udviklere finder det vanskeligt at lave et nyhedssystem med kommentarer i PHP/MySQL. Der er jo allerede en masse artikler her på Udvikleren.dk om hvordan man putter ting i en database og hiver dem ud igen, så i princippet burde det jo ikke være så svært. Jeg tror lidt at det er når kommentarer skal hænge sammen med en nyhed, at det bliver lidt svært for nogen. Hvordan skal det laves i databasen? Skal det hele placeres i samme tabel, eller deles op over flere? Hvordan hiver man kommentarer ud til en specifik nyhed? Alt dette vil blive besvaret længere nede...

Det er i øvrigt værd at nævne, at selvom et nyhedssystem lyder meget simpelt, så kan det jo også bruges til meget andet. Personligt har jeg lavet et såkaldt blog (weblog) system, ud fra de teknikker der vil blive vist i denne artikel, og med lidt modificering, kan koden også bruges til mange andre ting. Denne artikel forudsætter at du ved lidt om PHP, ved hvordan du tilslutter dig til en MySQL database osv. Der vil ikke være kode til et komplet system, men derimod en del teori samt kode der kan sættes sammen til et fuldt funktionelt system. Dem der gerne vil lære lidt mere og PHP og/eller MySQL, bør kigge på http://www.udvikleren.dk/show_articles.php?kat=6 (PHP/MySQL artikler).

Databasetabeller



Ja, så har jeg vist allerede afsløret at vi skal bruge mere end én tabel :). For dem der ved lidt om design af databaser, vil dette virke meget logisk, men jeg forklarer det nu alligevel!
Vi opretter to tabeller, en til kommentarer og en til nyheder, og knytter dem så til hinanden med et ID – dette kaldes en relation. I fx Access vil man oprette denne relation og kunne se den, men i MySQL tænker man sig lidt til den :). Når vi henter kommentarer, vil de allesammen have knyttet en nyhed til sig, via et ID. Jeg vil nu vise tabelstrukturerne, så i bedre kan danne jer et overblik over hvad jeg mener:

Fold kodeboks ind/udKode 


Tabellerne oprettes lettest ved at smide det hele ind i SQL feltet under PHPMyAdmin, hvis det er tilgængeligt. Ellers kan det gøres gennem en Telnet-session eller lignende :).

Som lovet vil jeg gerne forklare lidt omkring teorien bag den måde at bygge systemet op på, nærmere beteget den måde nyhederne og kommentarerne er knyttet sammen. Jeg har allerede fortalt lidt om det, men da jeg tror at det er på netop dette punkt at en del Udviklere kommer i tvivl, vil jeg lige slå det helt fast: Hver nyhed og hver kommentar har sit eget, unikke ID. Hver kommentar har også et nyhedsid, der hænger sammen med et unikt ID på en nyhed. På den måde er en nyhed ikke knyttet til en kommentar (det ville ikke give nogen mening), men en kommentar er altid knyttet til en nyhed. Dette kaldes en en-til-mange relation, da hver nyhed kan have mange kommentarer, men hver kommentar kun kan have én nyhed. Når vi vil hente kommentarer for en nyhed, kan vi bare hente dem der har det nyhedsid for den nyhed som vi gerne vil vise kommentarer for. Det kan måske lyde lidt kryptisk - forstår du det ikke første gang, kan det godt læses flere gange, da det er et vigtigt element i måden at lave databasesystemer på.

Når tabellerne er oprettet, skal vi i gang med det sjove: PHP koden :)

Noget kode...



Mere skal der sådan set ikke til. Nu skal vi så have lidt kode til at hive noget data ud, men til at starte med vil det nok være smartere at oprette noget HTML/PHP kode, der kan indsætte ting i databasen. Det der skal bruges er sådan set bare en formular til at indsætte nyheder i systemet (man kan enten selv lave noget, eller bruge PHPMyAdmin til opgaven), og så en formular hvor brugerne kan indtaste kommentarer til nyhederne. Det sidste kan du se i eksemplet, hvordan jeg har gjort.

Nu følger lidt kode der viser hvordan man hiver alle nyheder ud af databasen, og viser dem én efter én. Der bliver samtidig lagt et link kommentarerne. Dette link aktiverer et popup-vindue, hvor brugerne kan læse eksisterende kommentarer, samt skrive en ny. Dette kan naturligvis sagtens gøres anderledes, det er bare at være lidt kreativ og så bytte lidt rundt på koden :).

Fold kodeboks ind/udKode 


Så simpelt er det :). Jeg forklarer lidt om hvad de enkelte linier gør: Vi lægger hårdt ud med en SQL forespørgsel. Den er meget simpel, og går ganske enkelt bare ind og henter alle nyheder i tabellen, og sorterer dem efter dato (nyeste først - desc). Derefter tjekker vi om forespørgslen giver et antal rækker tilbage over 0. Hvis det er tilfældet er der nyheder som vi viser, ellers skriver vi en fin besked til brugeren om at der endnu ikke er tilføjet nogen nyheder. Vi bruger nu en while løkke til at løbe igennem alle resultaterne af forespørgslen. For hver gang vi itererer gennem while-løkken, placerer vi et array af den række i $r. På den måde kan vi nu kigge i $r, for at finde de info vi har hevet ud af tabellen – det gør vi så for at hente emne, forfatter, dato og nyhed ud.

Med nyhed laver vi lige et par ekstra tricks. For det første bruger vi stripslashes, der sørger for at fjerne eventuelle \\ tegn der er tilføjet (bliver tilføjet hvis man bruger ” eller ’ tegn i nyheden), hvilket vi også gør på emne. Derudover vil vi gerne have at eventuelle linieskift rent faktisk vises, så med nl2br konverterer vi dem til <br> tags.


Det eneste vi nu mangler, er det med kommentarerne. Vi vil jo gerne være lidt brugervenlige, så i stedet for bare et normalt link til at skrive/læse kommentarer, vil vi også lige fortælle brugeren hvor mange kommentarer der allerede er tilføjet. Vi gør det med en SQL forespørgsel der tæller antallet af rækker med det nyhedsid vi kigger på lige nu, og derefter et mysql_result, der giver resultatet af COUNT funktionen. Når det er klart, har vi de variabler vi skal bruge, og udskriver nyheden. Det er der ikke så mange ben i, måske lige bortset fra det stykke JavaScript der er med. Det gør simpelthen bare at der åbnes et nyt lille vindue til læsning/skrivning af kommentarer.

Som du kan se, linker vi, via JavaScript koden, til en fil der hedder kommentarer.php. Det er den vi gerne vil have til at vise vores kommentarer. Det kræver lige lidt mere kode, da jeg også viser hvordan man kan opstille en formular til at lade brugeren tilføje kommentarer. Så selvom jeg påstod at der ikke vil være en komplet løsning til denne artikel, så er det faktisk ved at være tæt på :). Her kommer lidt kode, og derefter en forklaring.

Fold kodeboks ind/udKode 


Vi starter lidt blødt ud med en masse linier kode, der egentlig gør meget lidt. For at være sikker på at vi hele tiden har styr på id’et der angiver nyheden og i første omgang kommer fra nyheds-siden, laver vi lige lidt fix-faxerier :). I de ”gode” gamle dage sagde man jo bare $id, der så kunne komme fra cookies, GET, POST eller noget helt andet, men det er jo (heldigvis, kan man så sige) nu ændret. Derfor er vi nødt til at tjekke om $id bliver smidt af et POST request (vores formular). Gør det det, tager vi det derfra, og ellers så tager vi det fra GET (fra siden med nyhederne). For en sikkerheds skyld tjekker vi lige om den har en værdi, for hvis den ikke har det, så er der ingen grund til at begynde på MySQL osv. Så altså, har vi ikke et id på en nyhed, så udskriver vi kun en fejl om det til brugeren – ellers henter vi kommentarer (hvis der er nogen), og viser en formular der lader brugeren tilføje.

Det første vi gør, hvis vi har et nyhedsid, er at tjekke om brugeren har forsøgt at tilføje en kommentar. Dette gør vi ved at tjekke på POST variablen add_comment, som er navnet på knappen. Er denne variabel sat, betyder det at brugeren gerne vil tilføje en kommentar, så det gør vi. Man kan evt. tilføje lidt validering ved at tjekke om navn og mail er sat, på samme måde som jeg tjekker på add_comment, men da det nok ikke er alle der synes at det er relevant at tage med til så simpelt et system, har jeg udeladt det. Anyway, hvis der skal tilføjes en kommentar, henter vi alle variablerne ud af POST, og tilføjer \\ tegn til kommentar med addslashes (for at undgå MySQL fejl hvis brugeren indtaster ” eller ’ tegn). Derefter kører vi en simpel INSERT SQL forespørgsel, tjekker om den er gået godt, og udskriver enten en fejl eller en ”Tak for kommentaren”-notits :). Der fra er det faktisk meget simpelt: Vi laver en SQL forespørgsel der henter alle kommentarer til den nyhed vi har angivet med nyhedsid, og viser dem på præcis samme måde som vi gjorde det med selve nyhederne. Til sidst har vi så den HTML formular der lader brugeren tilføje en kommentar, og som omtales længere oppe.

Færdig?



Ja, der er vel ikke så meget mere at sige. Selvfølgelig er der ting der kunne gøres pænere, først og fremmest designet, som jeg overhovedet ikke har rørt ved :). Derudover er der ting som dato’en, der kommer ud i amerikansk format, plus nogle andre, mindre, detaljer. Alt dette kan du dog selv gøre noget ved, eller evt. spørge om hjælp til, her på Udvikleren.dk :). God fornøjelse med det...

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (37)

User
Bruger #2495 @ 31.03.03 10:18
Nice artikel her :)
Jeg har selv gået og tænkt over hvordan man nu egentlig lavede det her, så jeg har lært en del af den her artikel :-)
Keep up the good work :D
User
Bruger #285 @ 31.03.03 19:04
Så brokker han sig over, at han har travlt, og så strikker han artikler sammen på samlebånd :)
User
Bruger #1 @ 01.04.03 21:37
Hov hov, jeg har skam travlt! :)
Og det er da vist lang tid siden at jeg sidst har skrevet en artikel, synes jeg? :)
User
Bruger #3621 @ 22.04.03 12:42
mangler der ikke noget??
så følgelig kan man selv lave tilføj tingen, men ville det ikke være bedre med en funktion lavet af forfatteren (sådan for at få det hele til at gå op i en helhed)

[syntaksen er altså heller ikke for pæn]

men ellers er det da en god artikel til at starte med ...

tf
User
Bruger #123 @ 22.04.03 14:05
Det er sikkert en god artikel, jeg har ingen forstand på PHP, det var et tilfælde jeg kom herind. Men det er til at blive hysterisk af når der ikke er en ordentlig linie-ombrydning i artikler og forum posts. Det burde være en smal sag for Kasper at skrive en funktion som ombryder tekst inde i en [pre] blok.
User
Bruger #3530 @ 29.04.03 22:20
Dårlig artikel fra en ellers så glimrende skribent :)

Ej den er overhovedet ikke nok gennemført til os mindre erfarne PHP/MySQL brugere kan nemlig ikke selv få det til at virke ??
User
Bruger #3491 @ 03.05.03 10:59
Jeg tror ikke der er så mange af os newbies der kan få det til at virke... :(
User
Bruger #3898 @ 13.05.03 19:10
Meget fin artikel bare lige et problem... Det virker ikke ( ihvertfald hos mig )... Jeg er rimelig ny i PHP men kan ikke se nogen fejl... :I
User
Bruger #1 @ 25.05.03 23:36
Martin: Jeg tager gerne i mod konstruktiv kritik omkring min syntax, hvis du altså har noget af den slags :). Alle gør det jo som regel på sin egen måde, men hvad er det du mener jeg gør forkert?

Webwizard: Det er med vilje at jeg skriver mere forklaring end kode. Jeg ser gerne at folk skal lære noget af artiklen, frem for at copy/paste et system til deres egen side :). Jeg tror lidt at du forveksler det med en gennemarbejdet artikel, med en artikel der har en komplet codelisting der kan copy/pastes. Desuden skriver jeg faktisk også at man skal have lidt erfaring med PHP og MySQL for at lave det - derfor mener jeg bestemt at min artikel lever op til kravene. Du skal være meget velkommen til at argumentere lidt mere for det modsatte, hvis du har lyst :)
User
Bruger #3530 @ 02.06.03 12:44
Ja, det vil jeg gerne for jeg forstår ikke hvad man får ud af at læse en ugennemarbejdet artikel ? da du jo selv skrev:
"Jeg tror lidt at du forveksler det med en gennemarbejdet artikel" ?
User
Bruger #4071 @ 12.06.03 14:55
Er der ikke nogen der har lagt de filer ned på en ftp. som jeg kan hente for mig virker ikke når jeg laver det.. plz.. sune17@msn.com på msn :D

Hilsen
Sune
User
Bruger #4302 @ 16.08.03 17:49
den er nu god nok i skal jov også huske det kun er en artikkel og ikke en copy/past som Kasper siger vis i kikker ordenligt efter er der ingen connect i atiklen så der er jeres problem med connect :-)....

// Barney
User
Bruger #3353 @ 14.12.03 19:46
en rigtig god artikel. jeg forstår godt at han ikke vil bruge tid på connect o.s.v.
User
Bruger #5378 @ 06.03.04 13:51
Ja, jeg har det lidt som Mathias S. Pedersen. Jeg er også meget ny inden for PHP og det virker heller ikke ved mig.
Jeg har gjort som der er blevet sagt, jeg har lavet det første script til at hede "index.php" og det andet til "kommentarer.php" og den siger (uden jeg har røret ved noget overhovedet); "Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in /customers/dronerax.dk/dronerax.dk/httpd.www/test/index.php on line 22
"

Og ca. det samme ved den anden- Hvad går der galt?
User
Bruger #5293 @ 10.03.04 00:14
Nedtur... havde lige håbet at kunne bruge denne artikel til noget spændende, men med så mange fejl/huller er det ikke nemt at være newbie :-(
User
Bruger #5515 @ 28.03.04 21:08
Kasper, tag da og lav det der så vi kan connecte til vores mysql database.. Der er nogle der ikke er så gode til det der :D
User
Bruger #2270 @ 02.04.04 20:00
Fed artikel, i hvert fald for dem der kan finde ud af at rette fejlene selv. Havde sådan set ingen problemer
User
Bruger #5279 @ 13.05.04 21:00
Selv om at artiklen er godt skrevet så er der for mange fejl i din kode, f.eks. escaper du ikke hvor der skal være escape. :)...

du kunne i det mindste have prøvet koden igennem før du valgte og bruge den i en artikel.

godt nok skal det ikke være copy/paste men der skal heller ikke være fejl i den kode man har... det forvirre lidt for meget...

jeg har skam fået den til at virke ved at omskrive det meste af koden, men det gør ikke det store for mig, da det faktisk bare var strukturen jeg havde brug for.
User
Bruger #5956 @ 15.07.04 22:25
Fin artikel =)..
User
Bruger #7590 @ 18.05.05 19:18
Får samme fejl som Jacob Halling, skide irriterende.!
User
Bruger #7553 @ 30.05.05 13:14
Synes den er god det enste jeg kunne tænke mig er at den var fulgt med hvad siger angår. Synes da det er sjovt at lave conecten selv til mySQL databsen.
User
Bruger #3353 @ 29.07.05 19:59
er det ikke fordi at i ikke har lavet connecten eller har glet et ; at i får den fejl med parse error?
User
Bruger #7603 @ 02.10.05 15:58
Go' artikel =D
User
Bruger #8431 @ 13.12.05 13:01
Fed nok artikel, forstår ikke hvorfor folk bitcher
så meget, det er rart med en artikel med mere teori end C/P kode. 5 til dig herfra
User
Bruger #8516 @ 24.01.06 15:33
Synes nu du skulle rette de fejl som er i den!:D
User
Bruger #9731 @ 28.03.06 13:13
Fem her fra mig,

selv om jeg er ny her inde for php, så synes jeg det er en fin artikle, da men skal skal connecte og hvis det virkelig er et så stort et problem at lave en connect til mysql databasen så tag dog for helvede og lær lortet, eller hent et script som indeholder connect og brug den..
User
Bruger #10006 @ 19.05.06 21:33
Wow. Lige hvad jeg skulle bruge. Og den virker perfekt. Dog et par fejl i koden, men det kan nemt ordtnes. Se selv www.xn--slot-jra.dk hvor jeg har lagt systemet ud på. Jeg har dog selv lavet så man skal være logget ind, for at kunne tilføje kommentarer, men i kan se det virker, når man er logget ind. Forresten så opret lige en bruger derinde :D

Og så vil jeg sige, Mange tak for denne artikel, ligesådan en jeg skulle bruge :D
User
Bruger #8884 @ 09.07.06 18:25
Hvordan laver man det der med at add'e nyheder...?
User
Bruger #10285 @ 23.07.06 23:01
Fold kodeboks ind/udKode 


Hvad betyder denne fejl ?
User
Bruger #10509 @ 12.09.06 20:33
Fin artikel. :lol:
User
Bruger #10723 @ 21.10.06 18:27
En super-god artikel!

Jeg skulle lige prøve den af ;)
Der var nogle enkelte fejl der lige skulle rettes, men nu ser det ud til at virke :)

Desuden synes jeg måske godt du kunne have forklaret en smule mere omkring visse ting - som newbie måtte jeg lige vride hjernen lidt for at forstå det hele... P.g.a. det og de små småfejl har eg givet den 4 - for det var alligevel en supergod artikel :D
User
Bruger #11195 @ 08.04.07 13:27
Eej, hvor er det dog dejligt - for et par måneder siden da jeg først lige begyndte at lære PHP, forstod jeg BJÆLDE af NOGLE artikler - og slet ikke den her! Aaalt for advanceret. Men jeg har taget det stille og roligt, og lige pludselig er det der noget som er herre easy!

Men til artiklen:
Jeg synes den er fed! Det eneste jeg dog har lært af den, nu hvor jeg forstår den, er lidt om while løkker. Men synes den er fed forklaret, og du skriver i et dejligt sprog, så den ikke virker alt for proffesionel, men personeligt (tror også en del er af smileys. ;P) - dejligt. :D!
Og sikkerheden er OK! - Copy/pastere får alligevel en hel del sikkerhed ved bare addslashing/stripslashing! Den får 4/5, ved sgu ikke hvad der mangler før den sidsste, men der mangler ét eller andet. ;P!
User
Bruger #11790 @ 09.05.07 13:55
Jeg synes den er så dårlig ! Der står jo ikke engang hvad siderne skal hedde ! lav det dog og sæt til download så folk kan finde ud af det!
User
Bruger #5978 @ 20.06.07 21:01
må også sige den ik er helt optimal, fint man skal lære, men når man får
Fold kodeboks ind/udKode 
på din kode så bliver jeg ihvertfald lidt irriteret, fint at lære, men redskaberne skal være i orden
User
Bruger #11875 @ 29.07.07 13:07
Niveau: Nybegynder ??

For mange fejl til at være nybegybder.
1/5 fordi den ikke virker som den er posted.
User
Bruger #3353 @ 13.01.08 21:53
han siger at man skal har lidt erfaring i PHP, derfor må man også kunne rette eventuelle fejl og mangler
User
Bruger #17554 @ 22.04.14 19:33
Det er underligt at folk på dette årstal, ikke kunne leve op til denne artikel - man kan jo ikke forvente at få en komplet kode.

Igen som Kasper skriver, så skal folk jo selv lære lidt af det han skriver i artiklen.

Det viser blot bare at disse mennesker ikke gider at prøve at forstå php/mySQL.

Det jo altid nemmere at copy/paste, men hvad lærer man så af dette? (intet).

Arbejd ud fra eksemplet, og man vil lære og forstå. ;)
Eller søg efter "komplete" script på nettet som er klar til brug, hvis man absolut ikke vil lære :B
Der findes flere tusinde komplette scripts på nettet.
Du skal være logget ind for at skrive en kommentar.
t