2024-06-28 17:05:32 +00:00
|
|
|
<?php
|
|
|
|
|
2024-11-23 13:45:03 +00:00
|
|
|
/**
|
|
|
|
* Class Database
|
2024-11-25 14:09:47 +00:00
|
|
|
*
|
2024-11-23 13:45:03 +00:00
|
|
|
* Manages database connections for SQLite and MySQL (or MariaDB).
|
|
|
|
*/
|
2024-06-28 17:05:32 +00:00
|
|
|
class Database {
|
2024-11-23 13:45:03 +00:00
|
|
|
/**
|
2024-11-25 14:09:47 +00:00
|
|
|
* @var PDO|null $pdo The database connection instance.
|
2024-11-23 13:45:03 +00:00
|
|
|
*/
|
2024-06-28 17:05:32 +00:00
|
|
|
private $pdo;
|
|
|
|
|
2024-11-23 13:45:03 +00:00
|
|
|
/**
|
|
|
|
* Database constructor.
|
|
|
|
* Initializes the database connection based on provided options.
|
|
|
|
*
|
|
|
|
* @param array $options An associative array with database connection options:
|
|
|
|
* - type: The database type ('sqlite', 'mysql', or 'mariadb').
|
|
|
|
* - dbFile: The path to the SQLite database file (required for SQLite).
|
|
|
|
* - host: The database host (required for MySQL).
|
|
|
|
* - port: The port for MySQL (optional, default: 3306).
|
|
|
|
* - dbname: The name of the MySQL database (required for MySQL).
|
|
|
|
* - user: The username for MySQL (required for MySQL).
|
|
|
|
* - password: The password for MySQL (optional).
|
|
|
|
*
|
|
|
|
* @throws Exception If required extensions are not loaded or options are invalid.
|
|
|
|
*/
|
2024-08-10 18:42:44 +00:00
|
|
|
public function __construct($options) {
|
2024-11-23 13:45:03 +00:00
|
|
|
// check if PDO extension is loaded
|
2024-08-10 18:42:44 +00:00
|
|
|
if ( !extension_loaded('pdo') ) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('PDO extension not loaded.');
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// options check
|
|
|
|
if (empty($options['type'])) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('Database type is not set.');
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
|
2024-11-23 13:49:20 +00:00
|
|
|
// connect based on database type
|
2024-08-10 18:42:44 +00:00
|
|
|
switch ($options['type']) {
|
|
|
|
case 'sqlite':
|
|
|
|
$this->connectSqlite($options);
|
|
|
|
break;
|
|
|
|
case 'mysql' || 'mariadb':
|
|
|
|
$this->connectMysql($options);
|
|
|
|
break;
|
|
|
|
default:
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError("Database type \"{$options['type']}\" is not supported.");
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
}
|
2024-07-04 19:14:12 +00:00
|
|
|
|
2024-11-23 13:46:01 +00:00
|
|
|
/**
|
|
|
|
* Establishes a connection to a SQLite database.
|
|
|
|
*
|
|
|
|
* @param array $options An associative array with SQLite connection options:
|
|
|
|
* - dbFile: The path to the SQLite database file.
|
|
|
|
*
|
|
|
|
* @throws Exception If the SQLite PDO extension is not loaded or the database file is missing.
|
|
|
|
*/
|
2024-08-10 18:42:44 +00:00
|
|
|
private function connectSqlite($options) {
|
|
|
|
// pdo_sqlite extension is needed
|
|
|
|
if (!extension_loaded('pdo_sqlite')) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('PDO extension for SQLite not loaded.');
|
2024-06-28 17:05:32 +00:00
|
|
|
}
|
|
|
|
|
2024-08-10 18:42:44 +00:00
|
|
|
// SQLite options
|
|
|
|
if (empty($options['dbFile']) || !file_exists($options['dbFile'])) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError("SQLite database file \"{$options['dbFile']}\" not found.");
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// connect to SQLite
|
|
|
|
try {
|
|
|
|
$this->pdo = new PDO("sqlite:" . $options['dbFile']);
|
|
|
|
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
2024-09-11 13:21:05 +00:00
|
|
|
// enable foreign key constraints (not ON by default in SQLite3)
|
|
|
|
$this->pdo->exec('PRAGMA foreign_keys = ON;');
|
2024-08-10 18:42:44 +00:00
|
|
|
} catch (PDOException $e) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('SQLite connection failed: ', $e->getMessage());
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-11-23 13:46:01 +00:00
|
|
|
/**
|
|
|
|
* Establishes a connection to a MySQL (or MariaDB) database.
|
|
|
|
*
|
|
|
|
* @param array $options An associative array with MySQL connection options:
|
|
|
|
* - host: The database host.
|
|
|
|
* - port: The database port (default: 3306).
|
|
|
|
* - dbname: The name of the database.
|
|
|
|
* - user: The database username.
|
|
|
|
* - password: The database password (optional).
|
|
|
|
*
|
|
|
|
* @throws Exception If the MySQL PDO extension is not loaded or required options are missing.
|
|
|
|
*/
|
2024-08-10 18:42:44 +00:00
|
|
|
private function connectMysql($options) {
|
|
|
|
// pdo_mysql extension is needed
|
|
|
|
if (!extension_loaded('pdo_mysql')) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('PDO extension for MySQL not loaded.');
|
2024-08-10 18:42:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// MySQL options
|
|
|
|
if (empty($options['host']) || empty($options['dbname']) || empty($options['user'])) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('MySQL connection data is missing.');
|
2024-07-04 19:14:12 +00:00
|
|
|
}
|
|
|
|
|
2024-08-10 18:42:44 +00:00
|
|
|
// Connect to MySQL
|
2024-06-28 17:05:32 +00:00
|
|
|
try {
|
2024-08-10 18:42:44 +00:00
|
|
|
$dsn = "mysql:host={$options['host']};port={$options['port']};dbname={$options['dbname']};charset=utf8";
|
|
|
|
$this->pdo = new PDO($dsn, $options['user'], $options['password'] ?? '');
|
2024-06-28 17:05:32 +00:00
|
|
|
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
} catch (PDOException $e) {
|
2024-11-24 14:02:20 +00:00
|
|
|
$error = getError('MySQL connection failed: ', $e->getMessage());
|
2024-06-28 17:05:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-11-23 13:46:01 +00:00
|
|
|
/**
|
|
|
|
* Retrieves the current PDO connection instance.
|
|
|
|
*
|
|
|
|
* @return PDO|null The PDO instance or null if no connection is established.
|
|
|
|
*/
|
2024-06-28 17:05:32 +00:00
|
|
|
public function getConnection() {
|
|
|
|
return $this->pdo;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
?>
|