【问题标题】:Inserted IP into MySQL database changes each time每次将 IP 插入 MySQL 数据库更改
【发布时间】:2012-10-21 03:43:26
【问题描述】:

我有一个记录用户 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 位系统吗?
  • INET_NTOA 以二进制 字符串 的形式返回地址的点分四进制表示 - 但是您将其与整数(由 ip2long 返回)进行比较
  • 有什么理由不能将其存储为字符串并比较字符串?
  • @tubaguy50035 当整数足够时,他为什么要这样做?
  • @ruddrobinet 您是否注意到您将$ip 按原样插入数据库,但在选择时使用 INET_NTOA?其中之一显然是一个错误。 )

标签: php mysql ip


【解决方案1】:

在阅读了 cmets 并进行了一些研究后,我找到了答案,而且很简单。

在 32 位系统上,ip2long() 返回负整数和正整数,但 INET_NTOA() 仅适用于正整数。所以你有两个选择来解决这个问题:

  1. 更改您的 PHP 代码:$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
  2. 更改您的 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)

【讨论】:

  • 更改哪个查询?全选查询还是插入查询?
  • 如果您选择选项#2,您必须在您的数据库中插入ip2long() 的结果。然后,当你选择时,你必须这样做:... WHERE ip = " . ip2long($ip) . " AND ... 这样你总是比较ip2long() 的结果,不管它返回的是负数还是正数。
  • 我真是个笨蛋!我将您的代码的两个 sn-ps 添加到我的代码中,而不是一个!
  • 这是我在使用第一个选项时得到的 ip 值:同一台计算机 - 第一次:184.73.195.118 第二次:184.73.194.246 第三次:184.73.184.232... 他们改变了每次...
  • 您的 IP 似乎正在以某种方式发生变化,但这不是正常行为。不是代码的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多