检查MySQL中的最后5条记录而不是最后一条

时间:2013-06-25 02:27:41

标签: php 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而不是单一。任何想法都会很棒。

2 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:0)

在返回任何页面之前,但仅在有效请求之前,将session_id,unix_time插入到使用表中。

然后在请求页面时,从使用表中执行选择计数(*),其中session_id = my_session_id和time&gt; time_now-10秒。如果计数大于5,则返回错误消息(系统现在正忙,请等待10秒)。