webForumDet fria alternativet

DELETE WHERE id = i AND i AND i?

ASP

7 svar · 371 visningar · startad av Yoda

Medlem sedan nov. 2002291 inlägg
Frågan#1

Hej, jag har flera checkboxar på rad. De checkboxar man fyller i ska den raden tas bort från db. Just nu kan man bara fylla i en checkbox i taget, vilket inte är så bra om man vill ta bort flera rader på en gång.
Här tar jag bort från db:

...
participantId = Request.Form("participant")
set rs2 = server.CreateObject("adodb.recordset")
sql2 = "DELETE * " & _
           "FROM Participant " & _
           "WHERE id = " & participantId
set rs2 = conn.execute(sql2)
...

Och här är mina checkboxar som loopas till så många som det finns rader i tabellen:

<form method="post">
    <input name="participant" type="checkbox" value="<%response.write (rs("id"))%>">
</form>

När jag ska ta bort flera rader i tabellen så skriver jag ju bara AND i sql-satsen men hur blir det med variabeln participantId? Om flera checkboxar är bockade så ta bort dessa, hur får jag inte det? If...lalala nånting...

Medlem sedan dec. 200012 464 inlägg
#2
sql2 = "DELETE " & _
           "FROM Participant " & _
           "WHERE id in ( " & participantId & ")"
conn.execute sql2,,128
Medlem sedan feb. 20011 198 inlägg
#3

Du kan inte använda AND, använd IN() eller OR.

where id in ("& replace(request.form("participant")," ","") &")
Medlem sedan maj 200010 687 inlägg
#4

Den där koden välkomnar SQL-injection.
Se till att ha någon slags validering av indatat så det bara är siffror, kommatecken och mellanslag som kommer in.
Ett bra pattern för att hitta förbjudna tecken är: [^\s\d,]

Medlem sedan nov. 2002291 inlägg
#5

Okej, men måste jag inte ha någon loop av något slag som samlar ihop id:na från de checkboxar som är ifyllda?

Ja, just det, förbjudna tecken...hm. Men vad menar du med: [^\s\d,]?

*****************

Hm, det fungerade ju LarsG, fantastiskt. Hur kan det egentligen göra det? Vad gör parametrarna i raden, vad är 128?:

conn.execute sql2,,128

Trodde man behövde en loop...coolt!

Medlem sedan juni 2004533 inlägg
#6

Request.Form("participant") returnerar ett objekt av type IStringList. Ifall listan innehåller flera värden och du vill ha ut värdet av den, så kommer den att returnera en sträng som är en kommaseparerad lista av värdena.

Ifall du har tre värden i listan, "4", "18" och "42", så kommer du att få en sträng som ser ut så här: "4, 18, 42".

När du använder strängen i din SQL-fråga så får du en fråga som ser ut så här:

"DELETE FROM Participant WHERE id in (4, 18, 42)"

128 är en flagga som talar om att anropet inte ska skapa något recordset. Eftersom du inte hämtar någon data så behöver du ju inget recordset, och då är det ju onödigt att det skapas något eftersom du ändå inte tar hand om det.

Medlem sedan maj 200010 687 inlägg
#7

[^\s\d,] är ett regexp-pattern som letar efter otillåtna tecken.
Så här skulle man kunna skriva:

Function CheckInputData(ByVal sInputData)
	Dim objRegExp
	Set objRegExp = New RegExp
	objRegExp.Pattern = "[^\s\d,]"
	CheckInputData = Not objRegExp.Test(sInputData)
	Set objRegExp = Nothing
End Function

If Not CheckInputData(participantId) Then
	Response.Write "Incorrect input data."
	Response.End
End If
Medlem sedan nov. 2002291 inlägg
#8

Aha, vad bra, tack för tipset Erik. Ska kolla på det.

267 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
115 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)