21 online Udvikleren.dk > PHP >

Nyhedssystem med brugerkommentarer

Københavnsk Macbook- og iPad-tyv: Sporet og anholdt på 20 minutter med GPS

Københavnsk Macbook- og iPad-tyv: Sporet og anholdt på 20 minutter med GPS

En københavnsk tyveknægt fik ikke megen morskab ud af at stjæle en Macbook og en iPad. Politiet kunne spore tyven og anholde ham på 20 minutter via iPad'ens GPS. [Læs mere | 0 kommentarer]
 

Kasper (TSW)
Forfatter: Kasper (TSW)
Artikler skrevet: 14
UP tjent på artikler: 13.250

Hits: 14209
Niveau: Nybegynder
Artikel UP: 1.000

Rating: En rating på 3,7 ud af 27 stemme(r)

Nyhedssystem med brugerkommentarer

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...
Denne artikel har en rating på 3,7 ud af 27 stemme(r).

Kommentarer
Bruger
chhr @ 31-03-2003 10:18:58
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
Bruger
mikl-dk @ 31-03-2003 19:04:18
Så brokker han sig over, at han har travlt, og så strikker han artikler sammen på samlebånd :)
Bruger
Kasper (TSW) @ 01-04-2003 21:37:45
Hov hov, jeg har skam travlt! :)
Og det er da vist lang tid siden at jeg sidst har skrevet en artikel, synes jeg? :)
Bruger
Martin Olsen @ 22-04-2003 12:42:44
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
Bruger
Thomas Due @ 22-04-2003 14:05:03
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.
Bruger
N/A @ 29-04-2003 22:20:55
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 ??
Bruger
Martin Dybdal @ 03-05-2003 10:59:23
Jeg tror ikke der er så mange af os newbies der kan få det til at virke... :(
Bruger
Mathias S. Pedersen @ 13-05-2003 19:10:42
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
Bruger
Kasper (TSW) @ 25-05-2003 23:36:10
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 :)
Bruger
N/A @ 02-06-2003 12:44:21
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" ?
Bruger
sune @ 12-06-2003 14:55:46
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
Bruger
Mark S. Johansen @ 16-08-2003 17:49: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
Bruger
Smurf Killer @ 14-12-2003 19:46:18
en rigtig god artikel. jeg forstår godt at han ikke vil bruge tid på connect o.s.v.
Bruger
Jakob @ 06-03-2004 13:51:39
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?
Bruger
Gunnar Kristiansen @ 10-03-2004 00:14:54
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 :-(
Bruger
Rasmus Højlund @ 28-03-2004 21:08:39
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
Bruger
saxe @ 02-04-2004 20:00:45
Fed artikel, i hvert fald for dem der kan finde ud af at rette fejlene selv. Havde sådan set ingen problemer
Bruger
Lars Linnet @ 13-05-2004 21:00:20
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.
Bruger
Lazy @ 15-07-2004 22:25:07
Fin artikel =)..
Bruger
Andreas @ 18-05-2005 19:18:27
Får samme fejl som Jacob Halling, skide irriterende.!
Bruger
BigD @ 30-05-2005 13:14:35
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.
Bruger
Smurf Killer @ 29-07-2005 19:59:17
er det ikke fordi at i ikke har lavet connecten eller har glet et ; at i får den fejl med parse error?
Bruger
Veil- @ 02-10-2005 15:58:51
Go' artikel =D
Bruger
bjørn jensen @ 13-12-2005 13:01:21
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
Bruger
Jacob Veile @ 24-01-2006 15:33:07
Synes nu du skulle rette de fejl som er i den!:D
Bruger
Søren rasmussen @ 28-03-2006 13:13:56
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..
Bruger
Slst @ 19-05-2006 21:33:36
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
Bruger
Andreas @ 09-07-2006 18:25:40
Hvordan laver man det der med at add'e nyheder...?
Bruger
Daniel @ 23-07-2006 23:01:20
Fold kodeboks ind/udKode 


Hvad betyder denne fejl ?
Bruger
Mathias @ 12-09-2006 20:33:38
Fin artikel. :lol:
Bruger
Clara @ 21-10-2006 18:27:14
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
Bruger
Alexander @ 08-04-2007 13:27:17
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!
Bruger
luka1234 @ 09-05-2007 13:55:17
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!
Bruger
Bjørn Øst Hansen @ 20-06-2007 21:01:26
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
Bruger
Kim Vinberg @ 29-07-2007 13:07:28
Niveau: Nybegynder ??

For mange fejl til at være nybegybder.
1/5 fordi den ikke virker som den er posted.
Bruger
Smurf Killer @ 13-01-2008 21:53:00
han siger at man skal har lidt erfaring i PHP, derfor må man også kunne rette eventuelle fejl og mangler


Tilføj rating/kommentar til artiklen
Du skal være logget ind for at tilføje en rating/kommentar til denne artikel.






Klik for at logge ind


Teknologier