mirror of
https://github.com/myronblair/novacpx
synced 2026-06-30 17:50:41 -05:00
e802443d4a
Full hosting control panel with 3 tiers: Admin, Reseller, User. - install.sh: unattended installer for Ubuntu 20/22/24 + Debian 11/12 - PHP multi-version (7.4/8.1/8.2/8.3), Apache2/nginx choice, MySQL, PostgreSQL - BIND9 DNS, Postfix+Dovecot mail, ProFTPD, Certbot SSL, UFW, Fail2Ban - 18-table DB schema with audit log and version tracking - PHP REST API (auth, system/updates, server stats, service control) - Admin panel: dark dashboard, service manager, git-based update system - User panel: usage rings + feature card grid (distinct from cPanel) - VERSION file: git-tracked; Admin > Updates panel shows/applies git commits Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.3 KiB
PHP
44 lines
1.3 KiB
PHP
<?php
|
|
class DB {
|
|
private static ?DB $instance = null;
|
|
private PDO $pdo;
|
|
|
|
private function __construct() {
|
|
$this->pdo = new PDO(
|
|
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
|
|
DB_USER, DB_PASS,
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]
|
|
);
|
|
}
|
|
|
|
public static function getInstance(): self {
|
|
if (!self::$instance) self::$instance = new self();
|
|
return self::$instance;
|
|
}
|
|
|
|
public function execute(string $sql, array $params = []): PDOStatement {
|
|
$stmt = $this->pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
return $stmt;
|
|
}
|
|
|
|
public function fetchOne(string $sql, array $params = []): ?array {
|
|
return $this->execute($sql, $params)->fetch() ?: null;
|
|
}
|
|
|
|
public function fetchAll(string $sql, array $params = []): array {
|
|
return $this->execute($sql, $params)->fetchAll();
|
|
}
|
|
|
|
public function insert(string $sql, array $params = []): string {
|
|
$this->execute($sql, $params);
|
|
return $this->pdo->lastInsertId();
|
|
}
|
|
|
|
public function pdo(): PDO { return $this->pdo; }
|
|
}
|