【问题标题】:Saving remote IP with prepared stateents使用准备好的语句保存远程 IP
【发布时间】:2017-05-26 18:47:33
【问题描述】:

我正在尝试将远程用户 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_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_ATON(ipaddr)。如何使用准备好的语句做到这一点?

【问题讨论】:

  • :INET_ATON ?那是一个内置函数dev.mysql.com/doc/refman/5.7/en/… 为什么是冒号?你想要的是INET_ATON(:ip)
  • 你不应该使用int(10) UNSIGNED。这是一个“奇怪”的数字……你有 3 个点(.)。所以改成varchar(12) -> XXX.YYY.ZZZ.WWW -> 12
  • @Fred-ii- 我也试过这样,但后来我得到了error 500
  • 然后检查您的日志;失败并使用 pdo 的错误检查
  • 再次;您不应该为该内置函数使用冒号。如果它不在 db 中,请使用 pdo 的错误处理 php.net/manual/en/pdo.error-handling.php 和 php 的错误报告 php.net/manual/en/function.error-reporting.php 来查看是否有任何结果。 var_dump 一切以查看是否通过并检查您的数据库的列类型。

标签: php mysql


【解决方案1】:

正如@Fred-ii- 所说,您应该检查错误。我也可以推荐this solution 并内置php 函数ip2long。在你的情况下将是

$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_NTOA(同样来自 @Fred-ii- 评论)。

【讨论】:

  • 数组中不需要冒号,仅在非常罕见的情况下。但是,OP没有说我在cmets中问他们。
  • 其实你是对的。它们在 execute()bindParam() 调用中是可选的。仅在 SQL statement 中需要它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多