我目前遇到的问题是,用户使用不同的ip提交多个表单。 (递增1。)我的意思是用户使用123.123.123.123, then 123.123.123.124
,然后123.123.123.125
等提交表单等等。
我已经制作了一个MySQL表,用于在提交期间存储IP和时间戳(UNIX)。我如何才能这样做,以便如果表中有123.123.123.123
等IP,则具有IP 123.123.123.124
的用户无法在X分钟内提交表单。
到目前为止,我已经想出迭代整个MySQL表,然后检查IP是否有点匹配。这个问题是有很多记录(Roughly 25,000
),所以每次有人提交表格时我都要迭代25,000个条目,这很常见。
有没有更好的解决方案来使用它?
答案 0 :(得分:2)
如果您想稍后对它们运行查询,请不要将IP地址存储为字符串。使用 ip2long
将它们转换为正确的数字地址ip2long - 将包含(IPv4)Internet协议虚线地址的字符串转换为正确的地址
例如
echo ip2long("123.123.123.123"); //2071690107
echo "\n";
echo ip2long("123.123.123.124"); //2071690108
注意模式(1+)?现在您可以轻松地比较两者并在该值上创建索引,这样您的数据库就不必扫描所有表。
获得该格式的IP地址后,您可以编写一些简单的数学公式来检查您愿意检查的正确子网范围。
<强> Fiddle 强>
答案 1 :(得分:0)
IPv4地址可以表示为32位整数,MySQL可以使用函数INET_ATON()
进行转换,或者您可以使用PHP函数ip2long()
来转换和比较IP是否在给定范围。