2013-06-25 37 views
0

我似乎无法让我的头解决这个问题。检查的最后5个记录在MySQL而不是最后

我目前有:

$checkRunningSQL = $odb -> prepare("SELECT time,date FROM `api` WHERE `key` = :key AND `time` + `date` > UNIX_TIMESTAMP()"); 
$checkRunningSQL -> execute(array(':key' => $_GET['key'])); 
$countRunning = $checkRunningSQL -> fetchAll(); 
$stillrunning = ($countRunning[0][time] + $countRunning[0][date]) - time(); 
if($stillrunning >= 1) 
{ 
echo '<p><strong>ERROR: </strong>You currently have more than your allocated running.</p>'; 
die(); 
} 

表中的这个检查目前像这样的:

enter image description here

这是工作的罚款,如果他们有1种当前运行状态。但是我想要为每个键设置一个限制。刚才,如果他们有一个正在运行的10秒说,直到这10秒之后,他们无法启动另一个。但我是想是这样,他们可以推出5,如果他们试图发动6日将回送错误。

当他们请求的页面,他们指定然后把它输入到MySQL的论点:

$insertLogSQL = $odb -> prepare("INSERT INTO `api` VALUES (:key, :ip, :port, :time, :method, UNIX_TIMESTAMP())"); 
$insertLogSQL -> execute(array(':key' => $_GET['key'], ':ip' => $_GET['host'], ':port' => $_GET['port'], ':time' => $_GET['time'], ':method' => $_GET['method'])); 

我似乎无法让我的周围如何将它们限制在5上,而不是单一的一个头。任何想法抛出这个将是辉煌的。

+0

请将PHP代码转换为逐字SQL查询,以便更容易理解您在不解密PHP代码的情况下执行的操作。 – hakre

回答

1

你能不能(插入之前)做运行实例的API密钥的电流量支票?例如:

$SESSION_LIMIT = 5; 
$precheck = $odb->prepare("SELECT count(*) AS `active_sessions` FROM `api` WHERE `key` = :key AND (UNIX_TIMESTAMP() BETWEEN date AND (date + time))"); 
$precheck->execute(array(':key' => $_GET['key'])); 
if (($result = $precheck->fetch()) && $result['active_sessions'] >= $SESSION_LIMIT) { 
    // too many sessions 
    echo "Can't create any more sessions at this time"; 
} 
+0

这似乎是最合乎逻辑的答案,但是我似乎能够启动其中的很多功能,并将其保留几秒钟,然后再尝试返回该错误。它会保持那样,直到我清除数据库。 – user1372896

+0

我想我已经在'WHERE'我的SQL语句的WHERE子句,给我一次一个缺陷。 –

+0

@ user1372896我编辑了逻辑;愚蠢地从'UNIX_TIMESTAMP'减去'(日期+时间)'而不是其他方式。我实际上已经进一步修改它来使用'BETWEEN'来代替,如果你允许会话未来的日期。 –

0

在返回任何页面之前,只有在有效的请求中,才将session_id,unix_time插入到用法表中。

然后当请求一个页面时,从usage表中做一个select count(*),其中session_id = my_session_id和time> time_now-10秒。如果计数大于5时,返回的错误信息(系统正忙,请等待10秒)。

相关问题