55 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
| <?php
 | |
| 
 | |
| namespace App\Core;
 | |
| 
 | |
| use PDO;
 | |
| use Exception;
 | |
| 
 | |
| class Settings
 | |
| {
 | |
|     private PDO $pdo;
 | |
| 
 | |
|     public function __construct($db)
 | |
|     {
 | |
|         if ($db instanceof PDO) {
 | |
|             $this->pdo = $db;
 | |
|         } elseif (is_object($db) && method_exists($db, 'getConnection')) {
 | |
|             $pdo = $db->getConnection();
 | |
|             if (!$pdo instanceof PDO) {
 | |
|                 throw new Exception('Settings: database wrapper did not return PDO');
 | |
|             }
 | |
|             $this->pdo = $pdo;
 | |
|         } else {
 | |
|             $type = is_object($db) ? get_class($db) : gettype($db);
 | |
|             throw new Exception("Settings: unsupported database type: {$type}");
 | |
|         }
 | |
|         $this->ensureTable();
 | |
|     }
 | |
| 
 | |
|     private function ensureTable(): void
 | |
|     {
 | |
|         $driver = $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
 | |
|         if ($driver === 'sqlite') {
 | |
|             $sql = "CREATE TABLE IF NOT EXISTS settings (\n                `key` TEXT PRIMARY KEY,\n                `value` TEXT,\n                `updated_at` TEXT NOT NULL\n            )";
 | |
|         } else {
 | |
|             $sql = "CREATE TABLE IF NOT EXISTS settings (\n                `key` VARCHAR(191) NOT NULL PRIMARY KEY,\n                `value` TEXT NULL,\n                `updated_at` DATETIME NOT NULL\n            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
 | |
|         }
 | |
|         $this->pdo->exec($sql);
 | |
|     }
 | |
| 
 | |
|     public function get(string $key, $default = null)
 | |
|     {
 | |
|         $stmt = $this->pdo->prepare('SELECT `value` FROM settings WHERE `key` = :k');
 | |
|         $stmt->execute([':k' => $key]);
 | |
|         $val = $stmt->fetchColumn();
 | |
|         if ($val === false) return $default;
 | |
|         return $val;
 | |
|     }
 | |
| 
 | |
|     public function set(string $key, $value): bool
 | |
|     {
 | |
|         $stmt = $this->pdo->prepare('REPLACE INTO settings (`key`, `value`, `updated_at`) VALUES (:k, :v, NOW())');
 | |
|         return (bool)$stmt->execute([':k' => $key, ':v' => $value]);
 | |
|     }
 | |
| }
 |