Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace App\Controllers;
- class MainController
- {
- private $db;
- private $minShows;
- function __construct()
- {
- $this->db = new PDO('mysql:dbname=test;host=127.0.0.1', 'homestead', 'secret');
- // Наше ограничение на наименьшее число просмотров
- $this->minShows = 1000;
- }
- public function index()
- {
- // Получаем наименьшее число просмотров.
- // В тестовом задании не обрабатываем ошибки
- // На боевом серере, конечно, это значение лучше кешировать, чтобы не дергать базу каждый раз
- $query = 'SELECT count(s.id) as cnt FROM bunners as b ' .
- 'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
- 'GROUP BY b.id ' .
- 'ORDER BY cnt ASC ' .
- 'LIMIT 1';
- $result = $this->db->query($query)
- ->fetch(PDO::FETCH_ASSOC);
- // Если мы не преодолели порог на число просмотров, выводим случайно
- $bunners = $result['cnt'] > $this->minShows ? $this->showBunners() : $this->showBunnersRandom();
- // Добавим строки показов
- $rows = [];
- foreach ($bunners as $bunner) {
- $rows[] = '(0, ' . $bunner['id'] . ', NOW())';
- }
- $query = 'INSERT INTO shows VALUES ' . implode(',', $rows);
- $this->db->query($query);
- // После возвращения этой функции начинает работать рендер страницы, выводим все как нам надо,
- // в переменной bunners будут наши баннеры.
- return $bunners;
- }
- public function showBunnersRandom()
- {
- // Берем всегда баннеры с самыми наименьшими показами
- $query = 'SELECT b.id as id, b.image as image FROM bunners as b ' .
- 'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
- 'GROUP BY b.id ' .
- 'ORDER BY count(s.id) ASC ' .
- 'LIMIT 10';
- return $this->db->query($query)
- ->fetchAll(PDO::FETCH_ASSOC);
- }
- public function showBunners()
- {
- // Тут берем просто 10 баннеров с самым лучшим ctr.
- // Если надо реализовать какую-то логику, не брать например всегда,
- // а примешивать 80% баннеров с максимальным ctr
- // и 20% баннеров остальных, надо сделать пару запроса по аналогии
- $query = 'SELECT b.id, b.image FROM bunners as b ' .
- 'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
- 'LEFT JOIN clicks as c ON c.bunner_id = b.id ' .
- 'GROUP BY b.id ' .
- 'ORDER BY (count(distinct c.id) / count(distinct s.id)) DESC' .
- 'LIMIT 10';
- return $this->db->query($query);
- ->
- fetchAll(PDO::FETCH_ASSOC);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment