prepare("select content from customCategory where id=:id"); $stmt->bindValue(':id', $id, PDO::PARAM_STR); if ($stmt->execute()) { $row = $stmt->fetch(PDO::FETCH_ASSOC); $result = $row['content']; $stmt->closeCursor(); return $result; } } function recordAccess ($id) { global $db; if (!isset($_SESSION['customCategoryAccess'])) { $_SESSION['customCategoryAccess'] = []; } // update access per session only once a day if (array_key_exists($id, $_SESSION['customCategoryAccess']) && $_SESSION['customCategoryAccess'][$id] > time() - 86400) { return; } $_SESSION['customCategoryAccess'][$id] = time(); $stmt = $db->prepare("insert into customCategoryAccess (id) values (:id)"); $stmt->bindValue(':id', $id); $stmt->execute(); } function saveCategory ($content) { global $db; $id = md5($content); switch ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) { case 'mysql': $sqlAction = "insert ignore"; break; case 'sqlite': default: $sqlAction = "insert or ignore"; } $stmt = $db->prepare("{$sqlAction} into customCategory (id, content) values (:id, :content)"); $stmt->bindValue(':id', $id, PDO::PARAM_STR); $stmt->bindValue(':content', $content, PDO::PARAM_STR); $result = $stmt->execute(); return $id; } function list ($options=[]) { global $db; // $sqlCalcAge: the age of the access in days switch ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) { case 'mysql': $sqlCalcAge = "datediff(now(), ts)"; break; case 'sqlite': $sqlCalcAge = "julianday('now')-julianday(ts)"; } // the popularity column counts every acess with declining value over time, // it halves every year. $stmt = $db->prepare("select customCategory.id, customCategory.created, customCategory.content, t.accessCount, t.popularity, t.lastAccess from customCategory left join (select id, count(id) accessCount, sum(1/(({$sqlCalcAge})/365.25+1)) popularity, max(ts) lastAccess from customCategoryAccess group by id) t on customCategory.id=t.id order by popularity desc, created desc limit 25"); $stmt->execute(); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); $data = array_map(function ($d) { $d['popularity'] = (float)$d['popularity']; $d['accessCount'] = (int)$d['accessCount']; $content = yaml_parse($d['content']); if ($content && is_array($content) && array_key_exists('name', $content)) { $d['name'] = lang($content['name']); } else { $d['name'] = 'Custom ' . substr($d['id'], 0, 6); } unset($d['content']); return $d; }, $data); $stmt->closeCursor(); return $data; } } $customCategoryRepository = new CustomCategoryRepository();