Just nu i M3-nätverket
Gå till innehåll

Unika besökare


Rest man Klaymen

Rekommendera Poster

Rest man Klaymen

Jag har en webbplats där besökaren kan ändra olika inställningar på sidan som sedan sparas med cookies. Jag vill lägga till en funktion där varje användare loggas så att jag kan se vad de senaste tio besökarna haft för inställningar. Mitt problem är att när jag lägger in informationen i databasen vill jag ju att om en persnons IP redan finns där så ska det inte skapas en ny post utan posten med hans IP ska bara uppdateras så att hans senaste inställningar loggas samt tid och datum. Hur gör jag detta? Jag antar att jag måste använda INSERT INTO WHERE IP = "Request.ServerVariables"... och så vidare.. men jag vet inte exakt hur jag ska skriva. hjälp mig. Så här ser databaskopplingen ut, hoppas att jag inte behöver bygga om den för mycket...

 

 <%

Set Connect = Server.CreateObject("ADODB.Connection")

Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp; Server.MapPath("\kallsign\jk\db\stats.mdb")

Set RecSet = Server.CreateObject("ADODB.Recordset")

Add = "SELECT * FROM statistik"

RecSet.Open Add, Connect, 1, 3

RecSet.AddNew

Recset("IP") = Request.ServerVariables("REMOTE_ADDR")
RecSet("Webblasare") = Request.ServerVariables("HTTP_USER_AGENT")
RecSet("Datum") = Date
RecSet("Tid") = Time
RecSet("Bg") = Request.Cookies("installningar")("bgfarg")
RecSet("Fg") = Request.Cookies("installningar")("fgfarg")
RecSet("Snitt") = Request.Cookies("installningar")("snitt")
RecSet("Storlek") = Request.Cookies("installningar")("storlek")

RecSet.Update
RecSet.Close

Connect.Close

%> 

 

Tack på förhand!!

 

[inlägget ändrat 2003-10-12 18:41:10 av Rest man Klaymen]

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Ingen som vet?? Så krångligt var det väl inte? Snälla jag behöver hjälp för det skulle ta 98.5 timmar att lista ut det själv...

 

[inlägget ändrat 2003-10-13 09:48:04 av Rest man Klaymen]

Länk till kommentar
Dela på andra webbplatser

Kolla först om ip-adressen redan finns i db med en select sats, sen kan du köra en update eller insert beroende på vad kollen gav.

 

 

.::] a1 [::..........................

Det inte jag kan kan ni andra...

.::]2003[::..........................

 

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

OK det låter bra, men hur ska jag skriva?

 

 IF SELECT IP FROM statistik = "Request.ServerVariables("REMOTE_ADDR")" THEN

UPDATE WHERE IP = "Request.ServerVariables("REMOTE_ADDR")"

Else

INSERT...

 

Jag är inte helt haj på hur jag ska skriva rent praktiskt. Tack för hjälpen i alla fall.. du ledde in mig på ett spår..

 

Länk till kommentar
Dela på andra webbplatser

SQL = SELECT IP from table WHERE IP ='"&request.servervariables("REMOTE_ADDR") & "'"

set rs=con.execute(SQL)

 

if rs.eof then

insert....

 

else

update...

 

End if

 

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

OK tack för hjälpen .. jag löste det så här:

 


<% Set Connect = Server.CreateObject("ADODB.Connection")

Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\kallsign\jk\db\stats.mdb")

Set RecSet = Server.CreateObject("ADODB.Recordset")

Test = "SELECT * from statistik WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

RecSet.Open Test, Connect, 1, 3

If Recset.EOF Then

RecSet.Close

Test = "SELECT * FROM statistik"

RecSet.Open Test, Connect, 1, 3

RecSet.AddNew

Recset("IP") = Request.ServerVariables("REMOTE_ADDR")
RecSet("Webblasare") = Request.ServerVariables("HTTP_USER_AGENT")
RecSet("Datum") = Date
RecSet("Tid") = Time
RecSet("Bg") = Request.Cookies("installningar")("bgfarg")
RecSet("Fg") = Request.Cookies("installningar")("fgfarg")
RecSet("Snitt") = Request.Cookies("installningar")("snitt")
RecSet("Storlek") = Request.Cookies("installningar")("storlek")

RecSet.Update


Else 

RecSet.Close

Test = "SELECT * from statistik WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

RecSet.Open Test, Connect, 1, 3

RecSet("Webblasare") = Request.ServerVariables("HTTP_USER_AGENT")
RecSet("Datum") = Date
RecSet("Tid") = Time
RecSet("Bg") = Request.Cookies("installningar")("bgfarg")
RecSet("Fg") = Request.Cookies("installningar")("fgfarg")
RecSet("Snitt") = Request.Cookies("installningar")("snitt")
RecSet("Storlek") = Request.Cookies("installningar")("storlek")

RecSet.Update

End If

RecSet.Close

Connect.Close


%>

 

Finns det något bättre sätt, har detta sett några allvarliga buggar, och borde jag städa upp lite eller ser allt bra ut... Det funkar i alla fall ich det är huvudsaken tycker jag men det ser lite stökigt ut..

 

Länk till kommentar
Dela på andra webbplatser

Test = "SELECT * FROM statistik"

RecSet.Open Test, Connect, 1, 3

RecSet.AddNew

Recset("IP") = Request.ServerVariables("REMOTE_ADDR")
RecSet("Webblasare") = Request.ServerVariables("HTTP_USER_AGENT")
RecSet("Datum") = Date
RecSet("Tid") = Time
RecSet("Bg") = Request.Cookies("installningar")("bgfarg")
RecSet("Fg") = Request.Cookies("installningar")("fgfarg")
RecSet("Snitt") = Request.Cookies("installningar")("snitt")
RecSet("Storlek") = Request.Cookies("installningar")("storlek")

RecSet.Update

 

Vet du vad du gör här? Det du gör är att du hämtar alla rader från databasen i tabellen statistik och lägger dessa i ett recordset som du sedan skickar till din ASP sida som sedan lägger till en ny rad och sedan skickar tillbaka hela recordsetet till databasen. Detta kanske fungerar bra om man har 10 poster i sin databas. Hur tror du det påverkar prestandan när man har säg 1 miljon poster i databasen?

 

Jag har sett dessa exemple på många sidor som har kurser där man skall lära sig ASP. Alla dessa sidor borde få en FET SMÄLL.

 

Du skall givetviss inte använda dig av RecSet.add/RecSet.Update. Utan använda dig av vanlig SQL kommando. INSERT och UPDATE.

 

Här kommer ett kodexempel

<% 
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\kallsign\jk\db\stats.mdb")

sSQL = "INSERT INTO statistik (IP, Webblasare, Datum) VALUES('"& Request.ServerVariables("REMOTE_ADDR") &"','"& .ServerVariables("HTTP_USER_AGENT") &"',#"& Now() &#)"

Connect.Execute sSQL,,128
Connect.close
set Connect = nothing

 

Du skall inte heller dela upp Datum och Tid i 2 kolumner som du har gjort. Det är bättre att ha dessa i en kolumn och sedan dela upp de på din sida om du behöver det. Detta gör att det blir lättare att använda datum i sök/join vilkor i dina SQL satser.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Ja det kan du ha rätt i. Ska ändra det. Visst jag vet hur man lägger till data me dSQL (INSERT) men när jag ska uppdatera blir det ju krångligare.. hur ska jag skriva då? Och hur skriver jag för att lägga in två variabler i samma kolumn? & Time & , & Date & eller?

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Så här skrev jag

 

<% 
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\kallsign\jk\db\stats.mdb")

Test = "SELECT * from statistik WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

If Test.EOF Then

sSQL = "INSERT INTO statistik (IP, Webblasare, Datum) VALUES('"& Request.ServerVariables("REMOTE_ADDR") &"','"& .ServerVariables("HTTP_USER_AGENT") &"',"& Now() &")"

Else

sSQL = "UPDATE SET Webblasare = '"& request.servervariables("HTTP_USER_AGENT") &"' SET Datum = "& Now()&" & WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"'"

End If

Connect.Execute sSQL,,128
Connect.close
set Connect = nothing

%>

 

Då fick jag meddelandet

 

Körningsfel i Microsoft VBScript fel '800a01a8'

 

Objekt krävs.: 'SELECT * from statis'

 

/kallsign/jk/index.asp, rad 15

 

Vad gjorde jag för fel?

 

Länk till kommentar
Dela på andra webbplatser

Test = "SELECT * from statistik WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

 

du har aldrig gjort execute på denna

du kan inte använda test.eof om inte den är öppnad...

 

[inlägget ändrat 2003-10-13 12:08:12 av lillen_009]

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Jag märkte det, men tack ändå.. vad är det för fel på det här då ?

 

sSQL = "UPDATE statistik SET Webblasare = '"& request.servervariables("HTTP_USER_AGENT") &"' SET Datum = '"& Now() &"' WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"'  "

 

Det generear felet

Microsoft JET Database Engine fel '80040e14'

 

Syntaxfel (operator saknas) i frågeuttrycket ''Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)' SET Datum = '2003-10-13 12:15:44''.

 

/kallsign/jk/index.asp, rad 26

 

Jag vet att det är SET Datum som är fel, man ska skriva på nåt annat sätt för att uppdatera två olika kolumner, men på vilket sätt då??

 

Länk till kommentar
Dela på andra webbplatser

sSQL = "UPDATE statistik SET Webblasare = '"& request.servervariables("HTTP_USER_AGENT") &"' SET Datum = '"& Now() &"' WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

 

SET använder man vid första, kommatecken vid resten...

ska väl vara:

sSQL = "UPDATE statistik SET Webblasare = '"& request.servervariables("HTTP_USER_AGENT") &"', Datum = '"& Now() &"' WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' "

 

[inlägget ändrat 2003-10-13 12:20:11 av lillen_009]

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Men då säger den

Microsoft JET Database Engine fel '80040e10'

 

Det har inte angetts något värde för en eller flera nödvändiga parametrar.

 

/kallsign/jk/index.asp, rad 26

Jag har skrivit
<% 
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp; Server.MapPath("\kallsign\jk\db\stats.mdb")

Set Test = Connect.Execute("SELECT * from statistik WHERE IP = '"&amp; request.servervariables("REMOTE_ADDR") &amp;"' ") 


If Test.EOF Then

sSQL = "INSERT INTO statistik (IP, Webblasare, Datum) VALUES('"&amp; Request.ServerVariables("REMOTE_ADDR") &amp;"','"&amp; .ServerVariables("HTTP_USER_AGENT") &amp;"',"&amp; Now() &amp;")"

Else

sSQL = "UPDATE statistik SET Webblasare = '"&amp; request.servervariables("HTTP_USER_AGENT") &amp;"' , Datum = '"&amp; Now() &amp;"' WHERE IP = '"&amp; request.servervariables("REMOTE_ADDR") &amp;"'  "

End If

Connect.Execute sSQL,,128     <!-- Detta är rad 26 -->
Connect.close
set Connect = nothing

%>

 

Något är galet.. men vad?

 

[inlägget ändrat 2003-10-13 12:24:09 av Rest man Klaymen]

Länk till kommentar
Dela på andra webbplatser

du har bara .ServerVariables i INSERT frågan

 

edit

om det inte var det... försöker du uppdatera eller lägga till nytt?

[inlägget ändrat 2003-10-13 12:27:54 av lillen_009]

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Jag vill uppdatera om ip-adressen finns i databasen. om den inte finns där så vill jag lägga till nytt... DVS jag vill logga unika besökare, eller unika IP-nummer om du så vill...

 

Och vad menar du med att jag bara har .ServerVariables i frågan..? Vad ska jag göra med edit??

 

Länk till kommentar
Dela på andra webbplatser

Måste inte du ha Request.ServerVariables där också? (i INSERT alltså). Med edit menade jag bara att det var ett tillägg till mitt ursprungliga inlägg

 

.Servervariables säger väl inte så mycket

[inlägget ändrat 2003-10-13 13:22:10 av lillen_009]

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

hehe ahaaa jag hade mssar. Request.. tack för att du upptäckte det... Nu ska vi se om d et funkar!!

 

Nej´

Syntaxfel (operator saknas) i frågeuttrycket '2003-10-13 13:30:58'.

 

Det är den här raden det är fel på

 Connect.Execute sSQL,,128 

 

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Nej nu funkar det. så här skrev jag:

<% 
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\kallsign\jk\db\stats.mdb")

Set Test = Connect.Execute("SELECT * from statistik WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"' ") 


If Test.EOF Then 

sSQL = "INSERT INTO statistik (IP, Webblasare, Tid, Bg, Fg, Snitt, Storlek) VALUES('"& request.servervariables("REMOTE_ADDR") &"','"& Request.ServerVariables("HTTP_USER_AGENT") &"','"& Now() &"','"& Request.Cookies("installningar")("bgfarg") &"' ,'"& Request.Cookies("installningar")("fgfarg") &"' ,'"& Request.Cookies("installningar")("snitt") &"' ,'"& Request.Cookies("installningar")("storlek") &"')"

Else

sSQL = "UPDATE statistik SET Webblasare = '"& request.servervariables("HTTP_USER_AGENT") &"' , Tid = '"& Now() &"' , Bg = '"& Request.Cookies("installningar")("bgfarg") &"' , Fg = '"& Request.Cookies("installningar")("fgfarg") &"' , Snitt = '"& Request.Cookies("installningar")("snitt") &"'  , Storlek = '"& Request.Cookies("installningar")("storlek") &"'WHERE IP = '"& request.servervariables("REMOTE_ADDR") &"'  "


End If

Connect.Execute sSQL,,128
Connect.close
Set Connect = nothing

%>

 

Tack för all hjälp!! Ni får poäng allihopa!!

 

Länk till kommentar
Dela på andra webbplatser

'"& Now() &"'

 

Till Access har man # runt datumen. Detta tyder på att din kolumn som har datum isig inte är av typen DateTime utan Text.

 

Visst kan man ha Text där. Det kommer dock att strula om du vill göra en massa ORDER BY på ditt fält om det är av typen text när det borde vara DateTime.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Hur ska jag göra om den här raden så att den passar i ett DateTime fält?

 

 

 ... ,'"& Now() &"', ... 

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Nej vänta jag löste det.. men när jag hämtar min RecSet("Tid") sen hur gör jag för att få snyggare fomrat på tiden? Nu står det 10/13/2003 4:41:13 PM istället för 13-10-2003 16:41:13. Hur ändrar jag det i efterhand.. för det står rätt i databasen, det är sidan som visar fel...

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Antingen bygger du upp strängen själv med Day,Month,Year osv. eller så använder du funktionen

FormatDateTime(datumObjekt,visningStil)

 

där visningsStil är ett av följande:

vbGeneralDate

vbLongDate

vbShortDate

vbLongTime

vbShortTime

 

Hur den visar datumet beror då på inställningarna i Kontrollpanelen->Landsinställningar

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Men hur ska jag skriva när jag hämtar data ur databasen? RecSet("Tid" ,vbGeneralDate) eller vadå? eller bara RecSet("Tid")(vbGeneralDate). hjälp mig tack!

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...