۱۳۸۹/۱۲/۰۷

بدست آوردن کشور یک آدرس IP به کمک MySQL

سلام :)

مطلب امروز روشی برای بدست آوردن کشور یک آدرس IP (بخوانید آی پی) با استفاده از پایگاه داده MySQL را آموزش می دهد. در این مطلب ابتدا یک جدول که حاوی نام کشور و محدوده IP های آن می باشد ایجاد می کنیم. سپس با تعریف یک تابع، امکان تشخیص سریع کشور مرتبط با هر آی پی را ارائه می دهیم.

IP چیست؟


به نقل از صفحه «نشانی پروتکل اینترنت» در ویکی پدیا، دانشنامه آزاد:

نشانی پروتکل اینترنت (Internet Protocol Address) یا به اختصار نشانی آی‌پی (IP Address) نشانی‌ عددی است که به هریک از دستگاه ها و رایانه‌های متصل به شبکه ی رایانه ای که بر مبنای نمایه TCP/IP (از جمله اینترنت) کار می‌کند، اختصاص داده می‌شوند. پیام‌هایی که دیگر رایانه‌ها برای این رایانه می‌فرستند با این نشانه ی عددی همراه است و راه یاب های شبکه آن را مانند «نشانی گیرنده» در نامه‌های پستی تعبیر می‌کنند، تا بالاخره پیام به رابط شبکه رایانه مورد نظر برسد.


جدول پایگاه داده


من اطلاعات مربوط به محدوده آدرس های آی پی و کشور مرتبط با آنها در جدولی با نام ip_location ذخیره کرده ام. برای ایجاد این جدول دستور زیر را در خط فرمان MySQL وارد نمایید:
[sql]
CREATE TABLE `ip_location` (
`from_ip` int(15) DEFAULT NULL,
`to_ip` int(15) DEFAULT NULL,
`country` varchar(32) DEFAULT NULL,
KEY `from_ip` (`from_ip`,`country`),
KEY `to_ip` (`to_ip`,`country`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
[/sql]
مرحله بعد وارد کردن فهرست کشورها و محدوده آی پی های آن هاست. برای سادگی کار من یک خروجی (Dump) از دستور ایجاد جدول ip_location و اطلاعات موجود در آن تهیه کرده ام.
دریافت ip_location.sql با حجم 165KB
در صورتی که آشنایی با وارد کردن (import) چنین فایل هایی ندارید، پیشنهاد می کنم مطلب «راهنمای وارد کردن(import) و صادر کردن(export) در MySQL» را مطالعه کنید.

تابع getIpCountry


مرحله بعد تعریف تابعی برای محاسبه آدرس ۳۲ بیتی هر آی پی و مقایسه آن با محدوده های موجود در جدول ip_location است. برای تعریف این تابع دستورات زیر را در خط فرمان MySQL وارد کنید:
[sql]
DELIMITER $$
CREATE FUNCTION getIpCountry(ip varchar(15)) RETURNS varchar(64)
BEGIN
declare a tinyint unsigned;
declare b tinyint unsigned;
declare c tinyint unsigned;
declare d tinyint unsigned;
declare total bigint;
declare result varchar(64);
select substring_index(ip, '.', 1 ) into a;
select substring_index(substring_index(ip , '.', 2 ),'.',-1) into b;
select substring_index(substring_index(ip , '.', -2 ),'.',1) into c;
select substring_index(ip, '.', -1 ) into d;
set total := (a*256*256*256) + (b*256*256) + (c*256) + d;
select SQL_CACHE country into result from ip_location where total between from_ip and to_ip limit 1;
if (result is null) or (result = '') then
set result := 'unknown';
end if;
return result;
END$$
DELIMITER ;
[/sql]

بدست آوردن کشور


برای مشاهده کشور مرتبط با هر آی پی کافیست تا با استفاده از دستور SELECT تابع getIpCountry را فراخوانی نماییم. مانند:
[sql]
mysql> SELECT getIpCountry('79.175.165.171');
+--------------------------------+
| getIpCountry('79.175.165.171') |
+--------------------------------+
| IRAN (ISLAMIC REPUBLIC OF) |
+--------------------------------+
1 row in set (0.03 sec)

mysql> SELECT getIpCountry('4.2.2.4');
+-------------------------+
| getIpCountry('4.2.2.4') |
+-------------------------+
| UNITED STATES |
+-------------------------+
1 row in set (0.00 sec)
[/sql]

ایده استفاده


فرض کنید که شما سایتی به دو زبان فارسی و انگلیسی دارید. با استفاده از این روش امکان تشخیص کشور بازدیدکننده برای شما بوجود می آید. در نتیجه می توانید کاربر بیننده را به صورت پیش فرض به سایت انگلیسی یا فارسی خود راهنمایی کنید. این روش قابل تعمیم به چندین زبان می باشد.

پی نوشت


• این مطلب فقط برای آدرس های آی پی نسخه ۴ قابل استفاده است.

موفق باشید 8)

۳ نظر: