Avatar billede henrik2000 Nybegynder
24. januar 2001 - 11:37 Der er 7 kommentarer og
1 løsning

tæl felt op i database...

hej!
jeg bruger nogle server.variabler såsom \"REMOTE_ADDR\" der så indsætter brugerens ip-nummer i en række i databasen. Men hver gang den samme bruger med det samme ip-nummer logger på, så skriver den en ny række i databasen. hvordan laver jeg et \"tælle-felt\" i stedet for, således at den kun skriver ip-nummeret ned i databasen hvis det ikke findes i forvejen, og hvis det gør, så tæller den et antal-felt op.

Min testkode ser således ud:

<%
dim objconn,strconn,strQ
set objconn = server.CreateObject(\"ADODB.Connection\")
strconn =\"Data Source=Northwind;User ID=sa;Password=;\"

adresse = Request.servervariables(\"REMOTE_ADDR\")

objconn.Open strconn   

strQ=\"insert into tabel1 (REMOTE_ADDR) values (\'\" & adresse & \"\')\"

objconn.Execute strQ

%>

Avatar billede carpediem Nybegynder
24. januar 2001 - 11:50 #1
Først skal du lave en select statement der undersøger om IP adressen findes:
SELECT * FROM Nortwind WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"

Så skal du tjekke på om den fandt noget:
If rs.RecordCount > 0 Then

  Hvis den fandt noget, så skal du opdatere dit tælle felt:
  strCount = rs(\"Count\")
  strQ = \"UPDATE tabel1 SET Count = \" & strCount+1 & \" WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"

His ikke den finder noget, så skal du indsætte en ny:
strQ=\"insert into tabel1 (REMOTE_ADDR) values (\'\" & adresse & \"\')\"
Avatar billede henrik2000 Nybegynder
24. januar 2001 - 12:06 #2
ok, nu ser min kode så således ud. Men det giver følgende fejl:

Microsoft VBScript runtime error \'800a000d\'

Type mismatch

I accessdatabasen har jeg 2 felter: REMOTE_ADDR og COUNT.

--------------- start kode -----------------
dim objconn,strconn,strQ
set objconn = server.CreateObject(\"ADODB.Connection\")
strconn =\"Data Source=Northwind;User ID=sa;Password=;\"

adresse = Request.servervariables(\"REMOTE_ADDR\")

objconn.Open strconn   

strQ \"SELECT * FROM Northwind WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
\'Så skal du tjekke på om den fandt noget:
If rs.RecordCount > 0 Then
\'Hvis den fandt noget, så skal du opdatere dit tælle felt:  
strCount = rs(\"COUNT\")
strQ = \"UPDATE Tabel3 SET Count = \" & strCount+1 & \" WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
\'Hvis ikke den finder noget, så skal du indsætte en ny:
strQ=\"insert into tabel3 (REMOTE_ADDR) values (\'\" & adresse & \"\')\"
end if
objconn.Execute strQ

\'strQ=\"insert into tabel1 (REMOTE_ADDR) values (\'\" & adresse & \"\')\"

%>
Avatar billede carpediem Nybegynder
24. januar 2001 - 12:35 #3
Ok, vi tager den helt fra bunden:
adresse = Request.servervariables(\"REMOTE_ADDR\")
Lav din database connection og så:
Set rs = Server.CreateObject (\"ADODB.Recordset\")
Sql = \"SELECT * FROM tabel1 WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
rs.Open Sql, ObjConn, 3, 3
If rs.RecordCount > 0 Then
  strCount = rs(\"Count\")+1
  Set rs1 = Server.CreateObject (\"ADODB.Recordset\")
  Sql = \"UPDATE tabel1 SET COUNT = \" & strCount & \" WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
  rs1.Open Sql, ObjConn, 3, 3
Else
  Set rs1 = Server.CreateObject (\"ADODB.Recordset\")
  Sql = \"INSERT INTO tabel1 (REMOTE_ADDR, COUNT) VALUES (\'\" & adresse & \"\', 1)\"
  rs1.Open Sql, ObjConn, 3, 3
End If
Avatar billede sone Nybegynder
24. januar 2001 - 12:45 #4
Det kan faktisk laves endnu smartere:

SQL = \"UPDATE tabel1 SET COUNTER=COUNTER+1 WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
call Conn.Execute(SQL, rowsAffected)

IF rowsAffected=0 THEN
  Sql = \"INSERT INTO tabel1 (REMOTE_ADDR, COUNTER) VALUES (\'\" & adresse & \"\', 1)\"
  call Conn.Execute(SQL)
END IF

HUSK: COUNT er ikke et godt feltnavn, da det er et reserveret ord i SQL.
Avatar billede carpediem Nybegynder
24. januar 2001 - 12:47 #5
>>HUSK: COUNT er ikke et godt feltnavn, da det er et reserveret ord i SQL.

Sone>> Ups, den havde jeg ikke lige tænkt på...
Avatar billede henrik2000 Nybegynder
24. januar 2001 - 13:17 #6
ok - jeg prøvede lige denne her - den lød mest smart! Men jeg får nu følgende fejl:

Microsoft OLE DB Provider for ODBC Drivers error \'80040e10\'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.


<%
dim conn,strconn,SQL
set conn = server.CreateObject(\"ADODB.Connection\")
strconn =\"Data Source=Northwind;User ID=sa;Password=;\"

adresse = Request.servervariables(\"REMOTE_ADDR\")

conn.Open strconn

SQL = \"UPDATE tabel1 SET antal=antal+1 WHERE REMOTE_ADDR = \'\" & adresse & \"\'\"
call Conn.Execute(SQL,rowsAffected)

IF rowsAffected=0 THEN
  Sql = \"INSERT INTO Tabel3 (REMOTE_ADDR, antal) VALUES (\'\" & adresse & \"\', 1)\"
  call Conn.Execute(SQL)
END IF
%>

Avatar billede henrik2000 Nybegynder
24. januar 2001 - 13:18 #7
Glem det! fejlen var at jeg havde skrevet tabel1 og tabel3 i de 2 statements....

Mange tak, det virker fint - den kode kan godt anbefales!!!

Henrik
Avatar billede sone Nybegynder
24. januar 2001 - 14:17 #8
Jeps - kun ét kald hvis posten eksisterer i databasen.
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