/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Hvad er der galt med min SQL?
Fra : Jakob Munck


Dato : 27-08-01 21:45

Jeg har en netbaseret forening, hvor medlemmerne sender intern post til
hinanden. De afsendte breve er records i en database, og brugerne kan lave
en liste over de breve, som de har modtaget, og han kan markere i et
afkrydsningsfelt, at han vil have dem slettet. Koden, der kan slette flere
poster ad gange, virker fint, og den ser sådan ud (i uddrag):

<%
.........
if Request.Form("slet").Count > 0 then

sql3 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ")"
conn.Execute(sql3)
.......
%>


Nu forsøger jeg så at indsætte et kriterium mere, for at de valgte mails
blive slettet, idet jeg vil have, at det kun sker hvis der står
"modtagerSlet" i et andet felt, der kaldes "valgSlet" og som er i samme
tabel. Nu har jeg så lavet koden sådan:

<%
......................
if Request.Form("slet").Count > 0 then

sql4 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ") and
slet = '" & '''modtagerSlet & "'"
conn.Execute(sql4)
...................
%>

Og denne kode virker ikke. Den giver ingen fejlmelding, men den sletter
heller ikke de records, der er valgt.

Hvad gør jeg galt?


v.h.
Jakob Munck








 
 
Lars Hoffmann (27-08-2001)
Kommentar
Fra : Lars Hoffmann


Dato : 27-08-01 22:28

Jakob Munck wrote:
>
> sql4 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ") and
> slet = '" & '''modtagerSlet & "'"
> conn.Execute(sql4)


Hvad med
sql4 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ")
and slet = '" & modtagerSlet & "'"
men de tre anførselstegn har sikkert blot været en fejltastning. Prøv at
lave response.write(sql4) lige før conn.Execute og se hvad der kommer ud
af din sql. Det plejer at hjælpe.
Med venlig hilsen
Lars Hoffmann

Anders Holbøll (27-08-2001)
Kommentar
Fra : Anders Holbøll


Dato : 27-08-01 22:53

Jakob Munck wrote:
>
> Jeg har en netbaseret forening, hvor medlemmerne sender intern post
> til hinanden. De afsendte breve er records i en database, og
> brugerne kan lave en liste over de breve, som de har modtaget, og
> han kan markere i et afkrydsningsfelt, at han vil have dem slettet.
> Koden, der kan slette flere poster ad gange, virker fint, og den
> ser sådan ud (i uddrag):
>
> if Request.Form("slet").Count > 0 then
> sql3 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet")
> & ")"
> conn.Execute(sql3)
>
> Nu forsøger jeg så at indsætte et kriterium mere, for at de valgte
> mails blive slettet, idet jeg vil have, at det kun sker hvis der
> står "modtagerSlet" i et andet felt, der kaldes "valgSlet" og som
> er i samme tabel.

Er det ikke bare:

Slet = Request.Form("slet")
If (Request("valgSlet") = "modtagerSlet") And Not (Slet = "") Then
sql3 = "DELETE FROM mail WHERE mailId IN (" & Slet & ")"
conn.Execute(sql3)
End If

Kan du iøvrigt ikke lige poste url'en til dit script, så jeg kan sende
det her request:
http://dinserver/ditscript.asp?valgSlet=modtagerSlet&Slet=0)+or+(1=1

Sagt med andre ord: Du skal nok lige søge for at folk kun kan slette
deres egen post.

--
Anders

Jakob Munck (28-08-2001)
Kommentar
Fra : Jakob Munck


Dato : 28-08-01 07:29

Tak til jer begge for forslag, men de virker desværre ikke. Det er rigtigt,
at jeg havde glemt at stryge et par udkommenteringstegn i min mail, men de
er ikke i koden, så det er ikke årsagen. Det med at skrive response.write
før sql4, det forstår jeg ikke. Hvordan skal det se ud?

Anders' kode ville jeg også selv have troet fungerede, men det gør den ikke.
Den sletter intet.

Herunder ser i den samlede kode (del af en Case-struktur), inclusive
udskrivning af de records der er i databasen. Det fungerer fint nok, men
problemet er, at både afsender og modtager af disse "breve" skal kunne
slette dem, og hvis f.eks. afsender vælger at slette før modtager, så må han
ikke virkelig fjerne denne record fra tabellen, men skal blot afmærke den i
feltet "valgSlet", så den ikke vises for ham mere. Derfor skal den nuværende
kode ændres, så records først virkelig kan slettes af afsender eller
modtager, hvis den anden har tilkendegivet det samme ønske ved at skrive
"afsenderSlet" eller "modtagerSlet" i feltet "valgSlet".

Den eksisterende udgave af dette, hvor kun modtager kan slette sine modtagne
mails, kan ses på:

www.get2you.dk ( log ind med navn og kodeord: nielsen )

Se under afsendt og modtagen post.

Men - som sagt - her er funktionen ikke perfekt, for det er kun modtageren
der kan slette modtagne mails, og afsenderen kan ikke slette det han har
sendt.

Gode forslag modtages med stor glæde.

v.h.
Jakob Munck



Her er koden:
----------------------------------------------------------------------------
-------
<%
case "udbakke"


'sletter afkrydsede indlæg
if Request.Form("slet").Count > 0 then

' virker perfekt:
''''sql3 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ")"
''''conn.Execute(sql3)

end if



sql = "select count(*) as antal2 from mail WHERE mailAfsender = '" &
session("brugernavn") & "'"
Set rs = Conn.Execute(sql)
antal_breve = rs("antal2")

set rs = Conn.Execute("select * From mail where mailAfsender = '" &
Session("brugernavn") & "' order by mailId desc")

%>

<br>
<center>
<h3>Kopi af breve du har sendt</h3>
</center>

<table border="0" align="center" cellpadding="0" cellspacing="5"
width="80%">
<tr align="center"><td class="lille">

* Højst 50 breve i udbakken.<br>
* Status viser om modtageren har læst brevet.<br>
* Sæt flueben og klik "Slet brev", hvis du vil smide kopien ud.

</td></tr></table>


<%
if antal_breve > 50 then

%>
<SCRIPT LANGUAGE=javascript>
self.window.alert("Du må kun have 50 breve i postkassen !");
</SCRIPT>

<%
end if
%>

<table border="0" align="center" cellpadding="0" cellspacing="5"
width="90%">
<tr bgcolor="#0099ff" align="center">

<td width="20%" class="lille">
<b>Modtager </b>
</td>

<td width="35%" class="lille">
<b>Emne </b>
</td>

<td width="25%" class="lille">
<b>Tid </b>
</td>

<td width="10%" class="lille">
<b>Status </b>
</td>

<td width="10%" class="lille">
<b>Slet</b>
</td>
</tr>

<form method="POST" action="get2you.asp?mode=udbakke" target="_self">

<%
'her loopes der gennem de valgte records
do until rs.eof
%>

<tr>
<td valign="top" width="20%" class="lille">


<a href="get2you.asp?mode=big&brugernavn=&id=<%=rs("mailAfsenderId")%>"
target="_self"><%=rs("mailModtager")%></a>

</td>

<td valign="top" width="30%" class="lille">
<a href="get2you.asp?mode=afsender_read_mail&mailid=<%=rs("mailid")%>"
target="_self"><%=rs("mailEmne")%></a>
</td>

<td valign="top" width="30%" class="lille">
<%=rs("mailDato")%>
</td>

<td valign="top" align="center" width="10%" class="lille">
<%
'Forskelligt billede alt efter om brevet er læst eller ej
if rs("mailread") <> True then %>
<img src="symboler/mail_unread.gif">
<% else %>
<img src="symboler/mail_read.gif">
<% end if %>
</td>


<td align="center" valign="top" width="10%" class="normal">
<input type="checkbox" name="Slet" value="<%=rs("mailId")%>">
</td>

</tr>

<%
rs.MoveNext
loop 'loop færdigt

%>

</table>
<br><br>
<center>
<input type="submit" name="submit" text="Slet" value="Slet brev"><br><br>

</form>

<A HREF="get2you.asp?mode=hovedmenu" target="_self">Hovedmenu</A>
</center>
<br><br>
----------------------------------------------------------------------------
-----------------------------------








Anders Holbøll (28-08-2001)
Kommentar
Fra : Anders Holbøll


Dato : 28-08-01 08:29

Jakob Munck wrote:
>
> problemet er, at både afsender og modtager af disse "breve" skal
> kunne slette dem, og hvis f.eks. afsender vælger at slette før
> modtager, så må han ikke virkelig fjerne denne record fra
> tabellen, men skal blot afmærke den i feltet "valgSlet", så den
> ikke vises for ham mere. Derfor skal den nuværende kode ændres,
> så records først virkelig kan slettes af afsender eller modtager,
> hvis den anden har tilkendegivet det samme ønske ved at skrive
> "afsenderSlet" eller "modtagerSlet" i feltet "valgSlet".

Det var ikke det du sagde før, eller det var ihvertfald ikke det jeg
forstod det som før.

Slet = Request.Form("slet")
If Not (Slet = "") Then
sql3 = "DELETE FROM mail " & _
"WHERE mailId IN (" & Slet & ") " & _
"AND (mailAfsender = '" & Session("brugernavn") & "' " & _
"AND NOT (modtagerSlet = 0)) " & _
"AND (mailModtager = '" & Session("brugernavn") & "' " & _
"AND NOT (afsenderSlet = 0)) "
conn.Execute(sql3)

sql3 = "UPDATE mail SET modtagerSlet=1 " & _
"WHERE mailId IN (" & Slet & ") " & _
"AND mailModtager = '" & Session("brugernavn") & "' "
conn.Execute(sql3)

sql3 = "UPDATE mail SET afsenderSlet=1 " & _
"WHERE mailId IN (" & Slet & ") " & _
"AND mailAfsender = '" & Session("brugernavn") & "' "
conn.Execute(sql3)
End If

Du skal jo huske at tilføje noget i retning af dette til dine selects:
"AND (modtagerSlet = 0) " eller "AND (afsenderSlet = 0) "
Så brevene ikke vises, når de er blevet slettet.

> Den eksisterende udgave af dette, hvor kun modtager kan slette
> sine modtagne mails, kan ses på:
> www.get2you.dk ( log ind med navn og kodeord: nielsen )

Inden du postede addressen burde du nok have lukket dine
sikkerhedshuller.

--
Anders

Lars Hoffmann (28-08-2001)
Kommentar
Fra : Lars Hoffmann


Dato : 28-08-01 17:03

Jakob Munck wrote:
>
> Tak til jer begge for forslag, men de virker desværre ikke. Det er rigtigt,
> at jeg havde glemt at stryge et par udkommenteringstegn i min mail, men de
> er ikke i koden, så det er ikke årsagen. Det med at skrive response.write
> før sql4, det forstår jeg ikke. Hvordan skal det se ud?


Noget i denne stil:
sql4 = "DELETE FROM mail WHERE mailId IN (" & Request.Form("slet") & ")
and slet = '" & modtagerSlet & "'"

response.write(sql4)
'conn.Execute(sql4)

Så bliver din færdige sql-sætning skrevet ud på skærmen og du kan
fejlsøge på den. Hvis du bruger access kan du copy/paste det der kommer
frem på skærmen ind i access og se om den giver nogle fejlmeddelelser.
Med venlig hilsen
Lars Hoffmann

Jakob Munck (28-08-2001)
Kommentar
Fra : Jakob Munck


Dato : 28-08-01 22:26

Inspireret af jeres vejledning har jeg lavet følgende kode, som fuldt ud
løser problemet, når man lige har lavet 2 ekstra numeriske felter i
tabellen, hvor brevene listes.

Her er koden:

<%
........
'sletter afkrydsede indlæg
if Request.Form("slet").Count > 0 then

sql2 = "DELETE FROM mail WHERE modtagerSlet = 1 and mailId IN (" &
Request.Form("slet") & ")"
conn.Execute(sql2)

sql3 = "Update mail set afsenderSlet = 1 WHERE mailId IN (" &
Request.Form("slet") & ")"
conn.execute(sql3)

sql4 = "DELETE FROM mail WHERE modtagerSlet = 1 and afsenderSlet = 1"
conn.Execute(sql4)

end if
........
%>


Problemet er altså løst, og jeg takker - endnu en gang - meget for de gode
råd.

v.h.
Jakob Munck



Søg
Reklame
Statistik
Spørgsmål : 177557
Tips : 31968
Nyheder : 719565
Indlæg : 6408866
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste