Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kommentar system - problem med udtræk fra mysql

0 views
Skip to first unread message

haris

unread,
Dec 5, 2009, 1:27:08 PM12/5/09
to
Hej html'er.

Jeg er i gang med at lave et "kommentar system" til mine nyheder.
Her er tabellerne til databasen:

#Nyheder
CREATE TABLE `nyheder` (
`id` int(11) NOT NULL auto_increment,
`overskrift` varchar(255) NOT NULL,
`nyhed` longtext NOT NULL,
`kommentarer` int(1) NOT NULL default '0',
`forfatter` varchar(255) NOT NULL,
`dato` date NOT NULL,
`ip` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

#Kommentarer
CREATE TABLE `nyheds_kommentarer` (
`id` int(11) NOT NULL auto_increment,
`nyheds_id` int(11) NOT NULL default '0',
`navn` varchar(255) NOT NULL,
`kommentar` varchar(255) NOT NULL,
`dato` date NOT NULL,
`ip` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

N�r jeg har valgt en nyhed - med id, kan jeg sagtens f� det vist
frem og alt det der. Fx: index.php?site=nyheder&id=9.
- Det, jeg gerne vil lave, er, at inde p� nyheds siden - hvor
alle nyhederne
er, vil jeg gerne have, at man kan se, hvor mange kommentarer der
er til hver nyhed.

Fx:
Nyhed 1.
Headline
tekst tekst tekst tekst tekst tekst tekst tekst
tekst tekst tekst tekst tekst tekst tekst tekst

(9) kommentarer.
Nyhed 2.
Headline
tekst tekst tekst tekst tekst tekst tekst tekst
tekst tekst tekst tekst tekst tekst tekst tekst

(4) kommentarer.

Hvordan kan jeg f� kaldt de kommentarer frem, der er til den
p�g�lende nyhed, uden at v�re under det p�g�ldende id - hvis i
forst�r. Alts� n�r man er inde p� index.php?site=nyheder.

Forst�r i hvad jeg mener?

//Haris

--
Vil du l�re at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- P�dagogiske tutorials p� dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

haris

unread,
Dec 6, 2009, 10:10:40 AM12/6/09
to
Ingen der har noget svar?
- Hvis det er fordi, det ikke er forst�eligt nok, skal jeg nok
uddybe mig lidt mere.

Leif Neland

unread,
Dec 6, 2009, 3:21:35 PM12/6/09
to
haris skrev:

> Ingen der har noget svar?
> - Hvis det er fordi, det ikke er forst�eligt nok, skal jeg nok
> uddybe mig lidt mere.
>

M�ske er der ingen, der kan se hvad der skulle v�re af problemer i det?

Leif

--
Jeg foretr�kker min the tilberedt efter BS6008

haris

unread,
Dec 6, 2009, 4:57:57 PM12/6/09
to
Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
> M�ske er der ingen, der kan se hvad der skulle v�re af problemer i dets?

Mit problem er, at jeg ikke kan f� kaldt antallet af de kommentarer, der
er for hver nyhed, frem uden at v�re inde p� en valgt nyhed.

Alts�:
index.php?site=nyheder&id=7
- Det viser min nyhed med id 7. Da id'et er valgt, er det nemt nok at
tr�kke kommentarene ud.

Hvis jeg er inde p�:
index.php?site=nyheder (hvor alle nyhederne vises), kan jeg ikke f� vist
kommentarene frem til nyheden, da der ikke er valgt et id.

Forst�r du nu?

Leif Neland

unread,
Dec 6, 2009, 5:27:03 PM12/6/09
to
haris skrev:

> Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
>> M�ske er der ingen, der kan se hvad der skulle v�re af problemer i dets?
>
> Mit problem er, at jeg ikke kan f� kaldt antallet af de kommentarer, der
> er for hver nyhed, frem uden at v�re inde p� en valgt nyhed.
>
> Alts�:
> index.php?site=nyheder&id=7
> - Det viser min nyhed med id 7. Da id'et er valgt, er det nemt nok at
> tr�kke kommentarene ud.
>
> Hvis jeg er inde p�:
> index.php?site=nyheder (hvor alle nyhederne vises), kan jeg ikke f� vist
> kommentarene frem til nyheden, da der ikke er valgt et id.
>
SELECT nyheder.id,overskrift,nyheder.dato,count(*) AS antal
FROM nyheder LEFT JOIN nyheds_kommentarer
ON nyheder.id=nyheds_kommentarer
GROUP BY nyheder.id,overskrift
Seneste f�rst:
ORDER BY nyheder.dato DESC
Mest kommentereder:
ORDER BY count(*) DESC

haris

unread,
Dec 7, 2009, 10:07:23 AM12/7/09
to
Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
> SELECT nyheder.id,overskrift,nyheder.dato,count(*) AS antal
> FROM nyheder LEFT JOIN nyheds_kommentarer
> ON nyheder.id=nyheds_kommentarer

Jeg har pr�vet at s�tte dette ind:

$n_rez = mysql_query( "SELECT id,overskrift,nyhed,dato,count(*) AS antal FROM
nyheder LEFT JOIN ON id=nyheds_kommentarer GROUP BY id");
while ($n_arr = mysql_fetch_array($n_rez)) {

Ender ud med dette:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /host/w/e/b/website2/Praxic/orden/test2.php on line 6

Efter at have set lidt forskellige steder, burde dit eksempel virke, men jeg
m� have lavet en fejl.

//Haris.

Martin

unread,
Dec 7, 2009, 11:00:13 AM12/7/09
to
On 07-12-2009 16:07, haris wrote:
> Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
>> SELECT nyheder.id,overskrift,nyheder.dato,count(*) AS antal
>> FROM nyheder LEFT JOIN nyheds_kommentarer
>> ON nyheder.id=nyheds_kommentarer
>
> Jeg har pr�vet at s�tte dette ind:
>
> $n_rez = mysql_query( "SELECT id,overskrift,nyhed,dato,count(*) AS antal FROM
> nyheder LEFT JOIN ON id=nyheds_kommentarer GROUP BY id");

Brug ALTID

$n_rez = mysql_query(.....) OR DIE (mysql_error());

S� f�r man en dejlig fejl hvis der skulle v�re fejl i din query, som der
er i din...

> while ($n_arr = mysql_fetch_array($n_rez)) {
>
> Ender ud med dette:
>
> Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
> resource in /host/w/e/b/website2/Praxic/orden/test2.php on line 6

Fejl i querien

Leif Neland

unread,
Dec 7, 2009, 1:28:54 PM12/7/09
to
haris skrev:

> Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
>> SELECT nyheder.id,overskrift,nyheder.dato,count(*) AS antal
>> FROM nyheder LEFT JOIN nyheds_kommentarer
>> ON nyheder.id=nyheds_kommentarer
>
> Jeg har pr�vet at s�tte dette ind:
>
> $n_rez = mysql_query( "SELECT id,overskrift,nyhed,dato,count(*) AS antal FROM
> nyheder LEFT JOIN ON id=nyheds_kommentarer GROUP BY id");
> while ($n_arr = mysql_fetch_array($n_rez)) {
>
> Ender ud med dette:
>
> Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
> resource in /host/w/e/b/website2/Praxic/orden/test2.php on line 6
>
> Efter at have set lidt forskellige steder, burde dit eksempel virke, men jeg
> m� have lavet en fejl.
>
Ja. Der er en kolonne, der hedder id i begge tabeller, s� derfor skal de
kvalificeres. Det er derfor jeg skriver
SELECT nyheder.id,
og
ON nyheder.id=nyheds_kommentarer.nyhedsid

Hvorfor klippe-klistrede du ikke bare? :-)

haris

unread,
Dec 7, 2009, 4:44:36 PM12/7/09
to
Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
> Hvorfor klippe-klistrede du ikke bare? :-)

Det gjorder jeg ogs� i starten, men det gav ogs� fejl. Derefter pr�vede jeg at
rette id'erne, som de var i tabellerne. Jeg misforst�r, hvilke id'er du har gang
i.
Hvis vi lige gennemg�r dem:
> SELECT nyheder.id, ....
Jeg gik ud fra, at nyheder.id var det id, der er for hver nyhed, s� jeg �ndrede
det til id, som det hedder i tabellen.

> LEFT JOIN ON nyheder.id=nyheds_kommentarer
Med nyheder.id har jeg pr�vet at lave det om til nyheds_id, som er en af mine
id'er i kommentar tabellen, men jeg har ogs� pr�vet med id. De to id'er burde have
det samme tal.

> GROUP BY nyheder.id,overskrift
Der gik jeg ud fra, at det var fra nyheds_tabellen, s� jeg lavede det om til id,
overskrift.

Nu ser den s�ledes ud:


$n_rez = mysql_query( "SELECT id,overskrift,nyhed,dato,count(*) AS antal FROM

nyheder LEFT JOIN nyheds_kommentarer ON nyheds_id=nyheds_kommentarer GROUP BY
id,overskrift") OR DIE (mysql_error());

Fejlmeddelsen:
Column 'id' in field list is ambiguous

//Haris

Gert Krabsen

unread,
Dec 7, 2009, 4:57:11 PM12/7/09
to
haris skrev:

> Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
>> Hvorfor klippe-klistrede du ikke bare? :-)
>
> Det gjorder jeg ogs� i starten, men det gav ogs� fejl. Derefter pr�vede jeg at
> rette id'erne, som de var i tabellerne. Jeg misforst�r, hvilke id'er du har gang i.
> Hvis vi lige gennemg�r dem:
>> SELECT nyheder.id, ....
> Jeg gik ud fra, at nyheder.id var det id, der er for hver nyhed, s� jeg �ndrede
> det til id, som det hedder i tabellen.
>
>> LEFT JOIN ON nyheder.id=nyheds_kommentarer
> Med nyheder.id har jeg pr�vet at lave det om til nyheds_id, som er en af mine
> id'er i kommentar tabellen, men jeg har ogs� pr�vet med id. De to id'er burde have
> det samme tal.

Du er ikke s�rlig konsekvent i din felt-navngivning. Det interessante er
ikke, om de har samme tal, men hvad feltnavnene er.

Det kan godt v�re de er ens men husk, at edb er dum som en d�r! Alt skal
pindes ud. Den 'g�r aldrig ud fra' noget.

>> GROUP BY nyheder.id,overskrift
> Der gik jeg ud fra, at det var fra nyheds_tabellen, s� jeg lavede det om til id,
> overskrift.

> Nu ser den s�ledes ud:
> $n_rez = mysql_query( "SELECT id,overskrift,nyhed,dato,count(*) AS antal FROM
> nyheder LEFT JOIN nyheds_kommentarer ON nyheds_id=nyheds_kommentarer GROUP BY
> id,overskrift") OR DIE (mysql_error());
>
> Fejlmeddelsen:
> Column 'id' in field list is ambiguous

Klart - n�r du har et felt 'id' i begge tabeller i sql'en - hvordan skal
den s� vide, hvilken den skal vise?

Og husk, at det som regel ikke er tilladt at summere p� *

S� noget i retning af (med forbehold for, at vi ikke kender meget til
din datastruktur (g�r du selv det? :-)

SELECT
nyheder.id, nyheder.overskrift, nyheder.nyhed, nyheder.dato,
count(nyheds_kommentarer.id) AS antal


FROM nyheder
LEFT JOIN nyheds_kommentarer

ON nyheder.nyheds_id=nyheds_kommentarer.nyheds_id
GROUP BY nyheder.id, nyheder.overskrift, nyheder.nyhed, nyheder.dato"


haris

unread,
Dec 7, 2009, 5:11:57 PM12/7/09
to
Gert Krabsen wrote in dk.edb.internet.webdesign.serverside.php:

> Klart - n�r du har et felt 'id' i begge tabeller i sql'en - hvordan skal
> den s� vide, hvilken den skal vise?
S� jeg skal ikke have id i hver tabel?

> S� noget i retning af (med forbehold for, at vi ikke kender meget til
> din datastruktur (g�r du selv det? :-)

Forst�r da dit sp�rgsm�l, og dog. Jeg forst�r min datastruktur. Jeg er en nybegynder,
har ikke arbejdet med s� mange forskellige ting, s� jeg er stadig under udvikling. Jeg
har dog f�et en stor hj�lp fra en erfaren programm�r.

> SELECT
> nyheder.id, nyheder.overskrift, nyheder.nyhed, nyheder.dato,
> count(nyheds_kommentarer.id) AS antal
> FROM nyheder
> LEFT JOIN nyheds_kommentarer
> ON nyheder.nyheds_id=nyheds_kommentarer.nyheds_id
> GROUP BY nyheder.id, nyheder.overskrift, nyheder.nyhed, nyheder.dato"

Tak for det hurtige svar og opdelingen af de forskellige id'er. Det forst�s bedre nu.
> count(nyheds_kommentarer.id) AS antal
Jeg har ikke noget nyheds_kommentarer_id i min nyhedstabel. Jeg s� lige, at der var en
r�kke med "kommentarer" i nyhedstabellen - det er en fejl. Den har ikke nogen funktion,
men det skal der m�ske v�re?

- Tak for det hurtige svar.

Stig Johansen

unread,
Dec 7, 2009, 10:44:16 PM12/7/09
to
haris wrote:

> Jeg s� lige,
> at der var en r�kke med "kommentarer" i nyhedstabellen - det er en fejl.
> Den har ikke nogen funktion, men det skal der m�ske v�re?

Jeg har undret mig fra starten over hvorfor du ikke brugte det felt.
Den bedste metode er at opdatere antal kommentarer (i feltet) under hver
nyhed, n� der kommer nye kommentarer.

P� den m�de undg�r du join og count, der er rimeligt performancekr�vende i
forholdt til informationen.

--
Med venlig hilsen
Stig Johansen

Leif Neland

unread,
Dec 8, 2009, 7:58:29 AM12/8/09
to

"Stig Johansen" <wop...@gmaill.com> skrev i en meddelelse
news:4b1dcca2$0$276$1472...@news.sunsite.dk...
Det er vel der, hvor man m� opveje performance imod en p�n normalisering af
databasen.
Hvis kommentar-tabellen er indexeret p� nyheds_id. burde det ikke v�re
tungt.

Det kan hurtigt blive lidt langh�ret at skulle holde styr p� antallet ved
hver opdatering, hvis der kan t�nkes at komme opdateringer fra flere brugere
p� een gang.

Leif


Leif Neland

unread,
Dec 8, 2009, 8:03:10 AM12/8/09
to

"haris" <haris_sk...@hotmail.com> skrev i en meddelelse
news:4b1d7744$0$269$1472...@news.sunsite.dk...

> Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
>> Hvorfor klippe-klistrede du ikke bare? :-)
>
> Det gjorder jeg ogs� i starten, men det gav ogs� fejl. Derefter pr�vede
> jeg at
> rette id'erne, som de var i tabellerne. Jeg misforst�r, hvilke id'er du
> har gang
> i.
> Hvis vi lige gennemg�r dem:
>> SELECT nyheder.id, ....
> Jeg gik ud fra, at nyheder.id var det id, der er for hver nyhed, s� jeg
> �ndrede
> det til id, som det hedder i tabellen.
>

NEJ NEJ NEJ ;-)

Du mangler vist lige at forst� hvad punktum betyder.
nyheder.id = nyheds_kommentarer.nyheds_id

Tabellen nyheder,felt id skal v�re lig tabellen nyheds_kommentarer, feltet
nyheds_id

tabel.felt

Kan endda v�re

database.tabel.felt

Leif


haris

unread,
Dec 8, 2009, 9:43:01 AM12/8/09
to
Leif Neland wrote in dk.edb.internet.webdesign.serverside.php:
> Kan endda v�re
> database.tabel.felt

Det fandt jeg hurtigt ud af. Jeg troede, at det med tabel.felt var noget du
gjorde for, at jeg nemmere kunne forst� det. :)
Men der tog jeg fejl - fik lige l�rt noget nyt.

Har f�et det til at virke nu - efter jeg brugte det med tabel.felt.
Her er det:

"SELECT nyheder.id, overskrift, nyhed, nyheder.dato, count(*) AS antal FROM


nyheder LEFT JOIN nyheds_kommentarer ON

nyheder.id=nyheds_kommentarer.nyheds_id GROUP BY nyheder.id, overskrift"

Mange tak for hj�lpen Leif.

// Haris

0 new messages