Negasus

Untitled

Jun 8th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.22 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Controllers;
  4.  
  5. class MainController
  6. {
  7.     private $db;
  8.     private $minShows;
  9.  
  10.     function __construct()
  11.     {
  12.         $this->db = new PDO('mysql:dbname=test;host=127.0.0.1', 'homestead', 'secret');
  13.         // Наше ограничение на наименьшее число просмотров
  14.         $this->minShows = 1000;
  15.     }
  16.  
  17.     public function index()
  18.     {
  19.  
  20.         // Получаем наименьшее число просмотров.
  21.         // В тестовом задании не обрабатываем ошибки
  22.         // На боевом серере, конечно, это значение лучше кешировать, чтобы не дергать базу каждый раз
  23.         $query = 'SELECT count(s.id) as cnt FROM bunners as b ' .
  24.             'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
  25.             'GROUP BY b.id ' .
  26.             'ORDER BY cnt ASC ' .
  27.             'LIMIT 1';
  28.  
  29.         $result = $this->db->query($query)
  30.             ->fetch(PDO::FETCH_ASSOC);
  31.  
  32.         // Если мы не преодолели порог на число просмотров, выводим случайно
  33.         $bunners = $result['cnt'] > $this->minShows ? $this->showBunners() : $this->showBunnersRandom();
  34.  
  35.         // Добавим строки показов
  36.         $rows = [];
  37.         foreach ($bunners as $bunner) {
  38.             $rows[] = '(0, ' . $bunner['id'] . ', NOW())';
  39.         }
  40.         $query = 'INSERT INTO shows VALUES ' . implode(',', $rows);
  41.         $this->db->query($query);
  42.  
  43.         // После возвращения этой функции начинает работать рендер страницы, выводим все как нам надо,
  44.         // в переменной bunners будут наши баннеры.
  45.         return $bunners;
  46.     }
  47.  
  48.     public function showBunnersRandom()
  49.     {
  50.  
  51.         // Берем всегда баннеры с самыми наименьшими показами
  52.         $query = 'SELECT b.id as id, b.image as image FROM bunners as b ' .
  53.             'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
  54.             'GROUP BY b.id ' .
  55.             'ORDER BY count(s.id) ASC ' .
  56.             'LIMIT 10';
  57.  
  58.         return $this->db->query($query)
  59.             ->fetchAll(PDO::FETCH_ASSOC);
  60.     }
  61.  
  62.     public function showBunners()
  63.     {
  64.         // Тут берем просто 10 баннеров с самым лучшим ctr.
  65.         // Если надо реализовать какую-то логику, не брать например всегда,
  66.         // а примешивать 80% баннеров с максимальным ctr
  67.         // и 20% баннеров остальных, надо сделать пару запроса по аналогии
  68.  
  69.         $query = 'SELECT b.id, b.image FROM bunners as b ' .
  70.             'LEFT JOIN shows as s ON s.bunner_id = b.id ' .
  71.             'LEFT JOIN clicks as c ON c.bunner_id = b.id ' .
  72.             'GROUP BY b.id ' .
  73.             'ORDER BY (count(distinct c.id) / count(distinct s.id)) DESC' .
  74.             'LIMIT 10';
  75.  
  76.         return $this->db->query($query);
  77.         ->
  78.         fetchAll(PDO::FETCH_ASSOC);
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment