Avatar billede random Nybegynder
30. august 2004 - 21:31 Der er 60 kommentarer og
1 løsning

Hvilket land er browseren åbnet i??

Hej

Jeg skal have udvidet mit CMS sådan at jeg kan have reklamer som passer til de forskellige lande. Derfor vil jeg gerne finde et script som kan se hvilket land som browseren er åbnet op i, sådan at jeg kan trække de rigtige bannere ud af min database.

I databasen ligger fx. bannerkode, ID og Land_kode (landkoden til Danmark hedder fx. dk)

Så jeg skal have lavet noget, så når browser "landet" = dk så udskrives kun bannere fra databasen med dk!

Kan det laves??
Avatar billede eagleeye Praktikant
30. august 2004 - 21:37 #1
Du kan bruge Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")

Den vil indeholde lande koder som er valgt eksempel (engelsk, dansk):  en-us,da
Avatar billede random Nybegynder
30. august 2004 - 21:50 #2
Hvis jeg bruger Request.ServerVariables("HTTP_ACCEPT_LANGUAGE") vil den så være dk hvis jeg åbner den i Danmark?
Avatar billede random Nybegynder
30. august 2004 - 21:53 #3
og hedder den engelske så "en" eller "en-us"?
Avatar billede oskar Nybegynder
30. august 2004 - 21:58 #4
nej da for danish, en for english, en-us for amerikask osv
http://www.henri-ruch.ch/ASP/info_visiteur/http_langue.asp en liste på fransk.
Avatar billede eagleeye Praktikant
30. august 2004 - 21:58 #5
Avatar billede eagleeye Praktikant
30. august 2004 - 22:00 #6
Engelsk vil være:  en
Avatar billede arne_v Ekspert
30. august 2004 - 22:01 #7
Du kan ikke bruge accept language til at bestemme hvilket land
brugeren kommer fra. Det fortæller mere hvilket sprog hans
programmer er i.

Hvis du vil have en professionel løsning skal du have fat i hans
IP adresse fra REMOTE_ADDR headeren og så den op i en IP til
lande database.
Avatar billede arne_v Ekspert
30. august 2004 - 22:09 #8
Du kan få gratis IP til lande databaser med 90-95% nøjagtighed og
kommercielle med 95-99% nøjagtighed.
Avatar billede arne_v Ekspert
30. august 2004 - 22:10 #9
Avatar billede random Nybegynder
30. august 2004 - 23:00 #10
hmm tror ikke jeg er helt med på hvordan REMOTE_ADDR virker, hvis det er det jeg skal bruge, for det skal være en pro løsning!

Hvordan virker det i praksis?
Avatar billede eagleeye Praktikant
30. august 2004 - 23:33 #11
Ja hvis du vil se hvor brugeren sidder i verden skal du bruge REMOTE_ADDR. Hvis du vil se hvilke sprog en bruge fortrækker at få vist er det HTTP_ACCEPT_LANGUAGE. De bruges på samme måde.

ip = Request.ServerVariables("REMOTE_ADDR")



Hvis du har downloaded database arne_v har linket til er her noget kode du kan bruge:


' Commenti: http://ip-to-country.webhosting.info/node/view/55
'------------------------------------------------------------------
Dim arrAsgIp, strDottedIp
Function DottedIp(userIP)
If Trim("[]" & userIP) <> "[]" Then
    arrAsgIp = Split(userIP,".")
    strDottedIp = arrAsgIp(0)*16777216 + arrAsgIp(1)*65536 + arrAsgIp(2)*256 + arrAsgIp(3)
  Else
    strDottedIp = "noIp"
  End If
DottedIp = strDottedIp
End Function

Dim strCountry, strCountry2

Function GetCountry(ip)
'Convert IP
  strDottedIp = DottedIp(ip)
  Dim strIP2Conn
  Dim Conn
  Dim Rs
  Dim strIP2SQL
  'If there is a valid IP address
  If strDottedIp <> "noIp" Then
    strIP2SQL = "SELECT * FROM Country WHERE IP_From <= " & strDottedIp & " and IP_To >= " & strDottedIp & ""
    ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.Mappath("ip-to-contry.mdb")
    Set Conn = Server.CreateObject("ADODB.Connection")
    Set rs = Server.CreateObject("ADODB.Recordset")
    Conn.Open ConnStr
    Rs.Open strIP2SQL, Conn
    If Rs.EOF Then
      strCountry = "(unknown)"
      strCountry2 = "xx"
    Else
      strCountry = Rs("Country")
      strCountry2 = Rs("Country2")
    End If
    Rs.Close
    Set Rs = Nothing
    Conn.Close
    Set Conn = Nothing
  Else
    strCountry = "(unknown)"
    strCountry2 = "xx"
  End If
End Function


ip = Request.ServerVariables("REMOTE_ADDR")
GetCountry (ip)
response.write strCountry  & "..." & strCountry2
Avatar billede random Nybegynder
30. august 2004 - 23:58 #12
Mit net har lige været gået ned, så jeg kigger lige på det i morgen, men tak end til nu :)
Avatar billede eagleeye Praktikant
31. august 2004 - 00:00 #13
ok, bemærk lige at der er en stave fejl i ip-to-contry.mdb i connection strengen :)
Men det får du nok rette når du afligevel skal rette stien til så den passer.
Avatar billede random Nybegynder
31. august 2004 - 13:09 #14
Hej, jeg har downloadet databasen, men den ligger i et CSV fil format og jeg er ik helt klar over hvordan jeg ekspotere den til min MySql db?

Skal hele scriptet køres hver gang en side loades, da reklamerne skrifter hver gang en side er loadet, eller skal det bare ligges ind i en cokkies, sådan at landet bare findes frem når websiden åbnes?
Avatar billede eagleeye Praktikant
31. august 2004 - 16:26 #15
Ja du kan gemme det i cookien, da cookien følger browseren.

Kan mySQL ikke importere en CSV fil via phpmyadmin interfaceet?
Det ville jeg tror den kunne.
Avatar billede random Nybegynder
01. september 2004 - 00:41 #16
hmm, jeg har prøvet og prøvet at importere CSV filen men når jeg bruger phpmyadmin interfacet, så er det somom det "fryser" fast - kan du gøre det?
Avatar billede random Nybegynder
01. september 2004 - 17:55 #17
Jeg har fundet denne på eksperten:

I PhpMyadmin gør følgende
1) vælg den tabel i den database, du vil importere til
2) vælg SQL-fanebladet
3) forneden, klik på "Importer tekstfil til tabellen"
4) sæt værdierne fornuftig ;-)
5) tryk send
Prøv dig frem med hvilke værdier du skal vælge. De afhænger af dit styresystem.

Men jeg får bare en fejl når jeg følger dette eksempel? øvv
Avatar billede eagleeye Praktikant
01. september 2004 - 17:58 #18
Har du lavet tabellen? Som denne:

CREATE TABLE iptocountry (ip_from int(4), ip_to int(4), country_code2 char(2),
country_code3 char(3), country_name varchar(50));


Når du vælger importer teskt fil så prøv også at rette:

"Fields terminated by " sættes ,

"Lines terminated by"  sættes til \n
Avatar billede eagleeye Praktikant
01. september 2004 - 18:45 #19
Jeg kan nu heller ikke lige så den til at tage filen på den måde. Jeg lavet et lille scritp som laver en linje i filen om til en insert into linje, så kan jeg få det til at virke via SQL sidens "Or Location of the textfile"
Avatar billede random Nybegynder
01. september 2004 - 23:09 #20
ok, hvordan ser det lille scritp ud og hvor skriver jeg det?
Avatar billede eagleeye Praktikant
02. september 2004 - 16:57 #21
Ja har kørt det min lokale web-server. Det åbner filen og skriver en ny fil:

<%
set fso=Server.CreateObject("Scripting.Filesystemobject")
set fin = fso.OpenTextFile("D:\test\ip-to-country.csv")
set fud = fso.OpenTextFile("D:\test\test2.csv",2,true)
do while not fin.AtEndOfStream
  str = fin.readline
  str = "insert into iptocountry  (ip_from, ip_to, country_code2, country_code3, country_name) values (" & replace(str,"""","'") & ");"
  fud.writeline str
loop
fin.Close
fud.Close
%>

jeg kan evt. zippe filen så du kan downloade den?
Avatar billede eagleeye Praktikant
02. september 2004 - 17:01 #22
Her er filen: http://www.eagleeye.dk/eks/ip-to-country.zip
Den hedder ip-to-country.txt når den er pakker ud.
Avatar billede random Nybegynder
03. september 2004 - 17:59 #23
Hej, jeg har nu hentet din zip-fil og brugt følgende på den under import af en tekstfil:

"Fields terminated by " sættes ,

"Lines terminated by"  sættes til \n


Men jeg får denne fejl???


SQL-forespørgsel : 

LOAD DATA LOCAL INFILE '/tmp/phpdf3NRn' INTO TABLE `iptocountry` FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n'

MySQL returnerede:


#1148 - The used command is not allowed with this MySQL version
Avatar billede random Nybegynder
03. september 2004 - 18:01 #24
Mine 5 felter i db'en hedder:

ip_from
ip_to
country_code2
country_code3
country_name
Avatar billede eagleeye Praktikant
03. september 2004 - 18:08 #25
Det er ikke den måde du skal bruge til den fil. Der skal du bruge:

Åben phpmyadmin
Vælg "SQL"
Nede ved  Or Location of the textfile  tryk på Browse og vælg filen
Avatar billede random Nybegynder
03. september 2004 - 21:08 #26
Arhh ok, skal jeg så heller ikke bruge den bruge den database jeg har oprettet som heddner ip-to-country? Her hvor jeg har tebellerne:

ip_from
ip_to
country_code2
country_code3
country_name
Avatar billede eagleeye Praktikant
03. september 2004 - 21:21 #27
arh ok, og jeg har kaldt den iptocountry. Men jeg kan da lige lave en ny fil men det navn.
Avatar billede eagleeye Praktikant
03. september 2004 - 21:25 #28
Sådan nu er den lavet med tabelnavnet ip-to-country
Avatar billede random Nybegynder
04. september 2004 - 02:28 #29
ok, jeg prøver lige at downloade den igen :)
Avatar billede random Nybegynder
04. september 2004 - 16:46 #30
hmm, nu kan jeg få overført ca. 4000 emner, men der er ca. 50.000 - ved ikke hvorfor den ikke tager alle med over - kan du ligge alle 50.000 ind??
Avatar billede random Nybegynder
05. september 2004 - 13:47 #31
Jeg får denne Fejl??

SQL-forespørgsel : 

INSERT INTO `ip-to-country` ( ip_from, ip_to, country_code2, country_code3, country_name )
VALUES (

'1043900928', '1043901695', 'CI', 'CIV', 'COTE D'IVOIRE ');
insert into `ip-to-country`  (ip_from, ip_to, country_code2, country_code3, country_name) values ('1043901696 ','1043901951 ','BJ ','BEN ','BENIN ');

insert into `ip-to-country`  (ip_from, ip_to, country_code2, country_code3, country_name) values ('1343222272 ','1343222287 ','CI ','CIV ','COTE D 'IVOIRE'
)

MySQL returnerede:


#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'IVOIRE');
insert into `ip-to-country`  (ip_from, ip_to, countr
Avatar billede arne_v Ekspert
05. september 2004 - 14:01 #32
Der er en single quote i

'COTE D'IVOIRE '

den skal enten fordobles - altså

'COTE D''IVOIRE '

eller escapes - altså

'COTE D\'IVOIRE '

eller (for at undgå en kæmåe søg og erstat) så skal der loades
på en måde der kan klare single quotes i data
Avatar billede arne_v Ekspert
05. september 2004 - 14:02 #33
Og hvorfor fanden kan de ikke bare kalde det Elfenbenskysten (dansk)
eller Ivory Coast (engelsk) ??
Avatar billede eagleeye Praktikant
05. september 2004 - 15:42 #34
Ja det havde jeg ikke lige tænkt på der var lande navne som kunne indeholde ' :)
Jeg har lavet en ny fil som tager højde for det.
Avatar billede random Nybegynder
05. september 2004 - 19:32 #35
ok, jeg har downloadet din .zip fil igen Eagleeye og brugt fremgangsmåen:

Åben phpmyadmin
Vælg "SQL"
Nede ved  Or Location of the textfile  tryk på Browse og vælg filen

Men nu efter 15 min får jeg bare et hvidt skærmvindue og der er ikke kommet noget data i databasen ip-to-country - virker det for Jer??
Avatar billede eagleeye Praktikant
05. september 2004 - 20:02 #36
Jeg har ikke prøvet hele filen før nu og den fejler efter et stykke tid. Så har jeg prøvet at lave en anden fil og den fejler ikke dog siger den efter noget tid "No SQL query". Men tager jeg et udpluk så viker det fint.... Der måske en grænse for max størrelsen på filen prøver lidt at halvere den. Den fil som ikke giver en fejl kode er uploaded.
Avatar billede eagleeye Praktikant
05. september 2004 - 20:27 #37
Hvis jeg sætter dem in 5000 linjer ad gangen vil den godt tage dem
Avatar billede eagleeye Praktikant
05. september 2004 - 21:12 #38
Jeg har lavet en ny fil med 7850 i hver og med en anden SQL sætning det vil den godt tage på min det er dog i 7 filer så. Kan du oploade sådan en?
Avatar billede random Nybegynder
05. september 2004 - 21:32 #39
Ok! Kan jeg oploade hvilken en??
Avatar billede eagleeye Praktikant
05. september 2004 - 21:35 #40
hvis du downloader zip filen er der 7 filer i den. Kan du loade en af dem ind i mySQL uden fejl?
Avatar billede random Nybegynder
05. september 2004 - 21:39 #41
Arhh, om jeg kan oploade de 7 filer? Ja, jeg har lige oploadet den 1. uden problemer, så jeg prøver lige med de andre også:)
Avatar billede eagleeye Praktikant
05. september 2004 - 21:43 #42
Ok
Jeg har fundet ud af der en fejl i en sidste fil, fil nr.7. Du skal åbne den med notepad og scrolle hent ned til sidste linje. Ret det sidste komma i linjen til et semikolon. Eller bliver de den ikke sat ind i tabelen.

Så dette:
('3758096384','4294967295','US','USA','UNITED STATES'),

Bliver til:
('3758096384','4294967295','US','USA','UNITED STATES');
Avatar billede random Nybegynder
05. september 2004 - 22:41 #43
Super, nu er alle 60.000 emner lagt i databasen!

Da der kun lå 4000 emner i databasen virkede det fint, og den udskrev et land under response.write, men nu skriver den følgende fejl og jeg har ikke rettet i scriptet!

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.


Her er scriptet som jeg bruger:

Dim arrAsgIp, strDottedIp
Function DottedIp(userIP)
If Trim("[]" & userIP) <> "[]" Then
    arrAsgIp = Split(userIP,".")
    strDottedIp = arrAsgIp(0)*16777216 + arrAsgIp(1)*65536 + arrAsgIp(2)*256 + arrAsgIp(3)
  Else
    strDottedIp = "noIp"
  End If
DottedIp = strDottedIp
End Function

Dim strCountry, strCountry2

Function GetCountry(ip)
'Convert IP
  strDottedIp = DottedIp(ip)
  Dim strIP2Conn
  Dim Conn
  Dim Rs
  Dim strIP2SQL
  'If there is a valid IP address
  If strDottedIp <> "noIp" Then
 
 
    strIP2SQL = "SELECT * FROM COUNTRY WHERE IP_From <= " & strDottedIp & " and IP_To >= " & strDottedIp & ""
    Set rs = Server.CreateObject("ADODB.Recordset")
    Rs.Open strIP2SQL, strDNS
    If Rs.EOF Then
      strCountry = "(unknown)"
      strCountry2 = "xx"
    Else
      strCountry = Rs("Country")
      strCountry2 = Rs("Country2")
    End If
    Rs.Close
    Set Rs = Nothing
  Else
    strCountry = "(unknown)"
    strCountry2 = "xx"
  End If
End Function


ip = Request.ServerVariables("REMOTE_ADDR")
GetCountry (ip)
response.write strCountry  & "..." & strCountry2
Avatar billede eagleeye Praktikant
05. september 2004 - 22:43 #44
denne sql sætning skal rette:

strIP2SQL = "SELECT * FROM COUNTRY WHERE IP_From <= " & strDottedIp & " and IP_To >= " & strDottedIp & ""

til denne:

strIP2SQL = "SELECT * FROM `ip-to-country` WHERE IP_From <= " & strDottedIp & " and IP_To >= " & strDottedIp & ""
Avatar billede eagleeye Praktikant
05. september 2004 - 22:44 #45
Disse to linjer:

      strCountry = Rs("Country")
      strCountry2 = Rs("Country2")

skal rette til:

      strCountry = Rs("country_name")
      strCountry2 = Rs("country_code2")
Avatar billede random Nybegynder
05. september 2004 - 22:59 #46
ok, det er bare fordi jeg har døbt tabellen om til COUNTRY, men det hjalp at ændre til dette:

strCountry = Rs("country_name")
      strCountry2 = Rs("country_code2")

Nu udskriver den DENMARK...DK

Så skal jeg lige høre! Skal jeg så bare ligge outputtet ind i en session("land"), sådan at jeg kan lave en anden tabel hvor mine bannere ligger i, så hvor jeg kan lave noget ligneden:

udskriv banner WHERE banner_land = session("land")

Er det måden??
Avatar billede eagleeye Praktikant
05. september 2004 - 23:01 #47
Ja det vil være måden, så kan du gemme DK eller DENMARK alt efter hvad du har gemt i din tabel banner. Der skal lige ' omkring når det tekst:

..WHERE banner_land = '" & session("land") & "'"
Avatar billede random Nybegynder
05. september 2004 - 23:06 #48
ok, det vil jeg prøve at se på, du får dine point og en kanon karma, da du har gjort det rigtig godt..

Jeg skriver lige hvis der er noget der driller, når jeg skal lave ..WHERE banner_land = '" & session("land") & "'" - OK?
Avatar billede eagleeye Praktikant
05. september 2004 - 23:07 #49
Ok :)
Ja bare spørg hvis den driller
Avatar billede random Nybegynder
05. september 2004 - 23:13 #50
ska lige høre, kan jeg udskrive country_name i en select box hvor den kun skrive landet ud én gang? DENMARK står der jo mange gange!
Avatar billede random Nybegynder
05. september 2004 - 23:19 #51
Jeg skal nok sætte nogle flere point på :)
Avatar billede eagleeye Praktikant
05. september 2004 - 23:26 #52
Så skal du lave en sql sætning som denne:

select distinct country_name, country_code2 from COUNTRY
Avatar billede eagleeye Praktikant
05. september 2004 - 23:26 #53
Så skulle den gerne kun tage et land ud en gang.
Avatar billede random Nybegynder
05. september 2004 - 23:45 #54
ja det virker fint - tak
Avatar billede random Nybegynder
06. september 2004 - 20:35 #55
Skal lige høre hvor sikkert dette system er? Jeg har lige testet det på en som sidder i Holland, og der står at han kommer fra USA?

Når jeg selv logger på, så står der rigtigt nok at jeg kommer fra DENMARK
Avatar billede arne_v Ekspert
06. september 2004 - 20:54 #56
Regn med 90-95% nøjagtighed for en gratis.
Avatar billede arne_v Ekspert
06. september 2004 - 20:55 #57
Der er bedre kommercielle løsninger pris fastsat fra det rimelige til det ublu
(jeg kalder 6 cifrede dollar beløb om året ublu).
Avatar billede random Nybegynder
06. september 2004 - 21:55 #58
ok, fint nok - 90-95% kan jeg godt acceptere, når det er gratis :)
Avatar billede arne_v Ekspert
06. september 2004 - 22:04 #59
Det skal iøvrigt understregs at det er udgangen til internettet der
identificeres.

Hvis du dialer ind til din TDC Internet account fra et hotel i udlandet
så er IP adressen TDC og dermed Danmark.

Hvis du arbejder for et amerikansk firma og firmaets eneste internet
tilslutning er i USA, så er IP adressen amerikansk.

Men i det første tilfælde er Danmark jo nok i virkeligheden det svar
man helst vil have.

(i det andet tilfælde er der ikke noget at gøre - det eneste man kender
er IP adressen på ydersiden af firmaets firewall - der er ingen måde at
udlede noget firmaets interne net)
Avatar billede arne_v Ekspert
06. september 2004 - 22:04 #60
Du skal iøvrigt huske at opdatere databasen en gang imellem, da data ændrer
sig en lille smule hel tiden.
Avatar billede random Nybegynder
07. september 2004 - 07:52 #61
ok, tak for det - hvis du bare vidste hvilket bøvl det bare at været at få dataen ind i min MySql - så opdatering bliver vist ikke hver uge ;-)
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