尝试在数据库中存储 IP 地址.SQL 错误


Trying to store IP Address in Database. SQL Errors

这是我尝试用来存储客户端IP地址的代码。我正在尝试将 IP 地址存储到一个未签名的 int,方法是尝试执行以下问题中看到的内容:将哪种 MySQL 数据类型用于 IP 地址?

这是我的代码:

$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 地址不是。

错误:

错误:您的 SQL 语法有错误;请查看手册 对应于您的MySQL服务器版本,以便使用正确的语法 在第 1 行的"192.168.2.1")"、"email@email.com"、"嗯")附近

near后面的IP地址实际上显示了正确的IP,当然出于安全原因,我只是将其切换到本地IP。 email@email.com 和嗯来自填写以激活此内容的表单,因此不要介意。

有谁知道我做错了什么?我对SQL有点陌生。

你正在这样做:

$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')";
$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')";
我想

你想要:

$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();

您运行的是什么版本的 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 地址的原因

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

你似乎有一个额外的)在你的sql语句中,很难说为什么它在那里。似乎您转换为无符号的 int 出错了。您还可以在插入数字时将单引号放在 $ip_insert 两边,该错误显示您正在插入字符串。

'

192.168.2.1')'看起来不正确,因为您正在尝试插入数字而不是字符串。您应该记录整个语句以查看正在执行的确切内容。谷歌记录SQL语句mysql并设置日志记录。运行查询检查日志,然后尝试对其进行调试。

这似乎是一个简单的语法错误。但是我可能大错特错,因为我已经超过 7 年没有接触 PHP