我有一个用于记录用户IP的评级脚本,因此他们不能对文件进行多次评级。但是,每次我对文件进行评估以对其进行测试时,我的$ ip都会使用ip2long()函数进行更改。这是怎么回事?这是我的代码:
<?php
require('connect.php');
$sheetID = $_GET["id"];
$rating = $_GET["rating"];
$ip= $_SERVER['REMOTE_ADDR'];
$ip = ip2long($ip);
$checkIPQuery = mysql_query("SELECT * FROM ratings WHERE sheetID = '$sheetID' and INET_NTOA(ip) = '$ip'");
$doesIPExist = mysql_num_rows($checkIPQuery);
if ($doesIPExist == 0) {
mysql_query("INSERT INTO ratings (sheetID, rating, ip) VALUES ($sheetID, $rating, $ip)");
echo " $ip
<script>setTimeout(function(){location.href = '../sheets.php?id=$sheetID'},1);</script>";
}
else
echo 'You have already rated this image!';
?>
然后检查用户是否对脚本进行了评分:
$id = $_GET['id'];
$ip=$_SERVER['REMOTE_ADDR'];
$ip = ip2long($ip);
$checkIPQuery = mysql_query("SELECT * FROM ratings WHERE sheetID = '$id' and INET_NTOA(ip) = '$ip'");
$doesIPExist = mysql_num_rows($checkIPQuery);
这是我所做的:
当$ ip不会放入varchar(15)时,将字段更改为未分配的INT
我添加了ip2long()函数,因为我将ip字段更改为INT
然后,我添加了INET_NTOA(ip)以读取ip2long()INT
任何帮助,将不胜感激。谢谢!
编辑:例如,如果我将$ ip设置为3,这些脚本可以正常工作。
最佳答案
阅读评论和一点研究后,我找到了答案,这很简单。
在32位系统上,ip2long()
返回负整数和正整数,但是INET_NTOA()
仅适用于正整数。因此,您有两种方法可以解决此问题:
更改您的PHP代码:$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
更改您的SQL查询:... AND ip = " . ip2long($_SERVER['REMOTE_ADDR']) . " ...
您可以通过以下方式验证此事实:
$ip = $_SERVER['REMOTE_ADDR'];
$int = ip2long($ip);
var_dump($ip, $int, sprintf('%u', $int));
这将产生以下输出:
string '192.168.1.120' (length=13)
int -1062731400
string '3232235896' (length=10)
然后转到MySQL:
mysql> SELECT '192.168.1.120', INET_NTOA(-1062731400), INET_NTOA(3232235896)
+---------------+------------------------+-----------------------+
| 192.168.1.120 | INET_NTOA(-1062731400) | INET_NTOA(3232235896) |
+---------------+------------------------+-----------------------+
| 192.168.1.120 | NULL | 192.168.1.120 |
+---------------+------------------------+-----------------------+
1 row in set (0.00 sec)