PDA

View Full Version : طول و نوع ذخیره ایپی تو دیتابیس



saeed-71
شنبه 17 خرداد 1393, 20:04 عصر
سلام.
طول و نوع ذخیره ایپی تو دیتابیس چیه؟

cpuram
شنبه 17 خرداد 1393, 20:50 عصر
http://fa.wikipedia.org/wiki/%D9%BE%D8%B1%D9%88%D8%AA%DA%A9%D9%84_%D8%A7%DB%8C% D9%86%D8%AA%D8%B1%D9%86%D8%AA
نوعش بهتره varchar باشه.

مهرداد سیف زاده
یک شنبه 18 خرداد 1393, 08:22 صبح
نوع varchar و طولش 15
البته اگر ip V6 باشه باید 30 کاراکتر در نظر بگیرید
در کل اگر بخواید هم ip v4 و هم ip v6 رو توش ذخیره کنید طولش 30 کاراکتر براش کافیه

eshpilen
یک شنبه 18 خرداد 1393, 09:23 صبح
تاجاییکه یادمه بنده در پروژهء رجیستر و لاگین خودم درمورد این قضیه تحقیق کردم و کلنجار رفتم. منظورم ساپورت همزمان IP نسخه 4 و 6 است!
متاسفانه با اینکه مدتها از توصیه به ساپورت IP6 میگذره و فضای IP4 تقریبا پر شده، هنوز اکثریت این کار رو نمیکنن و توی خیلی برنامه ها و حتی زبانهای برنامه نویسی ساپورت خوبی براش وجود نداره. یعنی حداقل اون زمان که من داشتم برنامم رو مینوشتم، PHP هم ساپورت لازم رو نداشت و در این زمینه به مشکل خوردم. خلاصه سرچ کردم و یکسری کد برای این کار پیدا کردم، ولی جالب اینکه کدها هم باگ و مشکل داشت که خوشبختانه تونستم حلشون کنم (توی کدها نگاه کنید کامنت گذاشتم درموردش).

ما برای کار با IP یک زوج تابع نیاز داریم. یکی تابعی که IP رو از فرمت متنی به باینری تبدیل کنه، و دیگری تابعی که عکسش رو انجام بده، یعنی از فرمت باینری به متنی تبدیل کنه.
البته بعضی جاها میشه بدون تبدیل فرمت متنی به باینری هم کار کرد، ولی باید توجه داشت که فرمت متنی حجم بیشتری رو اشغال میکنه و این میتونه در سیستمهایی که IP رو لاگ میکنن و تعداد این IP ها میتونه خیلی زیاد بشه، اهمیت داشته باشه.

من یه فایل ضمیمه میکنم که مستقیم از پروژهء خودم برداشتم.
توش دوتا تابع هست. این توابع با هردوی IPv4 و IPv6 قابل استفاده هستن.

inet_pton2 مقدار IP رو از متنی به باینری تبدیل میکنه که بعدش میتونید اون رو در یک فیلد varbinary(16)‎ در دیتابیس ذخیره کنید.
راستی موقع درج این مقدار باینری در دیتابیس باید از Escape کردن به کمک mysql_real_escape_string استفاده کنید یا از روشهای جایگزین مثل کوئری های پارامتری و این حرفا. مثل این نمونه کد از پروژهء خودم:


$ip=$reg8log_db->quote_smart(inet_pton2($_SERVER['REMOTE_ADDR']));
...
$query='insert into `ip_incorrect_logins` (`ip`, `account_auto`, `timestamp`, `admin`, `pending_account`) values '."($ip, $account_auto, $req_time, $admin, $is_pending_account)";

$reg8log_db->query($query);

تابع inet_ntop2 هم برای عکسشه. یعنی از دیتابیس که بیرون میکشید و میخواید به فرمت متنی تبدیل کنید و مثلا نمایش بدید، از این تابع استفاده میکنید.

این تاجاییکه از این مبحث و جزییات پروژهء خودم یادم مونده بود!
البته احتمالا الان شما دیگه به این کد نیازی نداشته باشید، چون شاید توی نسخه های اخیر PHP این ضعف برطرف شده باشه، ولی بهرحال اون نسخه ای هم که من باهاش کار کردم خیلی قدیمی نبود و ممکنه روی بعضی هاستها هنوز نسخه ها و مشکلات مشابهی دیده بشه.