'+1 day', 'week' => '+7 day', '2week' => '+14 day', 'month' => '+1 month' ); private $db; public function __construct() { $this->init(); } public function init() { try { $this->db = new PDO('sqlite:test.db'); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo $e->getMessage(); return null; } $stmt = $this->db->prepare('PRAGMA foreign_keys = 1;'); $stmt->execute(); } public function isInit() { return isset($this->db); } public function buildTables() { $stmt = $this->db->prepare(" CREATE TABLE IF NOT EXISTS clouds( id_cloud INTEGER PRIMARY KEY, code TEXT NOT NULL UNIQUE, size INTEGER NOT NULL DEFAULT 3, text TEXT, delete_t TIMESTAMP DEFAULT (datetime('now', '" . self::DEFAULT_DURATION . "')) ); "); $stmt->execute(); $stmt = $this->db->prepare(" CREATE TABLE IF NOT EXISTS words( id_word INTEGER PRIMARY KEY, word TEXT NOT NULL, count INT DEFAULT 1, cloud_id INT NOT NULL, FOREIGN KEY (cloud_id) REFERENCES clouds(id_cloud) ON UPDATE CASCADE ON DELETE CASCADE ); "); $stmt->execute(); } public function addWord(string $cloud, string $word) { if (empty($word)) { return false; } $stmt = $this->db->prepare(" SELECT * FROM clouds WHERE code = :id; "); $stmt->bindValue(':id', $cloud, PDO::PARAM_STR); $stmt->execute(); $cloudId = null; if ($data = $stmt->fetch()) { $cloudId = $data['id_cloud']; } else { return false; } $stmt = $this->db->prepare(" SELECT * FROM words WHERE cloud_id = :cid AND word = :w; "); $stmt->bindValue(':cid', $cloudId, PDO::PARAM_INT); $stmt->bindValue(':w', $word, PDO::PARAM_STR); $stmt->execute(); if ($data = $stmt->fetch()) { $wordId = $data['id_word']; $stmt = $this->db->prepare(" UPDATE words SET count = count + 1 WHERE id_word = :id; "); $stmt->bindValue(':id', $wordId, PDO::PARAM_INT); $stmt->execute(); } else { $stmt = $this->db->prepare(" INSERT INTO words(word, cloud_id) VALUES (:w, :cid); "); $stmt->bindValue(':w', $word, PDO::PARAM_STR); $stmt->bindValue(':cid', $cloudId, PDO::PARAM_INT); $stmt->execute(); } } public function getWords(string $id) { $stmt = $this->db->prepare(" SELECT * FROM words JOIN clouds ON words.cloud_id = clouds.id_cloud WHERE code = :id; "); $stmt->bindValue(':id', $id); $stmt->execute(); $words = []; $values = []; while ($data = $stmt->fetch()) { $words[] = array($data['word'], $data['count']); $values[] = $data['count']; $total += $data['count']; } array_multisort($values, SORT_DESC, $words); return $words; } public function getWordsPercentage(string $id) { $words = $this->getWords($id); $total = 0; foreach ($words as $word) { $total += $word[1]; } foreach ($words as $key => $word) { $words[$key] = array($word[0], $word[1] / $total); } return $words; } public function getWordsMax(string $id) { $words = $this->getWords($id); $max = 0; foreach ($words as $word) { $max = max($max, $word[1]); } foreach ($words as $key => $word) { $words[$key] = array($word[0], $word[1] / $max); } return $words; } public function createCloud( string $ref, string $text = '', int $size = null, string $duration = null) { if (!isset($size)) { $size = 3; } if (!isset($duration)) { $duration = self::DEFAULT_DURATION; } elseif (!in_array($duration, self::OPTIONS_DURATION)) { $duration = self::DEFAULT_DURATION; } $duration = date('Y-m-d H:i:s', strtotime($duration)); $stmt = $this->db->prepare(" INSERT INTO clouds(code, text, size, delete_t) VALUES (:code, :text, :size, :duration); "); $stmt->bindValue(':code', $ref); $stmt->bindValue(':text', $text); $stmt->bindValue(':size', $size); $stmt->bindValue(':duration', $duration, PDO::PARAM_STR); try { $stmt->execute(); } catch (PDOEXception $e) { return false; } return true; } public function getCloudSize(string $ref) { $stmt = $this->db->prepare(" SELECT * FROM clouds WHERE code= :code; "); $stmt->bindValue(':code', $ref, PDO::PARAM_STR); $stmt->execute(); if ($data = $stmt->fetch()) { return $data['size']; } return null; } public function getCloudText(string $ref) { $stmt = $this->db->prepare(" SELECT * FROM clouds WHERE code= :code; "); $stmt->bindValue(':code', $ref, PDO::PARAM_STR); $stmt->execute(); if ($data = $stmt->fetch()) { return $data['text']; } return null; } public function cleanCloud() { $stmt = $this->db->prepare(" DELETE FROM clouds WHERE delete_t < CURRENT_TIMESTAMP; "); $stmt->execute(); return true; } public function isCloud(string $id) { $stmt = $this->db->prepare(" SELECT * FROM clouds WHERE code = :id; "); $stmt->bindValue(':id', $id, PDO::PARAM_STR); $stmt->execute(); if ($stmt->fetch()) { return true; } return false; } }