Php 使用准备好的状态保存远程IP

Php 使用准备好的状态保存远程IP,php,mysql,Php,Mysql,我正在尝试在数据库中保存远程用户IP。为此,我将列创建为int(10)UNSIGNED 当我尝试这样做时,一切正常,但IP被保存为127.0.0.1 $ipaddr = $_SERVER['REMOTE_ADDR']; $stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :ipaddr)');

我正在尝试在数据库中保存远程用户IP。为此,我将列创建为
int(10)UNSIGNED

当我尝试这样做时,一切正常,但IP被保存为
127.0.0.1

$ipaddr = $_SERVER['REMOTE_ADDR'];
$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :ipaddr)');

$stmt->execute(array(
    ':body' => $_POST['k3jZGEeX1k1oo'],
    ':author' => $_POST['k3k0xKicU0eHQ'],
    ':email' => $email,
    'url' => $url,
    'ip' => $ipaddr
));
当我尝试使用
INET\u ATON
时,数据库中没有任何内容

$ipaddr = $_SERVER['REMOTE_ADDR'];
$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :INET_ATON(ipaddr))');

$stmt->execute(array(
        ':body' => $_POST['k3jZGEeX1k1oo'],
        ':author' => $_POST['k3k0xKicU0eHQ'],
        ':email' => $email,
        'url' => $url,
        'ip' => $ipaddr
));

请注意
:INET\u ATON(ipaddr)
。如何使用准备好的语句执行此操作?

正如@Fred ii所述,您应该检查错误。我还可以推荐和内置php函数。在你的情况下

$ipaddr = $_SERVER['REMOTE_ADDR'];
$ip = sprintf("%u", ip2long($ipaddr));

$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :ip)');

$stmt->execute(array(
    ':body' => $_POST['k3jZGEeX1k1oo'],
    ':author' => $_POST['k3k0xKicU0eHQ'],
    ':email' => $email,
    ':url' => $url,
    ':ip' => $ip
));

要选择并查看实际IP,您可以在查询中使用
INET\u NTOA
(同样来自@Fred ii-注释)。

:INET\u ATON
?那是一个内置函数为什么冒号?您需要的是
INET\u ATON(:ip)
您不应该使用
int(10)UNSIGNED
。这是一个“奇怪”的数字。。。您有3个点(
)。因此,将其更改为
varchar(12)
->
XXX.YYY.ZZZ.WWW
->->12@Fred-ii-我也尝试过这样做,但是我遇到了
错误500
请检查您的日志;出现故障并使用pdo的错误检查增益;您不应该对内置函数使用冒号。如果它没有进入数据库,请使用pdo的错误处理和php的错误报告来查看是否有任何结果。var_转储所有内容以查看传递的内容,并检查数据库的列类型。数组中不需要冒号,只有在非常罕见的情况下才需要冒号。然而,OP没有提到我在评论中询问他们。事实上你是对的。它们在
execute()
bindParam()
调用中是可选的。它们仅在SQL语句中是必需的