เปลี่ยน IP ให้เป็นประเทศ
Sunday, November 30th, 2008เมื่อราวๆอาทิตย์ก่อนน้องที่ทำงานถามผมเรื่องจะเปลี่ยน IP ให้เป็นประเทศ ผมก็รู้สึกว่าผมเคยทำไว้นานมากๆแล้ว แต่ไม่รู้เอาโค๊ดไปไว้ที่ไหน วันนี้ก็เลยมานั่ง search ดูข้อมูลในเน็ตก็เลยเจอข้อมูลที่คงตอบคำถามของน้องเขาได้
ก็เริ่มตั้งแต่เราต้องหาดาต้าเบสที่มีการเก็บค่า IP ช่วงต่างๆไว้ ซึ่งก็มีตั้งแต่ดาต้าเบสฟรีๆให้โหลด หรือต้องเสียเงิน โดยส่วนมากช่วง ip ที่เก็บจะเก็บไว้ในรูป Long/decimal Format หรือตัวเลขเช่น 3232235521 ก็คือ 192.168.0.1 นั่นเอง
หากจะหาของฟรีก็สามารถโหลดได้ที่
http://www.ipligence.com/en/products/community.php
หากของเสียเงินก็โหลดได้ที่
http://www.ip2location.com/ip-country-isp.aspx
ของฟรี และไม่ฟรีต่างกันยังไง
ของฟรี
| Field Number | Field Name | Field Type | Field Description |
| 1 | IP_FROM | numerical | First IP address in Netblock. |
| 2 | IP_TO | numerical | Last IP address in Netblock. |
| 3 | COUNTRY_CODE | text | Two characters country code based on ISO 3166. |
| 4 | COUNTRY_NAME | text | Country name based on ISO 3166. |
| 5 | CONTINENT_CODE | text | Two characters continent code based on ISO 3166. |
| 6 | CONTINENT_NAME | text | Continent name based on ISO 3166. |
ของเสียเงิน
| Field Number | Field Name | Field Type | Field Description |
| 1 | IP_FROM | numerical | First IP address in Netblock. |
| 2 | IP_TO | numerical | Last IP address in Netblock. |
| 3 | COUNTRY_CODE | text | Two characters country code based on ISO 3166. |
| 4 | COUNTRY_NAME | text | Country name based on ISO 3166. |
| 5 | CONTINENT_CODE | text | Two characters continent code based on ISO 3166. |
| 6 | ISP_NAME | text | Internet Service Provider or company’s name. |
นี่คือโครงสร้างดาต้าเบสระหว่างของฟรี และเสียเงิน โดยของฟรี ณ วันที่ผมโหลดมามีข้อมูลอยู่ 166,982 ข้อมูล แต่ของเสียเงินมีข้อมูล 5,200,000 ข้อมูล (โอ้วพระเจ้าจ๊อดมันเยอะมาก) เพราะของเสียเงินเก็บถึงระดับของ ชื่อ ISP เลย เช่น maxnet เป็นต้น แต่ของฟรีไม่มี
แต่สำหรับผม แค่ของฟรีก็เกินพอแล้วครับ โหลดมาแล้วก็ import ข้อมูลซะก็ใช้ได้แล้ว
เสริมเรื่อง IP address หน่อยเพราะมันต้องเปลี่ยนจาก IP ปกติให้เป็น Long/decimal Format ซึ่งสามารถเปลี่ยนได้โดยการคำนวน ดังนี้
A.B.C.D = D + (C * 256) + (B * 256 * 256) + (A * 256 * 256 * 256) = ???
192.168.0.1 = 1 + (0 * 256) + (168 * 256 * 256) + (192 * 256 * 256 * 256) = 3232235521
คนที่เรียน Network ยังจำกันได้อยู่ไหมครับ แล้วก็จับมาเขียนลงในฟังก์ชั่นซะเลย
function IP2LONG($a){
$d = 0.0;
$b = explode(”.”, $a,4);
for ($i = 0; $i < 4; $i++) {
$d *= 256.0;
$d += $b[$i];
};
return $d;
}
จากนั้นก็เอาไปประยุกต์กันนะครับ โดยเอาค่าที่แปลงแล้วไปหาดูว่าอยู่ในช่วงไหน แล้วก็เอาค่าในนั้นออกมาแสดงเท่านั้นเอง อ่านเพิ่มเติมเองได้ที่
http://www.ipligence.com/en/faq/
ส่วนใครที่อยากได้ไอคอนรูปธงชาติก็โหลดได้ที่
http://www.ipligence.com/freetools/worldflags.zip
ขอให้มีความสุขกับการเขียนโปรแกรมครับ
** ข้อควรระวัง **
ผมแนะนำให้เขียนโค๊ดแบบนี้ในการเช็คครั้งแรกที่เข้าเว็บครับ แล้วเอาค่าที่ได้เก็บลง Session ไรพวกนี้ไว้ เพราะไม่เช่นนั้น Server คุณอาจจะทำงานหนักเกินไปที่ต้องนั่ง query ข้อมูลทุกๆครั้ง ทุกๆหน้าครับ เคยทำมาแล้วเกือบเดี้ยงครับ



















