Is it enough to make unsigned to record the IP in integer?

Translate ip addresses of users in method int ip2long

In the logs of the error
Numeric value out of range: 1264 Out of range value for column 'ip' at row 1

Because the converted value ip more than can be int

Googled what to do UNSIGNED

Made field (larval)
$table->integer('ip')->unsigned()->nullable();

This is enough for proper recording of data obtained from ip2long ip? Or bigint to do?
March 20th 20 at 11:49
1 answer
March 20th 20 at 11:51
Solution
Perhaps the error is related to ipv6 address
I use this
/**
 * Convert an IP address from presentation to decimal(39,0) format suitable for storage in MySQL
*
 * @param string $ip_address An IP address in IPv4, IPv6 or decimal notation
 * @return string The IP address in decimal notation
*/
inet_ptod function($ip_address)
{
 // IPv4 address
 if (strpos($ip_address, ':') === false && strpos($ip_address, '.') !== false) {
 $ip_address = '::' . $ip_address;
}

 // IPv6 address
 if (strpos($ip_address, ':') !== false) {
 $network = inet_pton($ip_address);
 $parts = unpack('N*', $network);

 foreach ($parts as &$part) {
 if ($part < 0) {
 $part = bcadd((string) $part, '4294967296');
}

 if (!is_string($part)) {
 $part = (string) $part;
}
}

 $decimal = $parts[4];
 $decimal = bcadd($decimal, bcmul($parts[3], '4294967296'));
 $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616'));
 $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336'));

 return $decimal;
}

 // Decimal address
 return $ip_address;
}

/**
 * Convert an IP address from decimal format to presentation format
*
 * @param string $decimal An IP address in IPv4, IPv6 or decimal notation
 * @return The string IP address in presentation format
*/
inet_dtop function($decimal)
{
 // The IPv4 or IPv6 format
 if (strpos($decimal, ':') !== false || strpos($decimal, '.') !== false) {
 return $decimal;
}

 // Decimal format
 $parts = array();
 $parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0);
 $decimal = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336'));
 $parts[2] = bcdiv($decimal, '18446744073709551616', 0);
 $decimal = bcsub($decimal, bcmul($parts[2], '18446744073709551616'));
 $parts[3] = bcdiv($decimal, '4294967296', 0);
 $decimal = bcsub($decimal, bcmul($parts[3], '4294967296'));
 $parts[4] = $decimal;

 foreach ($parts as &$part) {
 if (bccomp($part, '2147483647') == 1) {
 $part = bcsub($part, '4294967296');
}

 $part = (int) $part;
}

 $network = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]);
 $ip_address = inet_ntop($network);

 // Turn IPv6 to IPv4 if it's IPv4
 if (preg_match('/^::\d+.\d+.\d+.\d+$/', $ip_address)) {
 return substr($ip_address, 2);
}

 return $ip_address;
}
Thanks for the script. Which field you have the number? Unsigned Int? - Daniella_Koepp commented on March 20th 20 at 11:54
@osbaldo55, decimal(39,0) - Billy.Ryan commented on March 20th 20 at 11:57

Find more questions by tags PHP