मुझे विश्वास है कि मुझे समाधान मिल गया है। इसमें पहले डेटा को संशोधित करना और फिर इनपुट की कुछ मालिश करना शामिल है। यहाँ क्या काम किया।
सबसे पहले, डेटा को परिवर्तित करने की आवश्यकता है ताकि सभी पते पूर्ण हो जाएं, बिना छोटा किए, अर्धविराम विभाजक हटा दिए जाएं। मेरे प्रश्न में दिखाया गया नमूना डेटा इसमें परिवर्तित हो गया है:
t_start | t_end | t_country_code
----------------------------------+----------------------------------+----------------
00000000000000000000000000000000 | 00ffffffffffffffffffffffffffffff | ZZ
01000000000000000000000000000000 | 01ffffffffffffffffffffffffffffff | ZZ
...
20000000000000000000000000000000 | 2000ffffffffffffffffffffffffffff | ZZ
...
20011200000000000000000000000000 | 20011200ffffffffffffffffffffffff | MX
...
यह वही है जो डेटाबेस में संग्रहीत है।
अगला कदम कोड में प्राप्त आईपी पते को उसी प्रारूप में परिवर्तित करना था। यह PHP में निम्न कोड के साथ किया जाता है (मान लें कि $ip_adress
आने वाला IPv6 पता है):
$addr_bin = inet_pton($ip_address);
$bytes = unpack('n*', $addr_bin);
$ip_address = implode('', array_map(function ($b) {return sprintf("%04x", $b); }, $bytes));
अब परिवर्तनीय $ip_adress
उदाहरण के लिए, पूरा IPv6 पता होगा
:: => 00000000000000000000000000000000
2001:1200::ab => 200112000000000000000000000000ab
और इसी तरह।
अब आप इस पूरे पते की तुलना डेटाबेस की श्रेणियों से कर सकते हैं। मैंने IPv6 पतों से निपटने के लिए डेटाबेस में दूसरा फ़ंक्शन जोड़ा, जो इस तरह दिखता है:
CREATE OR REPLACE FUNCTION get_country_for_ipv6(character varying)
RETURNS character varying AS
$BODY$
declare
ip ALIAS for $1;
ccode varchar;
begin
select into ccode t_country_code from ipv6_to_country where addr between n_from and n_to limit 1;
if ccode is null then
ccode := '';
end if;
return ccode;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
अंत में, मेरे PHP कोड में मैंने वह कोड जोड़ा जो इनपुट ip_address के आधार पर एक या दूसरे पोस्टग्रेज फ़ंक्शन को कॉल करता है।