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