Avatar billede 47power Nybegynder
07. december 2008 - 12:52 Der er 13 kommentarer og
1 løsning

hjælp: Checkbox, og % LIKE %

1.
Jeg har to rows, kolonner? er det nu det hedder? der hedder (besked) og (emne) i 2 tabeller (post) og (post_udbakke) hvordan er det nu man laver søgefunktion med like?

2.
Har en checkbox ud fra hver besked - <input type="checkbox" name="checkslet"> hvordan er det nu at man får min slet asp fil til at slette alle markerede?
-------- post_slet.asp --------
<%
quID = cINT(Request.Querystring("id"))
SesID = Session("id")
If Request.Querystring("slettet") = "" Then
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
strSQL = "select * from post WHERE bID="&quID
set rs = Conn.Execute(strSQL)
if Rs("mID") = ""&SesID&"" Then

strSQL = "Delete from post where bID = "&quID
Conn.Execute(strSQL)

Response.Redirect "post_slet.asp?slettet=ja"
else
response.write "Dit ID kan ikke slette denne besked."
end if
Conn.Close
Set Conn = Nothing
%>
Avatar billede softspot Forsker
07. december 2008 - 17:11 #1
Du kan søge i tekstfelter med LIKE således:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%
sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'"

' INDSÆT DIN KODE TIL AT OPRETTE EN CONNECTION HER!!!

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
  ' GØT HVAD DER NU SKAL GØRES MED DE FUNDNE RÆKKER
  rs.movenext
loop
rs.close
set rs = nothing
%>


Mht. sletningen, så er der (mindst) to metoder du kan benytte. Den ene udnytter at value-atributteb fra form-elementer med samme name-atribut i formularen, samles i en kommasepareret streng i Request.Form (sammen gør sig gældende for Request.QueryString). Denne streng kan du bruge til at slette en mængde med i databasen (hvis du eller tør gør dette uden videre :-)). Det kunne se såledse ud:

sql = "DELETE " & _
      "FROM post " & _
      "WHERE bId IN (" & Request.Form("checkboxDerVælgerPostTilSletning") & ")"

conn.execute sql

Ovenstående kræver naturligvis at du har valgt en intelligent måde at identificere hver brev i formularen (dvs. det id som identificerer brevet i databasen), ellers skal sql-sætningen nok se anderledes ud ;-)

En anden metode er batchsletning vha. command-objektet, hvis du aætter et commandobjekt op til at slette en post i databasen og derefter genbruger dette objekt ved blot at udskifte parameteren til objektet. Det kunne se således ud:

sql = "DELETE " & _
      "FROM post " & _
      "WHERE bID = ?"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandText = sql
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, 4)

arrPost = split(Request.Form("checkboxDerVælgerPostTilSletning"),",")

for each postid in arrPost
  cmd.Parameters("@id").Value = postid

  recordCount = 0 
  cmd.Execute recordCount 
  if recordCount = 0 then   
    response.write "Post med id: " & post & " kunne IKKE slettes!" 
  end if
next


Den første metode til sletning er den hurtigste, men den sidste er den sikreste. Du kunne evt. udvide den med en parameter mere som angav ejeren af brevet, så det kun er den brugere der ejer brevene som kan slette disse. Til dette skulle du bare smide ejerens id ind i sql-sætningen. Nogenlunde således:

sql = "DELETE " & _
      "FROM post " & _
      "WHERE bID = ? " & _
      "AND ejerid = ?"

Command-objektet skulle naturligvis tilpasses så den også sender ejerid'et med som parameter.

Læs mere om brugen af command-objektet i min artikel: http://www.eksperten.dk/artikler/1250
Avatar billede 47power Nybegynder
07. december 2008 - 21:06 #2
har fattet checkboxene nu =)


Men søgefunktionen, fatter intet.
http://kinnberg.com/dben.png

<%
sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'"

' INDSÆT DIN KODE TIL AT OPRETTE EN CONNECTION HER!!!

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
  ' GØT HVAD DER NU SKAL GØRES MED DE FUNDNE RÆKKER
  rs.movenext
loop
rs.close
set rs = nothing
%>
----------------------------------------------------------------------
Hvor skal jeg putte min request.form ind???
Avatar billede softspot Forsker
07. december 2008 - 21:28 #3
aah, sorry! Den egentlig bare lægges i variablen soegetekst (f.eks. inden sql-sætningen sættes sammen).


<%
soegetekst = Request.Form("soegetekst")

sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'"

' INDSÆT DIN KODE TIL AT OPRETTE EN CONNECTION HER!!!

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
  ' GØT HVAD DER NU SKAL GØRES MED DE FUNDNE RÆKKER
  rs.movenext
loop
rs.close
set rs = nothing
%>
Avatar billede 47power Nybegynder
07. december 2008 - 23:10 #4
<% If Request.Querystring("soeg") = "ja" Then
soegetekst = Request.Form("soegetekst")
sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'"
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
afsender = Server.HTMLEncode(rs("afsender"))
modtager = Server.HTMLEncode(rs("modtager"))
emne = Server.HTMLEncode((left(rs("emne"), 15))) & ".."
dato = Server.HTMLEncode(rs("dato"))
modID = Rs("mID")
bID = Rs("bID")
Response.Write "<tr><td width=""25%"">" & afsender & "</td>"
Response.Write "<td width=""25%"">" & emne & "</td>"
Response.Write "<td width=""25%"">" & dato & "</td>"
Response.Write "<td width=""25%""><a href=""post_laes.asp?id=" & bID & """>[Læs]</a> <a href=""post_slet.asp?id=" & bID & """  onclick=""return confirm('Vil du virkelig slette?')"">[slet]</a> [<input type=""checkbox"">] "
If Rs("aabn") = "x" Then
Response.Write "<img src=""ikon/laes_post.png"">"
else
Response.Write "<img src=""ikon/ny_post.png"">"
end if
Response.Write "</td></tr>"
Response.Write "</table>"
  rs.movenext
loop
rs.close
set rs = nothing
end if
%>

den giver følg. fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e0c'

Command text was not set for the command object.

/post_soeg.asp, line 19
Avatar billede 47power Nybegynder
07. december 2008 - 23:12 #5
findes der ikke en simpel % LIKE % løsning?
Avatar billede 47power Nybegynder
07. december 2008 - 23:24 #6
ka heller ikke helt finde ud af det med checkboxene
du kan få 150 point oveni hvis du laver funktionen så de virker :-)

bare skriv hva du ska bruge af asp kode, og her er min database:
http://kinnberg.com/dben.png
Avatar billede softspot Forsker
07. december 2008 - 23:55 #7
Jeg har vist glemt at få tildelt commandtext-egenskaben på command-objektet. Prøv lige denne version i stedet:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%
If Request.Querystring("soeg") = "ja" Then
soegetekst = Request.Form("soegetekst")
sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'"
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
  afsender = Server.HTMLEncode(rs("afsender"))
  modtager = Server.HTMLEncode(rs("modtager"))
  emne = Server.HTMLEncode((left(rs("emne"), 15))) & ".."
  dato = Server.HTMLEncode(rs("dato"))
  modID = Rs("mID")
  bID = Rs("bID")
  Response.Write "<tr><td width=""25%"">" & afsender & "</td>"
  Response.Write "<td width=""25%"">" & emne & "</td>"
  Response.Write "<td width=""25%"">" & dato & "</td>"
  Response.Write "<td width=""25%"">"
  Response.Write "<a href=""post_laes.asp?id=" & bID & """>[Læs]</a>"
  Response.Write " <a href=""post_slet.asp?id=" & bID & """"
  Response.Write " onclick=""return confirm('Vil du virkelig slette?')"">[slet]</a>"
  Response.Write " [<input type=""checkbox"" name=""checkboxDerVælgerPostTilSletning"" value=""" & bID & """>] "
  If Rs("aabn") = "x" Then
    Response.Write "<img src=""ikon/laes_post.png"">"
  else
    Response.Write "<img src=""ikon/ny_post.png"">"
  end if
  Response.Write "</td></tr>"
  Response.Write "</table>"
  rs.movenext
loop
rs.close
set rs = nothing
end if
%>

NB: HUSK linien med metadata umiddelbart inden ASP-kodeblokken starter! Den er vigtig for at du kan benytte ADO-konstanterne jeg har vist.

NB: Jeg har givet checkboksen et navn og en value, da tricket med sletning ellers ikke vil fungere, så jeg håber det også løser dit problem med sletningen... :-)
Avatar billede 47power Nybegynder
08. december 2008 - 20:26 #8
Så har fået gang i søgefunktionen
Hvordan får jeg den til at kende forskel på udtræk fra tabellen post og post_udbakke?
post læses i post_laes.asp mens post fra udbakken læses fra post_udbakke_laes.asp ...
alle linksne bliver jo - uanset hvilken tabel det er udtrukket fra til post.asp?id=bID

------
<!--#include file="include/inc_default1.asp"-->
<b>iPost</b> | <a href="post.asp">[Indbakke]</a> - <a href="post_udbakke.asp">[Udbakke]</a> |
<a href="post_soeg.asp" class="postA">[Søg]</a> - <a href="post_nybesked.asp">[Ny besked]</a>
<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%
If Request.Querystring("soeg") = "ja" Then
soegetekst = Request.Form("soegetekst")
If Request.Form("s1") = "1" Then
si1 = "Indbakke, "
sql = "" & _
    "SELECT * " & _
    "FROM post " & _
    "WHERE besked LIKE '%' + ? + '%'" & _
    "and mID = '" & Session("ID") & "' "
end if
If Request.Form("s2") = "2" Then
si2 = "Udbakke."
sql = "" & _
    "SELECT * " & _
    "FROM post_udbakke " & _
    "WHERE besked LIKE '%' + ? + '%'" & _
    "and aID = '" & Session("ID") & "' "
end if
Response.Write "<table border=""0"" cellpadding=""1"" cellspacing=""0"" width=""100%""><tr BGCOLOR=""#CCCC99"">"
Response.Write "<td width=""25%""><strong>Søgeresultater</strong></td><td width=""25%""> <a href=""post_soeg.asp"" class=""sortlink"">Ny søgning?</a></td>"
Response.Write "<td width=""25%"" align=""right"">Søgte i:</td>"
Response.Write "<td width=""25%"" align=""left"">&nbsp;" & si1 & " " & si2 & "</td></tr>"
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter("@soegetekst", adVarChar, adParamInput, 250, soegetekst)
set rs = cmd.Execute()
do while not rs.eof
  afsender = Server.HTMLEncode(rs("afsender"))
  modtager = Server.HTMLEncode(rs("modtager"))
  emne = Server.HTMLEncode((left(rs("emne"), 15))) & ".."
  dato = Server.HTMLEncode(rs("dato"))
  modID = Rs("mID")
  bID = Rs("bID")
  Response.Write "<tr><td width=""25%"">" & afsender & "</td>"
  Response.Write "<td width=""25%"">" & emne & "</td>"
  Response.Write "<td width=""25%"">" & dato & "</td>"
  Response.Write "<td width=""25%"">"
  Response.Write "<a href=""post_laes.asp?id=" & bID & """>[Læs]</a>"
  Response.Write " <a href=""post_slet.asp?id=" & bID & """"
  Response.Write " onclick=""return confirm('Vil du virkelig slette?')"">[slet]</a>"
  Response.Write " [<input type=""checkbox"" name=""checkboxDerVælgerPostTilSletning"" value=""" & bID & """>] "

  Response.Write "</td></tr>"
  rs.movenext
loop
rs.close
set rs = nothing
Conn.Close
set Conn = Nothing
%>
<table border="0" cellpadding="1" cellspacing="0" width="100%" BGCOLOR="#CCCC99">
<td width="50%">   </td>
<td width="50%">  </td>
</tr>
</table>
</p>
<!--#include file="include/inc_default2.asp"-->
<% end if %>
<% If Request.querystring("soeg") = "" Then %>
<table border="0" cellpadding="1" cellspacing="0" width="100%"><tr BGCOLOR="#CCCC99">
<td width="25%"><strong><strong>Søg i iPost</strong></strong></td><td width="25%"></td>
<td width="25%"></td>
<td width="25%"></td></tr>
</table>
<form method="post" action="post_soeg.asp?soeg=ja">
<p>Udfyld formularen nedenunder for at søge.</p>
<p><label for="soegetekst">&#8226; <b>Søgetekst:</b></label>
<input type="text" id="input" name="soegetekst" size="30"></p>
<p><input type="submit" value="Søg!"></p>
<br>
<b>&bull; Søg i: </b><br>
<img src="ikon/ny_post.png"> <b>Indbakke:</b>&nbsp;
<input type="checkbox" name="s1" value="1"> <br>
<img src="ikon/ny_post.png"> <b>Udbakke:</b>&nbsp;&nbsp;
<input type="checkbox" name="s2" value="2">
</form><br><br><br><br><br><br>
<% end if %>
<!--#include file="include/inc_default2.asp"-->

Så har fået gang i søgefunktionen
Hvordan får jeg den til at kende forskel på udtræk fra tabellen post og post_udbakke?
post læses i post_laes.asp mens post fra udbakken læses fra post_udbakke_laes.asp ...
alle linksne bliver jo - uanset hvilken tabel det er udtrukket fra til post.asp?id=bID
Avatar billede 47power Nybegynder
09. december 2008 - 23:30 #9
---------------------------------------------------------------------------------
Prøver mig lidt frem med checkboxene men kan sku ikke, er gået i stå her
---------------------------------------------------------------------------------
<%
quID = replace(request.form("checkbox"),"'","''")
SesID = Session("id")
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
strSQL = "Delete from post where mID = '" & SesID & "' bID IN = (" & quID & ")"
Conn.Execute(strSQL)                                    '<- Line 11.
Conn.Close
Set Conn = Nothing
%>

=

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'mID = '1' bID IN = (33, 32)'.

/slet_post_checkbox.asp, line 11
---------------------------------------------------------------------------------
søgefunktionen virker, men har et sidste problem :)

Hvordan får jeg den til at kende forskel på udtræk fra tabellen post og post_udbakke?
post læses i post_laes.asp mens post fra udbakken læses fra post_udbakke_laes.asp ...
alle linksne bliver jo - uanset hvilken tabel det er udtrukket fra til post.asp?id=bID
---------------------------------------------------------------------------------
Avatar billede softspot Forsker
10. december 2008 - 00:22 #10
Mht. sletningen, så er du ikke langt fra løsningen, du skal bare lige erkende at IN er en operator på linie med "lig med", så den skal altså ikke kombineres med "lig med", men erstatte den. Desuden mangler der lige et lille "and" mellem de to betingelser i where-delen. Altså således:

<%
quID = replace(request.form("checkbox"),"'","''")
SesID = Session("id")
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../db/db2.mdb")
Conn.Open DSN
strSQL = "Delete from post where mID = '" & SesID & "' and bID IN (" & quID & ")"
Conn.Execute(strSQL)                                    '<- Line 11.
Conn.Close
Set Conn = Nothing
%>

Mht. indbakke-/udbakkeidentifikation, så må du have en eller anden markering i formularen, f.eks. et skjult felt (<input type="hidden"...>) eller noget lignende, der kan indikere om du arbejder med ind- eller udbakkedata.

Jeg må erkende at jeg ikke helt har gennemskuet problemet med ind og udbakke, men det lyder som om du mangler en indikator i postback til siden der sletter (eller hvad)? Hvis dette er tilfældet, tror jeg det førnævnte skjulte felt er løsningen.
Avatar billede 47power Nybegynder
10. december 2008 - 16:23 #11
Kan ik få til at virke. :( ?
strSQL = "Delete from post where mID = '" & SesID & "' and bID IN = (" & quID & ")"

udskriver:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] In operator without () in query expression 'mID = '1' and bID IN = (36)'.

/slet_post_checkbox.asp, line 11
Avatar billede softspot Forsker
10. december 2008 - 16:55 #12
Det er så fordi der ikke er valgt nogle checkbokse i formularen eller fordi checkbokskontrollerne på formularen ikke har name-stributten sat til "checkbox", altså:

<input type="checkbox" name="checkbox" value="[databaseid'et på den besked som vises]">

Kan man tillade sig at antage, at dette er koden i formularen som angiver beskeden der skal slettes?:

  Response.Write " [<input type=""checkbox"" name=""checkboxDerVælgerPostTilSletning"" value=""" & bID & """>] "

i så fald skal quID naturligvis sættes således:

quID = replace(request.form("checkboxDerVælgerPostTilSletning"),"'","''")


Desuden er det en god idé at kontrollere om der er valgt nogen checkboks inden du kalder databasen. Det kunne du f.eks. gøre ved at trimme strengen for spaces og derefter checke om strengen er længere end 0 tegn:

if len(trim(quID)) > 0 then
  ' UDFØR DIN DATABASEHANDLING... dvs. sletning
else
  ' FEJLMELD TIL BRUGEREN OM AT DER SKAL VÆLGES MINDST
  ' EN BESKED TIL SLETNING INDEN SLETNING KAN GENNEMFØRES
end if


Det er altid vigtigt at sørge for datavaliditet på serveren (også selvom du har valideret på klienten), da data som sendes til din server-kode sagtens kan have omgået klientvalideringen og bare sendt data direkte til server-koden (asp-siden der udfører din sletning).
Avatar billede 47power Nybegynder
12. december 2008 - 00:11 #13
point til softspot: http://www.eksperten.dk/spm/856207

Tak for hjælpen :-)
Avatar billede softspot Forsker
12. december 2008 - 00:40 #14
Velbekomme og tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester