我正在使用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中有错误吗? (也许是个大错!!!!)
答案 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地址
,则此查询将失败例如:
SELECT
ip FROM
popupip`其中ip =' 127.0.0.1' AND userid = 1 AND date =' 26-05-2014';
返回0行并插入ip。
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,则插入新行,否则请避免插入。
希望这会有所帮助。