2010-01-12 16 views
15

आईपी के PHP को MySQL डेटाबेस में स्टोर करने का सबसे अच्छा अभ्यास क्या है? आईपी 2 लोंग नामक एक फ़ंक्शन है - लेकिन यह सिर्फ आईपीवी 4 के लिए है। लेकिन आईपीवी 6 के बारे में क्या?डेटाबेस में IPv6 स्टोर करें

मैं एक php समारोह आईपीवी 6 आईपी के, के लिए है कि पता है, लेकिन यह कम से ip2long समारोह मैनुअल पीएचपी < संस्करण 5.3

+3

इस प्रश्न को देखें: http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql –

उत्तर

9

डॉटेड-दशमलव IPv4 पता 32 बिट का अधिकतम आकार के साथ, एक पूर्णांक में बदला जा सकता लगता है। आईपीवी 6 पते 128 बिट्स हैं। चूंकि 128 बिट्स PHP int में फिट नहीं होते हैं, इसलिए PHP में काम करने के लिए यह दर्द होगा।

यदि आप बस कनेक्ट करना चाहते हैं और आईपीवी 6 पते का उपयोग करना चाहते हैं, तो खुद को परेशानी बचाएं और उन्हें टेक्स्ट के रूप में सहेजें। यदि आप नेटमास्क लागू करना चाहते हैं और सबनेट्स की गणना करना चाहते हैं, तो आपको उन्हें परिवर्तित करने की आवश्यकता है।

+0

क्या आकार टेक्स्ट? – User

+4

[45 वर्ण] (http://stackoverflow.com/questions/166132/maximum- लम्बाई-of-the-textual-representation-of-an-ipv6-address)। – Sjoerd

0

के साथ विंडोज पर काम नहीं करता दूसरा टिप्पणी पर आप एक समारोह IPv6 के लिए ip2long6 कहा जाता है (और नीचे और अधिक हैं)।

+0

ध्यान रखें कि आपको उस फ़ंक्शन के लिए gmp-lib की आवश्यकता है –

0

तुम सिर्फ एक CHAR में एक स्ट्रिंग के रूप में संग्रहीत कर सकता है मैं

9

php फ़ंक्शन inet_pton है, यह आईपी एड्रेस स्ट्रिंग को इसके बाइनरी प्रस्तुति (दोनों ipv4 और ipv6 के लिए) में बदल देगा। फिर आप इसे अपने mysql डेटाबेस में binary(16) के रूप में स्टोर कर सकते हैं।

फिर से एक मानव पठनीय पता पाने के लिए, का उपयोग inet_ntop

12

knittl करीब था, के बजाय द्विआधारी (16) user196009 answered के रूप में varbinary (16) एक संबंधित प्रश्न में इस्तेमाल करते हैं। इससे मेरा काम बनता है। कैसे?

संग्रहीत आईपी:

<?php 
    $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google's IP address 
    // using a PDO wrapper. http://www.phpclasses.org/package/5206-PHP-Execute-database-queries-from-parameters-using-PDO.html 
    include_once 'db.php'; 
    $c = new DB(); 
    $visit = $c->getResults($query); // stored as binary 
?> 

आईपी प्राप्त कर रहा है:

<?php 
    $query = "SELECT `vis_ip` FROM `stats` WHERE `id_stat`=1"; 
    // PDO wrapper 
    include_once 'db.php'; 
    $c = new DB(); 
    $stats = $c->getRow($query); 
    echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104 
?> 

यह IPv6 पतों के साथ काम करना चाहिए (मैं एक IPv4 कनेक्शन है)। मैं एक विशेषज्ञ नहीं हूं इसलिए मुझे अभी तक पता नहीं है कि क्या विविध लंबाई सही है, लेकिन मैंने कैसे कहा, यह मेरे लिए काम करता है।

आदेश में जांच करने के लिए करता है, तो 'आईपीवी 6 का समर्थन' अपने PHP संस्करण/मेजबान में सक्षम है:

<?php 
    phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php 
?> 
+2

PHP का उपयोग करने के बजाय, अब आप स्ट्रिंग को इसके न्यूमेरिक में कनवर्ट करने के लिए MySQL के [INET6_ATON] (http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton) का उपयोग कर सकते हैं। MySQL> = 5.6 के लिए प्रतिनिधित्व। – Mike

2

ध्यान दें कि MySQL (5.6) अब आईपीवी 6 के पते का समर्थन है, INET6_ATON() देखते हैं।

संबंधित मुद्दे