2012-05-08 53 views
1

这是我想用来存储客户端的IP地址的代码。我试图在IP地址存储到一个unsigned int,试图通过做在这个问题上看到的东西:Which MySQL datatype to use for an IP address?试图在数据库中存储IP地址。 SQL错误

这里是我的代码:

$client_ip = $_SERVER['REMOTE_ADDR']; 

$ip_insert = "SELECT INET_ATON('$client_ip')"; 

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')"; 

有在声明中其他的东西被存储但只是忽略这些,他们的工作,这是不是的IP地址。

错误:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '192.168.2.1')','[email protected]','Hmmmm')' at line 1

IP地址后不久事实上确实显示正确的IP,我只是把它切换到本地IP的,当然安全原因。 [email protected]和嗯是从一个表格填写来激活这个,所以不介意。

有谁知道我在做什么错?我对SQL很陌生。

+0

您是否尝试过打印出您的代码正在生成的SQL,并将其直接粘贴到数据库中以查看会发生什么? – andrewsi

+0

您有一个SQL注入漏洞。 – SLaks

+0

@SLaks在哪里?我是一名初学者,因此在尝试确保安全时我真的不知道要寻找什么。 – ComputerLocus

回答

5

你这样做:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',SELECT INET_ATON('$client_ip'),'$email','$message')"; 

因为你设置:

$ip_insert = "SELECT INET_ATON('$client_ip')"; 

而且它必须是:

$ip_insert = "INET_ATON('$client_ip')"; 

这是为了做到这一点:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')"; 
+1

工作过,谢谢! – ComputerLocus

0

你运行的是哪个版本的mysql?尝试在你的sql命令行上运行inet_aton('192.168.1.1')命令,看它是否有效。它应该输出是这样的:

mysql> select inet_aton('192.168.1.1'); 
+--------------------------+ 
| inet_aton('192.168.1.1') | 
+--------------------------+ 
|    3232235777 | 
+--------------------------+ 
1 row in set (0.00 sec) 

好像你INET_ATON()函数不工作,这就是为什么你在你的SQL错误看到的IP地址

2
$ip_insert = "SELECT INET_ATON('$client_ip')"; 

只是一个字符串,则必须将此字符串查询到数据库,然后获取结果或

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')"; 
0

使用INET_ATON而不是"SELECT INET_ATON"(因为这将从DB返回记录)。

1

我想你想:

$ip_insert = ip2long($client_ip); 
$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')"; 

但是,你会用更好:

$sth = $dbh->prepare("INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES (?,?,?,?)"); 
$sth->bindParam(1, $name, PDO::PARAM_STR); 
$sth->bindParam(2, $ip_insert, PDO::PARAM_INT); 
$sth->bindParam(3, $email, PDO::PARAM_STR); 
$sth->bindParam(4, $message, PDO::PARAM_STR); 
$sth->execute(); 
+0

你能解释一下为什么按照你所显示的方式做更好? – ComputerLocus

+0

您可以获得更多的参数类型检查,如果您想放入多个记录,则可以更有效地准备一次并绑定/执行多次。 – Julian

0

你似乎有一个多余的),在SQL语句中,很难说为什么它是在那里。看起来像你转换为unsigned int出错了。您可以在插入数字时在$ ip_insert周围放置单引号,并且该错误表明您正在插入一个字符串。

'192.168.2.1')'看起来不正确,因为你试图插入一个数字而不是字符串。你应该记录整个语句,看看究竟是什么被执行。 Google记录SQL语句mysql并设置日志记录。运行查询检查日志,然后尝试并调试它。

它看起来是一个简单的语法错误。但是我可能会错,因为我已经超过7年没有碰过PHP了。