如何防止在表中创建重复的IP?

时间:2014-05-26 08:57:37

标签: php mysql myisam

我正在使用MySQL myisam和一些php代码来防止在popupip表中创建重复的ip

$userip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$date = date('Y-m-d');
$result = mysql_query("SELECT `ip` FROM  `popupip` where ip = '$userip' AND userid = $secid AND date='$date'");
$num = mysql_num_rows($result);
    if ($num > 0) {
    // **it is duplicate Do not insert it in popupip table**
    }else{
    // **it is not duplicate ip insert it in popupip table**
    }

上面的代码就是一个例子。我知道完整的代码。

但是当我查看我的phpmyadmin popupip表时,会有一些重复的ip用户(同一天用户的IP地址完全相同)

怎么可能?

额外信息:popupip userid中是int(11),date是“日期类型,如2014-05-30”,ip是varchar。 此页面可以通过弹出页面“尽可能快地同时打开”。 在用户同时快速打开页面和重复创建ip之间是否存在关联? MySQL中有错误吗? (也许是个大错!!!!)

4 个答案:

答案 0 :(得分:1)

这里有一个概述的概念。

注意:我并不是说这是最好的方式,但我会尽力帮助。

首先,删除popupip中的所有数据,以便删除所有重复项。

然后开始,获取客户端的IP。 $client_ip = get_ip();

function get_ip() {

    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'Unknown IP';
    return $ipaddress;
}

因此$client_ip具有用户IP的值。 (显然)

因此,要确定用户是否已拥有数据库中的IP。

$query = $this->db->prepare("SELECT ip_address FROM accounts WHERE user_id = :user_id AND client_ip = :client_ip");
$query->execute(array(':user_id' => $user_id, ':client_ip' => $client_ip));


// No IP in the table
if ($query->rowCount() == 0) {
    //Put INSERT SQL here.
}

答案 1 :(得分:0)

你应该尝试使用DISTINCT来避免选择查询中的重复,

SELECT DISTINCT `ip` FROM  `popupip` WHERE ip = '$userip' 
AND userid = $secid 
AND DATE='$tarikh'

答案 2 :(得分:0)

您应该向表中添加UNIQUE索引。 这是语法:

ALTER TABLE yourTableNAme ADD UNIQUE (
`yourColumnName`
)

答案 3 :(得分:0)

在您的代码中,我认为您首先检查表中已存在的ip,以防止使用此查询进行重复

SELECT ip FROM popupip其中ip =' $ userip' AND userid = $ secid AND date =' $ tarikh';

但如果两个userid(用户)来自同一个ip地址

,则此查询将失败

例如:

  1. SELECT ip FROM popupip`其中ip =' 127.0.0.1' AND userid = 1 AND date =' 26-05-2014';

    返回0行并插入ip。

  2. SELECT ip FROM popupip其中ip =' 127.0.0.1' AND userid = 2 AND date =' 26-05-2014';

    也返回0行并插入ip。

    所以首先检查ip,{没有任何AND或OR} 喜欢

    SELECT ip FROM popupip其中ip =' $ userip';

    如果此查询返回0,则插入新行,否则请避免插入。

    希望这会有所帮助。