เปลี่ยน 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 ข้อมูลทุกๆครั้ง ทุกๆหน้าครับ เคยทำมาแล้วเกือบเดี้ยงครับ

Editor's Talk!

สวัสดีคนที่หลงเดินทางเข้ามายัง Blog ของผม อาจจะด้วยความไม่ตั้งใจ หรือ ตั้งใจเข้ามาก็ตาม ก่อนอื่นผมก็ต้องขอออกตัวก่อนว่า Blog ของผมมันจะมีสาระบ้าง หรือ ไม่มีสาระเลย ก็แล้วแต่อารมณ์ช่วงไหนอยากเขียนอะไร อย่าเหมาว่า Blog ผมจะต้องมีแต่ความรู้เหมือน Blog ของคนอื่นๆ นะครับ
สำหรับ Blog นี้ ผมสามารถใช้คำพูดใดๆก็ได้ตามที่ผมเห็นสมควร เพราะมันคือ Blog ของกู(ผม) บางครั้งผมเขียนไปกระทบใครก็ขออภัยไว้ ณ. ที่นี้ด้วย ก็ไม่มีอะไรมากครับ ขอบคุณที่เข้ามาอ่าน Blog ของผมนะครับ

นายแม็ค

ค้นหา :