Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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的类似请求_Php_Mysql - Fatal编程技术网

在一点时间差内检测从同一客户端发送到php的类似请求

在一点时间差内检测从同一客户端发送到php的类似请求,php,mysql,Php,Mysql,我有一个php脚本,它从flash中的一个按钮接收$['post']数据,有时用户双击该按钮,数据发送两次,这会导致服务器端的mysql更新冲突。 我怎么能在短时间内忽略来自同一客户机的php进一步请求呢?为什么不在数据库中设置一个上次更新的时间戳,然后对照当前时间进行检查呢。如果是在最后几秒钟,则不要运行MySQL查询。您可以添加基本的保护机制,因为您可以向表单中添加一个隐藏的随机值,并维护一个显示值表,在执行主查询之前从中删除使用过的值。这也可以防止XSS。你听说过吗 如果您不提供更多详细信

我有一个php脚本,它从flash中的一个按钮接收$['post']数据,有时用户双击该按钮,数据发送两次,这会导致服务器端的mysql更新冲突。
我怎么能在短时间内忽略来自同一客户机的php进一步请求呢?

为什么不在数据库中设置一个上次更新的时间戳,然后对照当前时间进行检查呢。如果是在最后几秒钟,则不要运行MySQL查询。

您可以添加基本的保护机制,因为您可以向表单中添加一个隐藏的随机值,并维护一个显示值表,在执行主查询之前从中删除使用过的值。这也可以防止XSS。你听说过吗

如果您不提供更多详细信息,就不可能提供详细示例,但基本示例是:

mysql_query( "LOCK TABLES updates READ WRITE", $connection);
$q = mysql_query("SELECT COUNT(*) FROM updates WHERE user = $currentUser AND time...");
if( mysql_result($q, 0, 0) != 0){
    // Someone's already doing update; exit
    mysql_query( "UNLOCK TABLES;");
    return false;
}

// Require lock for ourselves
mysql_query( "INSERT INTO updates ...");
mysql_query( "UNLOCK TABLES;");

// Do the stuff on database
这确保了当同一用户尝试两次时,他或她将不被允许(一次只进行一次更新)

您还有不同的选择:

  • 使用
  • 生成用于更新的一次性令牌(注意原子性,您必须执行
    DELETE FROM…
    ,然后检查受影响的行,因为
    SELECT;DELETE
    my被中断,或者您必须再次使用表锁定)
  • 我最喜欢的一个按钮是:
    按钮。enable=false
    ,根据请求完成
    按钮。enabled=true

注意:该代码易受SQL注入攻击,并且您的
mysql\uu
功能已过时。

我想在第一次提交后禁用flash中的按钮会更容易。您是对的,但我无法访问flash文件什么样的更新冲突?您已经考虑过了吗?可以在$\u会话变量中设置它,以查看它们最后一次成功插入数据库的时间。如果他们再次提交,但没有足够的时间,这将阻止插入。。。只是一个想法有没有任何锁定模式可以防止同一用户更新表?@manfilsoof没有,这就是为什么表被锁定的时间尽可能短的原因。在再次解锁表之前,这只有2-4个数据库查询可能非常快(提供正确的数据库设计和索引使用)。试着对它进行基准测试或测量估计的时间:)我相信这是相当普遍的做法。