Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पूर्णांक के रूप में संग्रहीत आंशिक IP पतों पर खोजें

वास्तव में, अहस्ताक्षरित पूर्णांक स्तंभ पहले से ही आंशिक आईपी पते पर मिलान खोजने का सबसे कारगर तरीका है! कृपया अपनी ऊर्जा और न ही CPU समय को बिंदीदार संकेतन में बदलने या किसी प्रकार के स्ट्रिंग कॉलम पर LIKE खोज के लिए बर्बाद न करें।

आंशिक आईपी पते को लिखने के कई तरीके मौजूद हैं, लेकिन अंत में, वे सभी नेट मास्क के साथ बेस आईपी पर आ जाते हैं। साथ ही, यह मानते हुए कि आंशिक रूप से, आपका मतलब एक समान उपसर्ग वाले सभी IP से है, तो यह भी IP की एक श्रेणी निर्दिष्ट करने के बराबर है।

किसी भी तरह से, आंशिक आईपी पता विनिर्देश को दो 32 बिट्स, अहस्ताक्षरित पूर्णांक के रूप में वर्णित किया जा रहा है, जो आपके डेटाबेस कॉलम के समान प्रारूप में एन्कोड किया गया है। या तो आपके पास एक प्रारंभिक आईपी और अंत आईपी है, या आपके पास एक आधार आईपी और एक मुखौटा है। मैच को कुशलता से प्राप्त करने के लिए इन पूर्णांकों का उपयोग सीधे आपकी SQL क्वेरी के अंदर किया जा सकता है। इससे भी बेहतर, यदि आप आईपी रेंज दृष्टिकोण का उपयोग करते हैं, तो इंजन आपके आईपी कॉलम पर ऑर्डर किए गए इंडेक्स का लाभ उठाने में सक्षम होगा। आप इससे बेहतर की उम्मीद नहीं कर सकते।

तो आईपी रेंज कैसे बनाएं? हम यह निर्भर करते हैं कि आपके आंशिक पते पहले स्थान पर कैसे निर्दिष्ट किए गए थे, लेकिन यह मानते हुए कि आप नेट मास्क जानते हैं, तो प्रारंभ पता (बेस आईपी और नेट मास्क) के बराबर है, और अंतिम पता है ((बेस आईपी) और नेट मास्क) | (~नेटमास्क)), जहां &, | और ~ का अर्थ है बिटवाइज़-और, बिटवाइज़-या और बिटवाइज़-नहीं।

अपडेट करें

मेरे द्वारा वर्णित रणनीति को लागू करने के लिए यहां एक नमूना कोड दिया गया है।

अब, मुझे पिछली बार PHP कोड लिखे हुए बहुत लंबा समय हो गया है, और निम्नलिखित को कभी भी निष्पादित नहीं किया गया है, इसलिए कृपया मेरे द्वारा पेश की गई किसी भी त्रुटि के लिए क्षमा करें। मैंने जानबूझकर प्रत्येक संकेतन परिदृश्य को "विस्तारित" करने के लिए चुना ताकि उन्हें समझने में आसान बनाया जा सके, बजाय उन सभी को एक ही, बहुत जटिल रेगेक्स में निचोड़ने के।

if (preg_match(' /^ (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) [/] (\d{1,2}) $/x', $input, $r)) {
    // Four-dotted IP with number of significant bits: 123.45.67.89/24

    $a = intval($r[1]);
    $b = intval($r[2]);
    $c = intval($r[3]);
    $d = intval($r[4]);
    $mask = intval($r[5]);

} elseif (preg_match(' /^ (\d{1,3}) (?: [.] [*0] [.] [*0] [.] [*0] )? $/x', $input, $r)) {
    // Four-dotted IP with three-last numbers missing, or equals to 0 or '*':
    // 123.45, 123.45.0.0, 123.45.*.*  (assume netmask of 8 bits)

    $a = intval($r[1]);
    $b = 0;
    $c = 0;
    $d = 0;
    $mask = 8;

} elseif (preg_match(' /^ (\d{1,3}) [.] (\d{1,3}) (?: [.] [*0] [.] [*0] )? $/x', $input, $r)) {
    // Four-dotted IP with two-last numbers missing, or equals to 0 or '*':
    // 123.45, 123.45.0.0, 123.45.*.*  (assume netmask of 16 bits)

    $a = intval($r[1]);
    $b = intval($r[2]);
    $c = 0;
    $d = 0;
    $mask = 16;

} elseif (preg_match(' /^ (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) (?: [.] [*0] )? $/x', $input, $r)) {
    // Four-dotted IP with last number missing, or equals to 0 or *:
    // 123.45.67, 123.45.67.0, 123.45.67.*  (assume netmask of 24 bits)

    $a = intval($r[1]);
    $b = intval($r[2]);
    $c = intval($r[3]);
    $d = 0;
    $mask = 24;

} elseif (preg_match(' /^ (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) $/x', $input, $r)) {
    // Four-dotted IP: 123.45.67.89 (assume netmask of 32 bits)

    $a = intval($r[1]);
    $b = intval($r[2]);
    $c = intval($r[3]);
    $d = intval($r[4]);
    $mask = 32;

} else {
    throw new Exception('...');
}

if ($a < 0 || $a > 255) {  throw new Exception('...') };
if ($b < 0 || $b > 255) {  throw new Exception('...') };
if ($c < 0 || $c > 255) {  throw new Exception('...') };
if ($d < 0 || $d > 255) {  throw new Exception('...') };
if ($mask < 1 || $mask > 32) {  throw new Exception('...') };

$baseip = ($a << 24) + ($b << 16) + ($c << 8) + ($d);
$netmask = (1 << (32 - $mask)) - 1;

$startip = $baseip & netmask;
$endip = ($baseip & netmask) | (~netmask);

// ...

doSql( "SELECT ... FROM ... WHERE ipaddress >= ? && ipaddress <= ?", $startip, $endip);

// or

doSql( "SELECT ... FROM ... WHERE ((ipaddress & ?) = ?)", $netmask, $startip);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MASSIVE MySQL टेबल पर कंप्यूटेड कॉलम के लिए ORDER BY को ऑप्टिमाइज़ कैसे करें

  2. PHP में MySQL परिणाम - सरणी या ऑब्जेक्ट्स?

  3. Microsoft Access में किसी अन्य तालिका से मान के साथ परिकलित फ़ील्ड

  4. MySQL जॉइन और COUNT सिंगल क्वेरी में

  5. PHP स्क्रिप्ट में मेमोरी लीक