我通过许多类似的解决方案,但找不到符合我要求的解决方案。
我想限制用户在24小时内每个网址创建两个以上的shortURL
人们正在滥用这个并创建10个以上的网址并堵塞我的数据库。所以我想将它们限制为每个网址2,并留下一条消息,如果它们超过了
现在我有这个检查,看看他们每个网址完成了多少次
$sql = "SELECT * FROM ShortUrls WHERE user_id='$user' AND vidID='$urlMe' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))";
$result = $conn->query($sql);
echo "user created this many urls: " .$result->num_rows;
if ($result->num_rows > 2) {
// keep checking till find one less that 2
}
循环访问网址数据库并检查他们是否在24小时内使用了相同的网址超过两次。如果他们在24小时内没有使用该网址超过两次,他们可以使用该网址创建一个新的缩短网址。
编辑我使用的解决方案:
$sql2 = "SELECT tube.vidID FROM tube LEFT JOIN ( SELECT COUNT(*) c, vidID FROM ShortUrls WHERE user_id='$user' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY vidID ) urls ON urls.vidID = tube.vidID WHERE urls.c < 2 LIMIT 1;";
$result = $conn->query($sql2);
if ($row = $result->fetch_assoc()) {
echo "You can add a URL to this video: " . htmlspecialchars($row['vidID']);
} else {
echo "All videos used up!";
}
希望这对其他人有用
答案 0 :(得分:1)
是否要查看哪些user_id
在过去24小时内创建的行数少于两行SELECT
COUNT(*) c, vidID
FROM
ShortUrls
WHERE
user_id = ?
AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
GROUP BY
vidID
HAVING
c < 2
?
vidID
但如果您提前知道vidID
,并且您只关注那个SELECT
COUNT(*)
FROM
ShortUrls
WHERE
user_id = ?
AND vidID = ?
AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
:
vidID
如果您想为任何 SELECT
COUNT(*) c, vidID
FROM
ShortUrls
WHERE
user_id = ?
AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
GROUP BY
vidID
HAVING
c > 2
创建两个以上的人来阻止他们,请尝试以下操作:
vidID
如果查询返回任何内容,则用户在过去24小时内为单个SELECT
COUNT(*)
FROM (
SELECT
COUNT(*) c, vidID
FROM
ShortUrls
WHERE
user_id = ?
AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
GROUP BY
vidID
HAVING
c > 2
) i
创建的内容超过2个。
如果你想获得幻想:
{{1}}