如何检查IP是否在数据库中

3

如何检查IP地址是否在数据库中?

我正在创建一个小型投票系统,目前人们可以进行多次投票。

因此,我将他们的IP地址放入数据库中,如果已经存在,则不允许再投票。我使用以下方法获取数据库中的IP地址:

$check = mysql_query("SELECT `ip` FROM `voted`") or die(mysql_error());

我不知道如何检查那个人正在投票使用的IP是否已经输入。


1
IP地址是一个不错的起点,但动态IP寻址呢? - TheZ
除了 IP 检查之外,还要放置一个 cookie。 - Zoltan Toth
2
请不要使用mysql_*函数,它们已经不再维护,社区已经开始弃用过程。相反,您应该学习预处理语句,并使用PDOMySQLi。如果您无法决定,这篇文章将帮助您选择。如果您想学习,这里有一个很好的PDO相关教程 - vascowhite
忘记提到我对PHP和Mysql也相当新手。因此我不知道什么是动态IP地址,也不知道如何在PHP中使用cookie。 - Shawn31313
动态IP寻址意味着IP地址会发生变化,这意味着您不能可靠地将特定用户与单个固定IP地址关联起来。动态IP不是语言特定的,而是网络的一部分。 - Kasapo
这听起来非常像您想要将当前访问页面的用户与已在数据库中的IP地址列表进行比较。如果您需要帮助创建查询而不是确定当前客户端的IP,则应更具体。 - Kasapo
4个回答

2

我假设您已经有一种获取IP地址的方法(因为您正在将它们插入数据库),所以只需使用WHERE子句进行验证:

$check = mysql_query("SELECT `ip` FROM `voted` WHERE `ip` = '$theIP'")...

接下来,请检查是否有任何结果返回。如果有,则拒绝投票。

但是请注意,仅基于IP地址进行验证将会给您带来很多错误的负面影响。


2
请看MySQL中的WHERE子句: http://www.tizag.com/mysqlTutorial/mysqlwhere.php
$ip = mysql_real_escape_string([the IP address]);
$q = mysql_query("SELECT `ip` FROM `voted` WHERE `ip`= '$ip'");
if(mysql_num_rows($q) > 0){
    // They already are in the database
}

记住——对输入进行清洗。个人建议使用参数和绑定,但如果你是使用普通的MySQL,则可以使用转义函数。但要记住,mysql_函数已经被弃用,所以如果可能的话应该避免使用它们。(参见PDO


嗯,这取决于他如何获取IP地址。例如,如果他从POST变量中检索IP,则可能是。他从未指定过。在查询中始终对所有内容进行消毒处理。当您不确定某些内容是否可以注入时,这很有帮助。 - Andrew M
不错的发现,knittl-- 我习惯于使用PDO,绑定时不包含引号 ;) - Andrew M
安德鲁:我修复了你的查询。对于没有用引号括起来的值使用mysql_real_escape_string没有任何好处。(除了在这个例子中出现语法错误) - knittl
knittl:请看我上面的评论——我是通灵的,在你发表评论之前就已经回复了 ;) - Andrew M
人们通常忘记消毒的另一件事是UA或X-Forwarded-For,它也可以是任意字符串。 - Leagsaidh Gordon

0

我应该使用类似这样的东西:

SELECT count(*) INTO counter from `voted` WHERE ip = '0.0.0.0'

在你的 PHP 代码中,你需要检查计数器是否大于0。

1
记得对用户数据进行清洗! - Erty Seidohl

0
如果您打算坚持使用mysql_*,那么像Andrew M建议的那样做就可以了。但是像他和其他人建议的那样,如果您刚开始学习PHP,考虑使用PDO路线(如下)。

MySQL

<?php
if (!$qry = mysql_query("SELECT COUNT(*) AS `daCount` FROM `voted` WHERE `ip` = '".mysql_escape_string($_SERVER['REMOTE_ADDR'])."'")) {
    die('Whamm PoW! Oops, we made a boo boo!');
}

list($check) = mysql_fetch_row($qry);
if ($check > 0) {
    echo 'Thanks but you already voted!';
}
else {
    echo 'Please make your vote: Yes or No?';
}

PDO

<?php
try { // to connect to database
    $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password', array(
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ));
} catch (PDOException $e) {
    die('Bazinga! Oops, we made a boo boo!');
}

try { // to execute query and stuff
    $stmt = $db->prepare('SELECT `ip` FROM `voted` WHERE `ip`=?');
    $stmt->execute(array($_SERVER['REMOTE_ADDR']));
    $row_count = $stmt->rowCount();
    if ($row_count > 0) {
        echo 'Thanks but you already voted!';
    }
    else {
        echo 'Please make your vote: Yes or No?';
    }

} catch(PDOException $e) {
    die('Kaboom! Oops, we made a boo boo!');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接