Php 仅当用户的ip唯一时执行查询
我希望根据每个用户的IP地址,仅将数据保存到数据库一次。我有一个带有url、日期、时间和ip列表的数据库。如何检查ip是否已经存在,如果不存在,如何将数据插入数据库,否则什么也不做?以下是我目前的代码:Php 仅当用户的ip唯一时执行查询,php,sql,mysql,Php,Sql,Mysql,我希望根据每个用户的IP地址,仅将数据保存到数据库一次。我有一个带有url、日期、时间和ip列表的数据库。如何检查ip是否已经存在,如果不存在,如何将数据插入数据库,否则什么也不做?以下是我目前的代码: <Check if IP already exists in the database - if no - insert:> $query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$tim
<Check if IP already exists in the database - if no - insert:>
$query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$time', '$someip')";
mysql_query($query) or die('Error, insert query failed');
}
else {
echo 'This ip already exists';
}
查询数据库中具有匹配ip的行。然后可以使用确定返回了多少行
$sql = "SELECT * FROM link WHERE ip = '127.0.0.1' LIMIT 1";
$query = mysql_query($sql);
if(mysql_num_rows($query) == 0)
{
// IP does not exist, proceed with insert.
}
127.0.0.1显然应该是一个变量。您可以通过$\u SERVER['REMOTE\u ADDR']获取用户ip。查询数据库中具有匹配ip的行。然后可以使用确定返回了多少行
$sql = "SELECT * FROM link WHERE ip = '127.0.0.1' LIMIT 1";
$query = mysql_query($sql);
if(mysql_num_rows($query) == 0)
{
// IP does not exist, proceed with insert.
}
127.0.0.1显然应该是一个变量。您可以使用$\u SERVER['REMOTE\u ADDR']获取用户ip。在ip列上放置唯一索引。如果插入重复项,将返回错误。这样,您就不需要在数据库上执行额外的查询。只需确保返回的错误得到了正确的处理,或者忽略错误即可
CREATE UNIQUE INDEX name_of_index ON tablename (columns_to_index);
在ip列上放置唯一索引。如果插入重复项,将返回错误。这样,您就不需要在数据库上执行额外的查询。只需确保返回的错误得到了正确的处理,或者忽略错误即可
CREATE UNIQUE INDEX name_of_index ON tablename (columns_to_index);
在列上创建唯一索引:
CREATE UNIQUE INDEX ix_link_ip ON link (ip)
并检查插入时的错误:
$query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$time', '$someip')";
$res = mysql_query($query);
if (!$res) {
if (mysql_errno() == 1062) /* unique key violation */
die('This IP already exists');
else
die(mysql_error());
}
}
在列上创建唯一索引:
CREATE UNIQUE INDEX ix_link_ip ON link (ip)
并检查插入时的错误:
$query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$time', '$someip')";
$res = mysql_query($query);
if (!$res) {
if (mysql_errno() == 1062) /* unique key violation */
die('This IP already exists');
else
die(mysql_error());
}
}
这是一种干净的方法,但是@Mark的解决方案速度是原来的两倍,因为只对DB进行了一次调用…@Dave告诉你,数据库计时与调用次数不成比例。@Shrapnel上校,我同意这样一个事实,即使用联接的查询比使用索引键的查询花费的时间要长得多。但是,对于像本例中这样的简单调用,瓶颈是数据从数据库到应用程序的传输时间,反之亦然。顺便说一句,这里的解决方案甚至可以优化为:如果查询结果仅用于检查记录的存在性,则从链接中选择count*,其中ip='127.0.0.1'LIMIT 1。@Dave:为什么将LIMIT 1与count*?@Dave:此查询中没有此类优化。限制1在计数*之后应用,这意味着它将对所有行进行计数,然后对包含1条记录的resultset应用限制。这是一种干净的方法,但@Mark的解决方案速度是原来的两倍,因为只对DB进行了一次调用…@Dave让您知道,数据库计时与调用次数不成比例。@Schrapanel上校,我同意这样一个事实,即使用联接的查询比使用索引键的查询花费的时间要长得多。但是,对于像本例中这样的简单调用,瓶颈是数据从数据库到应用程序的传输时间,反之亦然。顺便说一句,这里的解决方案甚至可以优化为:如果查询结果仅用于检查记录的存在性,则从链接中选择count*,其中ip='127.0.0.1'LIMIT 1。@Dave:为什么将LIMIT 1与count*?@Dave:此查询中没有此类优化。限制1在计数*之后应用,这意味着它将对所有行进行计数,然后对包含1条记录的结果集应用限制。您可以使用ip2long函数来存储IP。这样,您可以使用较小的int字段而不是varchar字段,除非您有使用IP地址的真正原因,或者您只是在练习,你应该改为使用cookies。许多人可能共享同一ip,因此只有一个人能够执行查询。或者,一个人的ip地址可能会发生变化,允许一个人多次执行查询,同时拒绝获得已用ip机会的其他人执行查询。此外,第一行不是HTML或PHP中的注释。您可以使用ip2long函数来存储IP。这样,您可以使用较小的int字段而不是varchar,除非您有使用IP地址的真正原因,或者您只是在练习,否则您应该改为使用cookie。许多人可能共享同一ip,因此只有一个人能够执行查询。或者,一个人的ip地址可能会发生变化,允许一个人多次执行查询,同时拒绝获得已用ip机会的其他人执行查询。另外,第一行不是HTML或PHP中的注释。