Hejsan jag undrar hur ska man kontrollera två Id värden om dom finns med i databasen? select * from tabell where id=idnummer1 or id=idnummer2 Det är vackrare att skriva: <% Testa med: Hejsan jag får fortfarande felmeddelande: Mern nu säger den följande. Du skall inte rama in variablerna som text? Hela iden är at den ska kolla upp om Användare1 och användare 2 finns med i databasen i en och samma sql fråga. Skrev fel förut... det skall ju vara '''''''''''''''' i sqlsatsen menar du vanliga räknte tal 1,2 osv? Ja det menar jag, så mycket enklare och skonsammare mot databasen =) Om man bara ska kolla upp om dom finns i databasen.. SKa prova det nu direkt. Det är väldigt ineffektivt och resursslukande sätt att göra det på. Varför är det ineffektivt? För blir det förmycket trafik kanske hela allt llägger av då det blir förmycket. Och så vill vi inte ha det ju. Om man har insikt i vad som sker bakom kulisserna så kan man snabbt se vilken Ordo(Lite om ordo: http://www.dis.uu.se/dsv/education/courses/ht02/Algoritmer_datastrukt_oop/misc/Ordotal.doc)En SQL fråga.
Kan man göra det på en ända sql fråga?
så att det blir
Sql= select * From Tabell Where id = Idnummer1 and id = Idnummer2
If not rst.eof
kan man göra så där?
Eller det kanske strullar då det är 2 unika poster man söker?
För man kan ju göra så när man kollar efter användarnamn och lösenordet.
Men då är det i samam post.
Men kan man göra samma sak men för 2 olika poster som inte tillhör varandra?
Någon som vet?Sv: En SQL fråga.
..och sen kollar du om du fick två rader tillbaka.Sv: En SQL fråga.
<code>
strSQL = "SELECT Count(*) AS Antal FROM TabellNamn WHERE IdFält IN (" & idnummer1 &", " & idnummer2 & ")"
Set rs = con.Execute(strSQL)
If rs("Antal") = 2 Then
''Båda id existerar
End if
rs.Close
Set rs = Nothing
</code>
Detta förutsätter att inga dubleter får förekomma i tabellen. Möjligheterna att skriva dubleter kan hindras med hjälp av ett un ikt index/primärnyckel eller en constrant.Sv: En SQL fråga.
Id1 = Replace(Request.Querystring("Userid"),"''''","''''''''")
Id2 = Session("Userid")
Set con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../Db/Community.mdb") & ";"
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN(" & id1 & "," & Id2 & ")"
Response.write StrSql
''''Response.end
Set rs = con.Execute(strSQL)
If rs("Antal") = 2 Then
''''''''Båda id existerar
End if
rs.Close
Set rs = Nothing
%>
Så ser koden ut.
Men får följande felmedelande:
Microsoft OLE DB Provider for ODBC Drivers error ''''80040e14''''
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression ''''Id IN(A9928520-F1AE-4C4F-937E-EFF86F869608},D32CA2FA-EBF6-4A5F-9DEF-C7BD3EA14753})''''.
/user/Friends/friends_save.asp, line 9
Men när jag skriver ut sql får jag fölajnde meddelande.
SELECT Count(*) AS Antal FROM User WHERE Id IN({A9928520-F1AE-4C4F-937E-EFF86F869608},{D32CA2FA-EBF6-4A5F-9DEF-C7BD3EA14753})
vad är då fel?Sv: En SQL fråga.
<code>
<%
Id1 = Request.Querystring("Userid")
Id2 = Session("Userid")
Set con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../Db/Community.mdb") & ";"
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN(''" & Replace(id1, "''", "''''") & "'', ''" & Replace(Id2, "''", "''''") & "'')"
If False Then
Response.write StrSql
Response.end
Else
Set rs = con.Execute(strSQL)
If rs("Antal") = 2 Then
Response.write "Båda id existerar"
Else
Response.write "Antal = " & rs("Antal")
End if
rs.Close
Set rs = Nothing
End if
%>
</code>
Eller:
Testa med:
<code>
<%
Id1 = Request.Querystring("Userid")
Id2 = Session("Userid")
Set con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../Db/Community.mdb") & ";"
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN({guid " & Left(id1, 37) & "}, {guid" & Left(Id2, 37) & "})"
If False Then
Response.write StrSql
Response.end
Else
Set rs = con.Execute(strSQL)
If rs("Antal") = 2 Then
Response.write "Båda id existerar"
Else
Response.write "Antal = " & rs("Antal")
End if
rs.Close
Set rs = Nothing
End if
%>
</code>Sv: En SQL fråga.
Microsoft OLE DB Provider for ODBC Drivers error ''80040e14''
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression ''Id IN(guid A9928520-F1AE-4C4F-937E-EFF86F869608}, guidD32CA2FA-EBF6-4A5F-9DEF-C7BD3EA14753})''.
/user/Friends/friends_save.asp, line 15 Sv: En SQL fråga.
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN({''guid " & Left(id1, 37) & "}'', {''guid" & Left(Id2, 37) & "}'')" Sv: En SQL fråga.
Som jag har gjort nu kontrollerar den
Först 1 användaren.
Sen kontrolleraren 2 användaren i 2 rst men jag vill ha den kontrollen i en och samma.
Och det är där som problemet strullar.Sv: En SQL fråga.
<code>
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN({''''guid " & Left(id1, 37) & "}'''', {''''guid" & Left(Id2, 37) & "}'''')"
</code>
Har du testat att skriva ut och köra den frågan direkt i Access?
Sedan bara en liten fundering, varför kör du inte med en vanlig räknare (int) som unikt id för din user?Sv: En SQL fråga.
istället för {EEE999E} osv.
Nja blev bara så tyckte det skulle vara bättre.
Får följande felmeddelande:
Microsoft OLE DB Provider for ODBC Drivers error ''80040e14''
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression ''Id IN(''''''''guid A9928520-F1AE-4C4F-937E-EFF86F869608''''''''}'''''''', ''''''''guidD32CA2FA-EBF6-4A5F-9DEF-C7BD3EA14753}'''''''')''.
/user/Friends/friends_save.asp, line 15 Sv: En SQL fråga.
Pelles SQLInjection stör koden som skrivs i formumet....
strSQL = "SELECT Count(*) AS Antal FROM User WHERE Id IN({<enkelfnutt>guid " & Left(id1, 37) & "}<enkelfnutt>, <enkelfnutt>{guid" & Left(Id2, 37) & "}<enkelfnutt>)" Sv: En SQL fråga.
Är det inte bättre att söka igenom databasen (utan att skriva ut nåt) och sedan använda en if satts?
<code>
If RecSet("user1") = "lookup1" AND RecSet("user2") = "lookup2" Then
'' Skicka tillbaka användaren och generera felet att användarna redan finns
Else
'' Spara informationen
End If</code>
eller något sådant.. Tror ni inte att det skulle vara bättre?
Det kan ju bli mycket som kan bli fel om man sätter in det direkt i SQL:en.Sv: En SQL fråga.
Tackar.
Det är perfekt att ha det så.
men det finns så många olika sätt ibland så det kan vara lite svårt att hänga med.Sv: En SQL fråga.
Kan du skriva ut dina värden? Innehåller de måsvingar?Sv: En SQL fråga.
Kanske är mer kod men ändå. Det funkar ju och det tar ju inte upp så mycket resurser för att göra en liten if-satts.Sv: En SQL fråga.
Sv: En SQL fråga.
Om du gör en SQL fråga så kan servern kontrollera index. Detta är ett mycket snabbt och effektivt sätt.
Att öppna ett recordset innebär att servern måste läsa hela tabellen. I/O operationer till hårdisken är en flaskhals vad det gäller prestanda. Därför bör man undvika det.
Att läsa ett index från hårdisken och att läsa en tabell är en oerhört stor skillnad.
När vi sedan går igenom tabellen genom ett recordset innebär att navigerings operationen move next anropas på ADO(genom late binndings dessutom, USH!) sedan genom OLEDB Providern för att slutligen läsa databasen och retundera svaret tillbaks.
Att jämföra dessa två är inte ens intressant. Det självklara valet är att använda en SQL fråga. Det skall gå smärtfritt. Att ge upp och lösa det medd en loop anser jag var ett mycket svagt karraktärsdrag. Ungefär som att köra EP traktor i 30Km/h på tyska autonbane.
Jag hoppas mitt inlägg förklarat skillnaderna mellan de olika sätten att angripa problemet. Om ni har fråger kan ni be mig förtydliga mig. JAg hoppas inte mitt inlkägg på något sätt förolämpat någon av er läsare.
/Mvh, Andreas Hillqvist