webForumDet fria alternativet

loop-fel... :(

35 svar · 414 visningar · startad av nakoz · sida 2 av 2

@ndersMedlem sedan juni 200032 969 inlägg
#21

okay, nu får vi fundera lite.

är det alltså så här det ligger till:

man svarar på en fråga, eller på ett svar?

fråga
     svar 1
     svar 2
          svar 3

ser det ut så? hur hänger svar 3 ihop med frågan? du måste 'la ha en frågeid i tabellen på svaren :q

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

emissionMedlem sedan dec. 19996 721 inlägg
#22

Du kan lösa allt i databasen om du vill, även om det blir en hyfsat jobbig SQL-sats.

Detta funkar dock bäst om du har ett forum med formen startmeddelande/svar (otrådat, som på wF).

Är ditt forum trådat?

nakozMedlem sedan dec. 1999653 inlägg
#23

såhär ser databasen ut:

fnamn
fID | Räknare
ForumNamn | Text

finlagg
iID | Räknare
inlagg | Memo/PM
rubrik | Text
av | Text
avID | Tal
datum | Datum/Tid
svarTill | Tal
iForum | Tal

de ska funka i princip som webforum.

de är sammankopplade såhär:
fID - iForum
så inläggen har ett nummer som beskriver vilket forum de hör till, så långt funkar allt bra.

iID - svarTill
i svarTill står inläggets ID vilket svaret hör till. de kan alltså vara 20 inlägg som har samma tal på svarTill.
de finns 2 nivåer, 1 där alla rotinläggen ligger, och 1 där alla svaren finns. typ såhär:

rotinlägg1
- svar1
- svar2
- svar3
rotinlägg2
rotinlägg3
- svar4

inte såhär:
rotinlägg1
- svar1
- - svar2
- - - svar3
rotinlägg2
rotinlägg3
- svar4

Hoppas jag klargjort så att alla förstår strukturen nu..

MVH

------------------
nakoz :)

nakozMedlem sedan dec. 1999653 inlägg
#24

de är otrådat alltså emission :)
MVH

------------------
nakoz :)

@ndersMedlem sedan juni 200032 969 inlägg
#25
...
Do Until rs.EOF
inID = rs("iID")
SQL = "SELECT Count(*) AS AntalSvar FROM finlagg WHERE svarTill = "& inID
Set rs2 = cn.Execute(SQL)
antalsvar = rs2("AntalSvar")
...

borde inte variabeln du använder i svarTill vara fID från den första tabellen / den första sql-frågan?

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

nakozMedlem sedan dec. 1999653 inlägg
#26

hmm... alltså.. den måste ju loopa.. för vi säger att inlagg1 har id 3 och 2 svar.

tabell:
iID | rubrik | svarTill
3 | inlagg1 | 0
4 | svar1 | 3
5 | svar2 | 3
6 | inlagg2 | 0
7 | svar3 | 6

e ni me på att inlagg1 ska ha 2 svar å inlagg2 ska ha 1 svar i en tabell som den ovan?

borde inte variabeln du använder i svarTill vara fID från den första tabellen / den första sql-frågan?

hmm.. vad menar du med det. fID har ju ingenting alls med svaren att göra... å iID (inID) måste ju loopas för att få fram antal svar på nästa post, de är ju de som inte funkar. :\
MVH

------------------
nakoz :)

@ndersMedlem sedan juni 200032 969 inlägg
#27

ja, det är nog jag som missufattar. som vanligt. :(

jag återkommer.

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

nakozMedlem sedan dec. 1999653 inlägg
#28

emission: jag har läst en del databashantering så om du skulle kunna hjälpa mig lite på traven hur en sql-sats i access skulle kunna se ut, eftersom detta inte verkar vilja lösa sig :/

MVH

------------------
nakoz :)

nakozMedlem sedan dec. 1999653 inlägg
#29

jag återkommer.

ja, snälla gör de :)

------------------
nakoz :)

@ndersMedlem sedan juni 200032 969 inlägg
#30

jag återkommer... :)

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

nakozMedlem sedan dec. 1999653 inlägg
#31

jag väntar. :)

------------------
nakoz :)

nakozMedlem sedan dec. 1999653 inlägg
#32

okej, nu e jag verkligen nära en lösning, tror jag.

såhär ser min kod ut:

<!-- #include file="../../inc/dbcons2.asp" -->

<html>
<head>
<title>Futurefitness - Forum</title>

<link type="text/css" rel="stylesheet" href="../../inloggad.css">

</head>
<body bgcolor="#FFFFFF">

<table cellpadding="0" cellspacing="0">
<tr><td width="100%" align="left" valign="top">

<%
Dim fID, inID, rubrik, av, senaste_inlagg, antalsvar, rs2, inID2

SQL = "SELECT fID, ForumNamn FROM fnamn WHERE fID = "& Request("forumID")
Set rs = cn.Execute(SQL)
fID = rs("fID")

Response.Write "<b>"& rs("ForumNamn") &"</b><br><br>"

rs.Close
Set rs = Nothing
SQL = "SELECT * FROM finlagg WHERE svarTill = 0 AND iForum = "& fID
Set rs = cn.Execute(SQL)

If rs.EOF Then
Response.Write "I detta diskussionsforum finns ännu inga inlägg!<br>"
Response.Write "Gå till botten av denna sida för att starta ett nytt ämne.<br><br>"
Else
Response.Write "<table cellpadding=2 cellspacing=1><tr bgcolor=#99B38B><td width=210><b>Ämne:</b></td><td width=100><b>"
Response.Write "Startad av:</b></td><td width=45><b>Svar:</b></td><td width=140><b>Senaste inlägget:</b></td></tr>"

Do Until rs.EOF
SQL = "SELECT Count(*) AS AntalSvar FROM finlagg WHERE svarTill = "& rs("iID")
Set rs2 = cn.Execute(SQL)
antalsvar = rs2("AntalSvar")
rs2.Close
set rs2 = Nothing

SQL = "SELECT * FROM finlagg WHERE iForum = "& fID &" AND svarTill = 0 ORDER BY iID DESC"
Set rs2 = cn.Execute(SQL)

Do Until rs2.EOF
inID = rs2("iID")
rubrik = rs2("rubrik")
av = rs2("av")
senaste_inlagg = rs2("datum")
Response.Write "<tr><td><a href=inlagg.asp?forum="& fID &"&inlagg="& inID2 &">"& rubrik &"</a></td><td>"& av &"</td>"
Response.Write "<td>"& antalsvar &"</td><td>"& senaste_inlagg &"</td></tr>"
rs2.MoveNext
Loop

rs2.Close
set rs2 = Nothing

rs.MoveNext
Loop
Response.Write "</table>"
End If
Response.Write "<br>"

rs.Close
set rs = Nothing
%>

<hr size="1" noshade color="black">
<b>Skriv ett nytt inlägg:</b><br>
<form method="post" action="sparainlagg.asp">
<input type="hidden" name="iForum" value="<%= fID %>">
Ämne:<br>
<%
Response.Write "<input type=""text"" maxlength=""40"" name=""rubrik"" "
If Session("browser") = "nn" Then
	Response.Write "class=""inputNS"" size=""18"""
Else
	Response.Write "class=""inputIE"" size=""30"""
End If
%>><br>
<br>
Inlägg:<br>
<%
Response.Write "<textarea wrap=""VIRTUAL"" name=""inlagg"""
If Session("browser") = "nn" Then
	Response.Write "class=""inputNS"" rows=""6"" cols=""18"""
Else
	Response.Write "class=""inputIE"" rows=""7"" cols=""29"""
End If
%>></textarea><br>
<br>
<input type="checkbox" name="anonym" value="anonym" onFocus="this.blur()"> Jag vill vara anonym<br>
<br>
<%
Response.Write "<input type=""submit"" value=""Skicka"""
If Session("browser") = "nn" Then
	Response.Write "class=""inputNS"""
Else
	Response.Write "class=""inputIE"""
End If
%>><br>
</form></td></tr></table>
</body>
</html>

http://213.66.237.68/nakoz/forum.gif
så ser de ut... den loopar alla 3 inlägg lika många gånger som de finns inlägg i forumet (dvs 3). i ett annat forum så finns de 1 inlägg, å där funkar allt som det ska... hjälp tack!

MVH

------------------
nakoz :)

@ndersMedlem sedan juni 200032 969 inlägg
#33

okej, grabben, jag har ju lovat. vad händer om du gör så här:

<!-- #include file="../../inc/dbcons2.asp" -->
<html>
<head>
<title>Futurefitness - Forum</title>

<link type="text/css" rel="stylesheet" href="../../inloggad.css">

</head>
<body bgcolor="#FFFFFF">

<table cellpadding="0" cellspacing="0">
<tr><td width="100%" align="left" valign="top">

<%
Dim fID, inID, rubrik, av, senaste_inlagg, antalsvar, rs2, inID2

SQL = "SELECT fID, ForumNamn FROM fnamn WHERE fID = "& Request("forumID")
Set rs = cn.Execute(SQL)
fID = rs("fID")

Response.Write "<b>"& rs("ForumNamn") &"</b><br><br>"

rs.Close
Set rs = Nothing
SQL = "SELECT * FROM finlagg WHERE svarTill = 0 AND iForum = "& fID
Set rs = cn.Execute(SQL)

If rs.EOF Then
Response.Write "I detta diskussionsforum finns ännu inga inlägg!<br>"
Response.Write "Gå till botten av denna sida för att starta ett nytt ämne.<br><br>"
Else
Response.Write "<table cellpadding=2 cellspacing=1><tr bgcolor=#99B38B><td width=210><b>Ämne:</b></td><td width=100><b>"
Response.Write "Startad av:</b></td><td width=45><b>Svar:</b></td><td width=140><b>Senaste inlägget:</b></td></tr>"

SQL = "SELECT Count(*) AS AntalSvar FROM finlagg WHERE svarTill = "& rs("iID")
Set rs2 = cn.Execute(SQL)
antalsvar = rs2("AntalSvar")
rs2.Close
set rs2 = Nothing

SQL = "SELECT * FROM finlagg WHERE iForum = "& fID &" AND svarTill = 0 ORDER BY iID DESC"
Set rs2 = cn.Execute(SQL)

Do Until rs2.EOF
inID = rs2("iID")
rubrik = rs2("rubrik")
av = rs2("av")
senaste_inlagg = rs2("datum")
Response.Write "<tr><td><a href=inlagg.asp?forum="& fID &"&inlagg="& inID2 &">"& rubrik &"</a></td><td>"& av &"</td>"
Response.Write "<td>"& antalsvar &"</td><td>"& senaste_inlagg &"</td></tr>"
rs2.MoveNext
Loop
rs2.Close
set rs2 = Nothing

Response.Write "</table>"
End If
Response.Write "<br>"

rs.Close
set rs = Nothing
%>

<hr size="1" noshade color="black">
<b>Skriv ett nytt inlägg:</b><br>
<form method="post" action="sparainlagg.asp">
<input type="hidden" name="iForum" value="<%= fID %>">
Ämne:<br>
<%
Response.Write "<input type=""text"" maxlength=""40"" name=""rubrik"" "
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"" size=""18"""
Else
Response.Write "class=""inputIE"" size=""30"""
End If
%>><br>
<br>
Inlägg:<br>
<%
Response.Write "<textarea wrap=""VIRTUAL"" name=""inlagg"""
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"" rows=""6"" cols=""18"""
Else
Response.Write "class=""inputIE"" rows=""7"" cols=""29"""
End If
%>></textarea><br>
<br>
<input type="checkbox" name="anonym" value="anonym" onFocus="this.blur()"> Jag vill vara anonym<br>
<br>
<%
Response.Write "<input type=""submit"" value=""Skicka"""
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"""
Else
Response.Write "class=""inputIE"""
End If
%>><br>
</form></td></tr></table>
</body>
</html>

fungerar det så berättar jag efteråt vad jag gjort... :)

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

@ndersMedlem sedan juni 200032 969 inlägg
#34

nu då?

<!-- #include file="../../inc/dbcons2.asp" -->
<html>
<head>
<title>Futurefitness - Forum</title>
<link type="text/css" rel="stylesheet" href="../../inloggad.css">

</head>
<body bgcolor="#FFFFFF">

<table cellpadding="0" cellspacing="0">
<tr><td width="100%" align="left" valign="top">

<%
Dim fID, inID, rubrik, av, senaste_inlagg, antalsvar, rs2, inID2

SQL = "SELECT fID, ForumNamn FROM fnamn WHERE fID = "& Request("forumID")
Set rs = cn.Execute(SQL)
fID = rs("fID")

Response.Write "<b>"& rs("ForumNamn") &"</b><br><br>"

rs.Close
Set rs = Nothing
SQL = "SELECT * FROM finlagg WHERE svarTill = 0 AND iForum = "& fID
Set rs = cn.Execute(SQL)

If rs.EOF Then
Response.Write "I detta diskussionsforum finns ännu inga inlägg!<br>"
Response.Write "Gå till botten av denna sida för att starta ett nytt ämne.<br><br>"
Else
Response.Write "<table cellpadding=2 cellspacing=1><tr bgcolor=#99B38B><td width=210><b>Ämne:</b></td><td width=100><b>"
Response.Write "Startad av:</b></td><td width=45><b>Svar:</b></td><td width=140><b>Senaste inlägget:</b></td></tr>"

SQL = "SELECT * FROM finlagg WHERE iForum = "& fID &" AND svarTill = 0 ORDER BY iID DESC"
Set rs2 = cn.Execute(SQL)

Do Until rs2.EOF
inID = rs2("iID")
rubrik = rs2("rubrik")
av = rs2("av")
senaste_inlagg = rs2("datum")

SQL = "SELECT Count(*) AS AntalSvar FROM finlagg WHERE svarTill = "& rs2("iID")
Set rs3 = cn.Execute(SQL)
antalsvar = rs3("AntalSvar")

Response.Write "<tr><td><a href=inlagg.asp?forum="& fID &"&inlagg="& inID2 &">"& rubrik &"</a></td><td>"& av &"</td>"
Response.Write "<td>"& antalsvar &"</td><td>"& senaste_inlagg &"</td></tr>"
rs2.MoveNext
Loop
rs2.Close
set rs2 = Nothing

Response.Write "</table>"
End If
Response.Write "<br>"

rs2.Close
set rs2 = Nothing

rs.Close
set rs = Nothing
%>

<hr size="1" noshade color="black">
<b>Skriv ett nytt inlägg:</b><br>
<form method="post" action="sparainlagg.asp">
<input type="hidden" name="iForum" value="<%= fID %>">
Ämne:<br>
<%
Response.Write "<input type=""text"" maxlength=""40"" name=""rubrik"" "
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"" size=""18"""
Else
Response.Write "class=""inputIE"" size=""30"""
End If
%>><br>
<br>
Inlägg:<br>
<%
Response.Write "<textarea wrap=""VIRTUAL"" name=""inlagg"""
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"" rows=""6"" cols=""18"""
Else
Response.Write "class=""inputIE"" rows=""7"" cols=""29"""
End If
%>></textarea><br>
<br>
<input type="checkbox" name="anonym" value="anonym" onFocus="this.blur()"> Jag vill vara anonym<br>
<br>
<%
Response.Write "<input type=""submit"" value=""Skicka"""
If Session("browser") = "nn" Then
Response.Write "class=""inputNS"""
Else
Response.Write "class=""inputIE"""
End If
%>><br>
</form></td></tr></table>
</body>
</html>

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
if i'm not back in five minutes, just wait longer.</A>

nakozMedlem sedan dec. 1999653 inlägg
#35

haha... *dansar segerdans med @nders* :e :e

funkar skitbra nu... tack!!

MVH

------------------
nakoz :)

emissionMedlem sedan dec. 19996 721 inlägg
#36

Sorry. Jag glömde bort din fråga, men @nders löste det ju fint.

Med SQL ensamt skulle det kunna bli så här ungefär:

SELECT COUNT(i1.iID), MAX(i1.Datum), i2.iID, MAX(i2.rubrik)
FROM finlagg AS i1, finlagg AS i2
WHERE i1.iForum=1 AND i1.svartill= i2.iID AND i2.svartill = 0
GROUP BY i2.iID

Detta listar ut antal, senaste datum och rubrik, genom att joina tabellen med sig själv. Men, man måste utnyttja aggregatfunktioner (COUNT,MAX etc.) för att kunna köra en vettig GROUP BY, och då kan man inte göra en OUTER JOIN (ta med data från båda tabellerna som joinas, även de rader som inte har någon polare, dvs. inlägg utan svar).

Funktionen är alltså inte klar, utan man måste få med de inlägg som inte har några svar.

SELECT 0, i1.datum, i1.iID, i1.rubrik
FROM finlagg AS i1
WHERE i1.iForum=1 AND i1.svartill = 0 AND i1.iID NOT IN (SELECT i2.svartill FROM finlagg AS i2 WHERE i2.svartill > 0)
ORDER BY 2 DESC;

Den kompletta satsen kan bli:

SELECT COUNT(i1.iID), MAX(i1.Datum), i2.iID, MAX(i2.rubrik)
FROM finlagg AS i1, finlagg AS i2
WHERE i1.iForum=1 AND i1.svartill= i2.iID AND i2.svartill = 0
GROUP BY i2.iID
UNION SELECT 0, i1.datum, i1.iID, i1.rubrik
FROM finlagg AS i1
WHERE i1.iForum=1 AND i1.svartill = 0 AND i1.iID NOT IN (SELECT i2.svartill FROM finlagg AS i2 WHERE i2.svartill > 0)
ORDER BY 2 DESC;

Något svårare, men samtidigt mer flexibel, vad beträffar t.ex. sorteringmöjligheter.

138 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)