webForumDet fria alternativet

Hjälp med forum

ASP

7 svar · 452 visningar · startad av Denniz PoP

Medlem sedan aug. 2002207 inlägg
Frågan#1

Håller på att göra ett forum, men har stött på lite problem. Forumet skrivs i ASP med en Access-databas, men det spelar egentligen ingen roll. Det är mest det praktiska tänkandet jag är ute efter.

Jag har min databas uppbyggd såhär (dom viktiga iaf):

ID (unikt)
RefThread (vilken tråd som inlägget hör till)
Date (datum då inlägget skapades)
Time (klockslag då inlägget skapades)
First (av/på beroende om det är det första inlägget i en tråd)
Update

Update har egentligen bara betydelse när First = True (alltså, inlägget ligger först i tråden). När man skapar ett inlägg så uppdateras fältet Update (för det inlägg som är först i tråden) med det datum & klockslag som är just nu.

Sedan när jag skall visa alla inlägg så visas alla inlägg där First = True och sedan sorteras efter Update.

Detta fungerar felfritt ända tills någon tar bort det sista inlägget i en tråd. Datum & Klockslag är ju fortfarande kvar i fältet Update vilket gör att tråden ligger kvar högst upp (= lätt att bumpa utan att det märks egentligen).

Även om man tar bort det som står i Update när man tar bort det sista inlägget så blir det ju helt tomt där (vilket gör att tråden hamnar längst bak). Man kan väl inte på något sätt få tillbaka det som stod före?

Hur skall jag lösa detta på ett smart sätt?

Är det kanske enklare om man gör om databasen helt, men en egen tabell för "första-trådar" och en annan tabell för vanliga inlägg?

Medlem sedan maj 2003107 inlägg
#2

Skriv gärna den bit av koden där problemet ligger, blir lättare att se och tolka felet då... ;)

Medlem sedan jan. 20032 285 inlägg
#3

deleex skrev:

Skriv gärna den bit av koden där problemet ligger, blir lättare att se och tolka felet då... ;)

Om du läser hela inlägget kanske du förstår att han inte har problem på det sättet, utan han undrar hur man löser hans problem på lättaste sättet!

Medlem sedan aug. 20003 575 inlägg
#4

För att spinna vidare på din fråga.

Så kan det ju gå om du loopar igenom alla svar i tråden

' Du måste skaffa update värdet på den som tas bort vi säger att 
' intDelUpdate innehåller det talet
' Kan man ha update som fält ?

strSql = "Select * From [tabellnamn] where refthread = "+intReftrhead+" and update > "+intDelUpdate+""
Set Rs = Conn.Execute(strSql)
Do until Rs.Eof

strSql = "Update [tabellnamn] set update = update-1 where Id = "+Rs("id")+""

Set RsUpdate = Conn.Execute(strSql)
Set RsUpdate = Nothing

Rs.MoveNext
Loop

Obs koden är otestat. Efter det jag läst så tror jag att det kan vara såhär kanske något liknande.

Är det kanske enklare om man gör om databasen helt, men en egen tabell för "första-trådar" och en annan tabell för vanliga inlägg?

Nej, din metod är ej så smart. Det bästa hade varit 2 tabeller.

Threads

thread_id
thread_subject
thread_message
thread_date
thread_user ' Kan vara ett Id eller namn välj själv
thread_modifieddate

Replys

reply_id
reply_thread_id ' För att koppla den till huvudtråden
reply_subject
reply_message
reply_date ' Måste finnas för att sortera dom i ordning efter tråden
reply_user
reply_modifieddate

Sedan kan du säkert lägga till och ta bort rader här.

Medlem sedan aug. 2002207 inlägg
#5

Tackar för svaren.

Nickemannen: Ditt svar fick mig att ändra hela databasen. Jobbigt som fan, men helt klart värt det :)

Medlem sedan feb. 200112 078 inlägg
#6

Jag tycker att man kan ha både trådar och svar i samma tabell, då det egentligen inte är någon skillnad på dem, iallafall inte några som inte går att separera med ett par snygga if-satser.

Då slipper du dessutom köra en JOIN mellan Threads och Replys, vilket innebär en prestandaförbättring du borde känna av, med tanke på att du troligtvis kör fler JOINs mot t.ex. tabellen Users (eller vad den heter).

Medlem sedan feb. 200112 078 inlägg
#7

Detta fungerar felfritt ända tills någon tar bort det sista inlägget i en tråd. Datum & Klockslag är ju fortfarande kvar i fältet Update vilket gör att tråden ligger kvar högst upp (= lätt att bumpa utan att det märks egentligen).

Är det inte önskvärt att låta det vara så då? Jag menar, en radering av ett inlägg är ju en ändring i tråden likaväl som ett nytt inlägg är, eller hur?

Medlem sedan aug. 2002207 inlägg
#8

Jag bestämde mig för att ha kvar samma struktur på databasen som jag hade från början, alltså med alla trådar (startinlägg + svar) i samma tabell.

Den SQL-sats jag använder nu ser ut såhär:

SQL = "SELECT * FROM [Messages] WHERE [RefForum] = " & Request.Querystring("id") & " AND [First] = True ORDER BY [Lastpost] Desc, [ID] Desc"

Det är alltså [Lastpost] som den sorterar efter. Varje gång man gör ett svar i tråden så uppdateras [Lastpost] med aktuell tid + datum, vilket gör att tråden hoppar högst upp i listan. Detta är ju så långt allt väl.

Dock, om man tar bort det sista inlägget i tråden så är fortfarande värdet kvar i [Lastpost]. Man kan ju inte få tillbaka det värde som var där före.

En sak man kan göra är att kontrollera om det är sista inlägget man tar bort och isf ersätta [Lastpost] med dom värden som det näst sista inlägget har. Dock anser jag detta som en onödig lösning, det borde gå att fixa på andra sätt.

Hur skall man enklast göra? Kan man göra detta direkt med en SQL-sats? Jag vill alltså helst slippa använda [Lastpost] och istället kontrollera direkt ur databasen vilken tråd som skall hamna överst.

Någon som kan hjälpa mig?

264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)