【发布时间】:2019-08-16 06:03:08
【问题描述】:
我在数据库中有一个唯一的列,名为 ip
IP 地址在使用 PHP 函数转换后以BINARY(16)(无排序规则)形式存储在此列中
$store_ip = inet_pton($ip);
当我尝试插入相同的 IP 两次时,它工作正常,但由于它是唯一的而失败,
但是当我尝试选择 IP 时它不起作用并且总是返回 FALSE(未找到)
<?php
try {
$ip = inet_pton($_SERVER['REMOTE_ADDR']);
$stmt = $db->prepare("SELECT * FROM `votes` WHERE ip=?");
$stmt->execute([$ip]);
$get = $stmt->fetch();
if( ! $get){
echo 'Not found';
}else{
echo 'Found';
}
// close connection
$get = null;
$stmt = null;
} catch (PDOException $e) {
error_log($e->getMessage());
}
我插入IP的部分:
<?php
if( ! filter_var($ip, FILTER_VALIDATE_IP)){
return FALSE;
}
$ip = inet_pton($_SERVER['REMOTE_ADDR']);
try {
$stmt = $db->prepare("INSERT INTO votes(ip, answer) VALUES(?,?)");
$stmt->execute([$ip, $answer]);
$stmt = null;
} catch (PDOException $e) {
return FALSE;
}
【问题讨论】:
-
@MagnusEriksson 不是。问这个问题的人的问题要严重得多。
-
@J.Doe 我也有这个确切的问题...将增加赏金以了解更多信息
-
为什么不使用 ip2long 和 long2ip。如果您还想要一些范围搜索,它将来帮助您。然后您也可以将一些 ip 链接到位置数据库。它将帮助您对位置等进行分组。因为有时同一位置可能有多个 IP
-
MySQL 支持
INET6_ATON和INET6_NTOA。为什么不使用 MySQL 而不是 PHP 来管理值? sqlfiddle.com/#!9/268d96/1 你可以避免HEX/UNHEX使用VARBINARY(16)以及sqlfiddle.com/#!9/983762/3 -
@fyrye 谢谢,我不知道这是可能的...使用
VARCHAR(250)不好,因为我已经可以将VARCHAR(45)用于原始IP,并尝试使用BINARY(16)以获得更好的效果表现。但是第二个链接看起来很棒,必须尝试一下