Jag har en blogg och detta är koden för att ändra ett inlägg där 'taggarna' redan är satta. (taggar = kategorier) Jag har skapat följande exempel: Wow, tack så mkt.Vilka chekboxar är ikryssade?
Jag skulle vilja få till det så att de "taggar" som är kopplade till just detta inlägg är ikryssade i checkboxarna.
Infon om vilka taggar som finns (och till vilket inlägg) har jag i en annan tabell som heter "tblTagPlace" och som är uppbyggd så här.
tId - pId - tagId
tId = Autonummer
pId = Id nummret för blogginlägget (siffra)
tagId = Id nummret för en specifik tagg (siffra)
------------------
När jag skriver ut taggarna till blogginlägget så hämtar jag det ur tabellen "tblTagTitle" där varje tagId (som jag får från "tblTagPlace") går till en taggtitel som t.ex "nyhet", "bild" och "film".
------------------
Frågan är hur jag kan hämta info från "tblTagPlace" och använda det för att kryssa i de checkboxar (taggar) som är knytna till blogginlägget.
Kod för att skriva ut checkboxarna
strSQL = "SELECT tagId,tagTitle FROM tblTagTitle"
Set RS = objConn.Execute(strSQL)
IF Not RS.EOF THEN
arrRows = RS.GetRows()
ELSE
rsFindingsTaggar = "No"
END IF
RS.Close : Set RS = Nothing
Response.Write "<b>Taggar</b>"
Response.Write "<table border='0' cellpadding='0' width='100%' cellspacing='0' class='adminTools'>"
tagCol = 0
IF NOT rsFindingsTaggar = "No" THEN
totRecords = Ubound(arrRows,2)
For iTagg = 0 to totRecords
tagId = arrRows(0,iTagg)
tagTitle = arrRows(1,iTagg)
IF tagCol = 0 THEN
Response.Write "<tr>"
END IF
' här måste jag väl köra nån sorts loop och en if sats antar jag.. men jag får det inte att funka.
Response.Write "<td><input type='checkbox' name='tagId' value='" & tagId & "'>" & tagTitle & "</td>"
tagCol = tagCol + 1
IF tagCol = 5 THEN
tagCol = 0
Response.Write "</tr>"
END IF
Next
Erase arrRows
IF tagCol > 0 THEN
Response.Write "</tr>"
END IF
Response.Write "</table>"
ELSE
'Visa inga
END IF
Kod som jag har för att få ut rätt info ut "tblTagPlace". Denns kod ligger just ovanför.
Set RS = objConn.Execute(strSQL)
IF Not RS.EOF THEN
arrRows = RS.GetRows()
ELSE
rsFindingsTaggar = "No"
END IF
RS.Close : Set RS = Nothing
IF NOT rsFindingsTaggar = "No" THEN
totRecords = Ubound(arrRows,2)
For iTagg = 0 to totRecords
pId = arrRows(0,iTagg)
tagId = arrRows(1,iTagg) & ", " & tagId
Next
Erase arrRows
END IF
arrTagId = Split(tagId, ", ")
Nån som har en idé och/eller en lösning på mitt dilemma?
Kanske JOINA de två tabellerna?
Tack
Sv: Vilka chekboxar är ikryssade?
<%@language="VBScript" %>
<!-- METADATA
TYPE="TypeLib"
NAME="Microsoft ActiveX Data Objects 2.6 Library"
UUID="{00000206-0000-0010-8000-00AA006D2EA4}"
VERSION="2.6" -->
<%Option Explicit%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Checkboxes</title>
</head>
<body>
<%
Function Checked(Value)
If Value Then
Checked = "checked=""checked"""
Else
Checked = ""
End If
End Function
Sub WriteTags(Recordset, TagId, TagTitle, TagChecked)
Dim tagCol
Response.Write "<b>Taggar</b>"
Response.Write "<table border=""0"" cellpadding=""0"" width=""100%"" cellspacing=""0"" class=""adminTools"">"
Response.Write "<tr>"
Do Until Recordset.EOF
If tagCol = 5 Then
tagCol = 0
Response.Write "</tr><tr>"
Else
tagCol = tagCol + 1
End If
Response.Write "<td>" + _
"<label>" + _
"<input type=""checkbox"" name=""tagId"" value=""" & TagId & """ " & Checked(TagChecked) & " />" & _
Server.HTMLEncode(TagTitle) & _
"</label>" + _
"</td>"
Recordset.MoveNext
Loop
Response.Write "</tr>"
Response.Write "</table>"
End Sub
Dim objRs
Dim objCmd
Dim objConn
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=" & Server.MapPath("blogg.mdb") & ";"
Set objCmd = CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = objConn
objCmd.CommandText = "SELECT tblTagTitle.tagId, tblTagTitle.tagTitle, (tblTagPlace.pId IS NOT NULL) AS tagChecked" + vbCrLf + _
"FROM tblTagTitle LEFT JOIN " + _
"tblTagPlace ON ((tblTagTitle.tagId = tblTagPlace.tagId) AND (tblTagPlace.pId = @pId))"
objCmd.Parameters.Append(objCmd.CreateParameter("@pId",adInteger,adParamInput,,CLng(Request.QueryString("pid"))))
Set objRs = CreateObject("ADODB.Recordset")
objRs.Open objCmd
WriteTags objRs, objRs("tagId"), objRs("tagTitle"), objRs("tagChecked")
objRs.Close
objConn.Close
%>
</body>
</html>
Din visar hur du gör en sådan Join du efterfrågar.
Jag har valt att använda en paramterfråga, vilket är ett bra skydd mot SQL inject.
Metadata tagen i näst överst på sidan ger mig tillgång till ADO's konstanter, så som adInteger och adParamInput.
Jag tycker personligen att det är hemskt fult att använda arrayer. Jag föredrar loop. JAg tror desutom skillnaden är minimal.
Jag har strukturerat koden i subrutiner. Jag tycker det ger en bättre överblick och möjlighet att underhålla. Man ser tydlig var ett block börjar och slutar.
Subrutinen WriteTags(Recordset, TagId, TagTitle, TagChecked) är oxå återanvändbar. T.ex. om du skapar ett nytt inlägg och då vill du kanske lista tagarna med kryssrutor:
strSQL = "SELECT tagId,tagTitle FROM tblTagTitle ORDER BY tagTitle"
Set RS = objConn.Execute(strSQL)
WriteTags RS, RS("tagId"), RS("tagTitle), False
RS.Close
Du är välkommen att använda denna kod.
Sv:Vilka chekboxar är ikryssade?
Har just suttit och lagt in koden på min sida och det funkar hur bra som hellst :)
Jag brukar aldrig använda mig av sub´s, men jag funderar på att börja nu, det känns otroligt mkt smidigare så här.
tack för hjälpen!
om du vill se hur det blev på sidan så släng iväg ett mail till kim@weine.se så ska du få en länk.
Sidan är inte släppt ännu så....
tack
//Kim