prepare('INSERT INTO rate_limit_attempts (bucket) VALUES (?)')->execute([$bucket]); // Globaler Maximalhorizont: unabhängig davon, ob derselbe Bucket je wieder // benutzt wird, bleibt keine IP-basierte Rate-Limit-Zeile länger als 24h. $pdo->exec('DELETE FROM rate_limit_attempts WHERE created_at < DATE_SUB(NOW(), INTERVAL 24 HOUR)'); $stmt = $pdo->prepare( 'SELECT COUNT(*) FROM rate_limit_attempts WHERE bucket = ? AND created_at >= DATE_SUB(NOW(), INTERVAL ? SECOND)' ); $stmt->execute([$bucket, $windowSeconds]); return (int)$stmt->fetchColumn() <= $maxAttempts; }