我一直在測試一些代碼,以允許我阻止來自特定國家的用戶的廣告和視頻。這不是什麼新東西,當然不應該很難做到,但是我無法將它整理到IPv6地址,因爲我不知道如何處理這些地址。我使用這個數據庫http://db-ip.com/db/最初看起來是這樣的:通過IP獲取國家/地區位置(IPv4,IPv6)
一切將兩個IP列值二進制和移動到新表後,我有這樣的:
這裏是測試代碼(當我對它進行分類時,我將使用cfc和存儲過程代替):
<!--- manualy change IPs to check if the code works --->
<cfset ipaddress="1.0.127.255">
<cfset ipToArray = listToArray(ipaddress,".")>
<cfset ipBinary= (ipToArray[1] * (256)^3) + (ipToArray[2] * (256)^2) + (ipToArray[3] * 256) + ipToArray[4]>
<cfquery name="getCountry" datasource="mydatabase">
SELECT country
FROM dbip_lookup
WHERE #ipBinary# >= bin1 AND #ipBinary# <= bin2
</cfquery>
<cfoutput>#getCountry.country#</cfoutput>
正如你所看到的,沒有什麼太花哨只是一個簡單的測試代碼,與IPv4協同工作:) 我應該以某種方式將IPv6轉換爲二進制文件使其工作?如果是這樣,如何做到這一點或有其他方式來實現相同的功能?我真的不知道從哪裏開始:(
編輯 - 循序漸進的過程
創建數據庫表與網站代碼(ADDR_TYPE不csv文件存在,所以我刪除的列,以便能夠正確導入CSV)
CREATE TABLE `dbip_lookup` (
`ip_start` varbinary(16) NOT NULL,
`ip_end` varbinary(16) NOT NULL,
`country` char(2) NOT NULL,
PRIMARY KEY (`ip_start`)
);
表後,已成功創建試圖填充數據
LOAD DATA INFILE 'C:/dbip-country.csv'
INTO TABLE dbip_lookup2
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
無法拋出以下錯誤消息:「10:07:52 LOAD DATA INFILE'C:/dbip-country.csv'INTO TABLE dbip_lookup2 FIELDS TERMINATED BY','ENCLOSED BY''''LINES TERMINATED BY'\ r \ n'錯誤代碼:1406.行158131行'ip_end'的數據太長19.641秒 「158131行是IPv6地址開始的地方。
將兩個varbinary列都修改爲(50)mysql成功創建並使用上面的代碼填充表。
你有點簡化CFM代碼(它不工作兩種方式)
<cfset InetAddress = createObject("java", "java.net.InetAddress")>
<cfset addrStart = InetAddress.getByName("2001:0db8:85a3:08d3:1319:8a2e:0370:7344").getAddress()>
<!--- for MySQL. Use TOP 1 for SQL Server --->
<cfquery name="qResult">
select country from dbip_lookup2
where ip_start <= "#addrStart#"
</cfquery>
<cfoutput>#qResult.country#</cfoutput>
觸發自定義錯誤處理程序:
線43就是WHERE子句開始
http://db-ip.com/db/確實支持IPv6,DB中有很多:) – user2595617