Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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_Concurrency - Fatal编程技术网

Php 当用户访问主题时放置一个标志:故障

Php 当用户访问主题时放置一个标志:故障,php,mysql,concurrency,Php,Mysql,Concurrency,假设我有一个论坛,里面有用户/管理员可以访问/管理的主题 当用户访问它时,首先我会检查主题是否存在;之后,我为系统设置了一个标志,表示用户是否访问了该主题 这将是基本代码: 1 if((isset($_GET['trackid'])) && (ctype_digit($_GET['trackid']))) { 2 $query=mysql_query("SELECT date, user, zone, artist, event, data,

假设我有一个论坛,里面有用户/管理员可以访问/管理的主题

当用户访问它时,首先我会检查主题是否存在;之后,我为系统设置了一个标志,表示用户是否访问了该主题

这将是基本代码:

1        if((isset($_GET['trackid'])) && (ctype_digit($_GET['trackid']))) {
2            $query=mysql_query("SELECT date, user, zone, artist, event, data, res, complete, notes FROM topic WHERE trackid='".$_GET['trackid']."'",$mydb);    
3            if(mysql_num_rows($query)!=0) {
4                echo "Ok, The topic exist! Now I can say to the system that I have visited the topic"
5                
6                if (isset($_SESSION['nickname'])) $insert=mysql_query("INSERT IGNORE INTO recent_adds (user, trackid) VALUES ('".$_SESSION['nickname']."','".$_GET['trackid']."')",$mydb);                 
7            }
8        }
现在,假设
用户A
到达第4行,同时管理员(
用户B
)删除此主题(为管理员启用一个特殊函数,但这并不意味着这么多):它将向数据库插入不一致的数据。(事实上,该主题将不再存在)


执行此类操作的主要论坛/系统如何解决此并发问题?

您可以使用外键禁止插入任何已删除的内容。然后,您还可以获得执行级联删除的好处


另一种解决方案是运行批处理作业,以清除不一致的数据。按照此解决方案的思路,不要真正删除主题。只需使用状态标志将其标记为已删除,然后再将其删除。

这很简单,只要跟踪主题视图(如果已设置)即可。这意味着有人正在查看它,因此删除操作应等到主题视图在会话、cookie或数据库中处于活动状态,无论您的场景是什么。嗯……使用外键……看起来是一个不错的解决方案。。。!它是如何工作的?Justs放置外键?是的,MyISAM不支持外键(但是手册中已经有很多年了:“在以后的阶段,外键约束也将对MyISAM表实施”)。我的所有表都在MyISAM上,我的提供者只使用它!啊。。。我想我必须换一种方式思考……那么我的第二个解决方案呢?将主题标记为已删除,但稍后在批处理作业中删除它们。是的…但我希望使用“外国”解决…更专业:)现在我看看是否可以使用主机提供商做些事情;)我会让你知道的!