0

我有一个 php 脚本,它从 flash 中的按钮接收 $_['post'] 数据,有时用户确实双击该按钮并且数据发送两次,这会导致服务器端的 mysql 更新冲突。我如何在一点时间差异内忽略来自同一客户端的 php 中的进一步请求?

4

3 回答 3

1

你听说过mysql 中的锁表吗?

如果您不提供更多详细信息,则无法提供详细示例,但基本示例是:

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

这确保了当同一用户尝试执行此操作两次时,他或她将不被允许(当时只有一次更新)。

您还有不同的选择:

  • 采用TRANSACTION
  • 生成一次更新令牌(注意原子性,您必须执行DELETE FROM ...然后检查受影响的行,因为SELECT; DELETE我会被打断或者您必须再次使用表锁定)
  • 我最喜欢的一个:button.enable=false,并应要求完成button.enabled=true

注意:代码易受 SQL 注入攻击,并且您mysql_的函数已过时。

于 2012-10-04T14:22:47.973 回答
0

为什么不在数据库中有一个最后更新的时间戳,然后根据当前时间检查它。如果它在最后几秒钟内,则不要运行 MySQL 查询。

于 2012-10-04T14:08:22.513 回答
0

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

于 2012-10-04T14:11:28.270 回答