Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅当用户的ip唯一时执行查询_Php_Sql_Mysql - Fatal编程技术网

Php 仅当用户的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

我希望根据每个用户的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','$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中的注释。