Преобразовать CGI REMOTE_ADDR в сетевой порядок байтов для использования с MySql INET_NTOA - PullRequest
1 голос
/ 29 сентября 2011

Я пытаюсь регистрировать запросы на скрипт и хочу сохранить IP-адрес клиента в столбце int(4), используя INET_NTOA(), чтобы вернуть его в удобочитаемой функции.

Однако вмой CGI-скрипт Perl $ENV{REMOTE_ADDR} содержит IP в байтовом порядке хоста, который при вводе в базу данных с помощью функции INET_ATON() преобразуется неправильно, поэтому при извлечении его у меня появляется совершенно другой адрес.

#!usr/bin/perl -wT

use strict; 
use CGI;
use DBI;

my $dbh = DBI->connect("DBI:mysql:$db:$server", "$user", "$password");
my $addr = $ENV{REMOTE_ADDR};

my $insert = $dbh->prepare(qq[insert into access_log (ipaddress) 
                                     values (INET_ATON('$addr'))]);  

$insert->execute or die "sql insert error";

my $retrieve = $dbh->prepare(qq[select INET_NTOA(ipaddress) as IP_Address 
                                from   access_log]);

$retrieve->execute or die "sql select error";
my $newIP = $retrieve->fetchrow_array;

В идеале этот скрипт должен возвращать значение $addr, но вместо этого я получаю что-то совершенно другое.Как я могу отформатировать $addr перед тем, как поместить его в базу данных?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Я обнаружил, что никаких изменений в $ ENV {REMOTE_ADDR} не требуется.

Используя int (4) без знака для моего столбца ip_address, inet_aton () и inet_ntoa () работают правильно.С целым числом со знаком

"значения, соответствующие IP-адресам, для которых первый октет больше 127, не могут быть сохранены правильно", поэтому данные искажаются на этапе вставки.

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-ntoa

0 голосов
/ 29 сентября 2011

Одд.ENV var должна быть обычной нотацией с точками и квадратами, а не необработанным целым числом.Разве это не должно быть $ENV{'REMOTE_ADDR'} в любом случае?

Обратите внимание, что ваш столбец INT должен быть без знака.inet_ntoa () не любит отрицательные числа, и половина пространства IP-адресов будет отображаться как отрицательная, если вы сохраните его в полях со знаком int.

...