2011-09-29 100 views
1

我正在尝试记录脚本请求,并且我想将客户端的IP地址存储在int(4)列中,使用INET_NTOA()以可读函数返回它。将CGI REMOTE_ADDR转换为网络字节顺序以用于MySql INET_NTOA

然而,在我的Perl CGI脚本,$ENV{REMOTE_ADDR}包含在其中,当与INET_ATON()功能输入到数据库中,被错误地转换,所以当我拉回来了主机字节序的IP,我有一个完全不同的地址。

#!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

感谢您的帮助。

+0

TRWTF的是,在2011年写仅支持IPv4的代码重新考虑你的数据存储的首选IP地址。 – daxim

回答

0

奇。 ENV变量应该是正常的点划线符号,而不是原始整数。反正它不应该是$ENV{'REMOTE_ADDR'}

请注意,您的INT列应该是无符号。 inet_ntoa()不喜欢负数,如果将其存储在signed int字段中,IP地址空间的一半将显示为负数。

+0

这是正常的点划线符号,但mysql中的INET_ATON()函数将其转换为整数,这就是它的存储方式。至于你的其他问题,它没有单引号。不知道是否它的不好的做法,虽然这样做。 –

+0

@WillReese:Barewords可以用作散列键。 –

相关问题