49 lines
1.4 KiB
PHP
49 lines
1.4 KiB
PHP
<?php
|
|
namespace Database;
|
|
|
|
use PDO;
|
|
|
|
class Database {
|
|
public $pdo;
|
|
private $stmts = [];
|
|
|
|
public function __construct(string $dsn, string $username = '', string $password = '', array $options = []) {
|
|
$this->pdo = new PDO($dsn, $username, $password, $options);
|
|
}
|
|
|
|
public function getPDO(): PDO {
|
|
return $this->pdo;
|
|
}
|
|
|
|
public function queries(): int {
|
|
return (int)$this->query('SHOW SESSION STATUS LIKE "Questions"')->fetchColumn(1);
|
|
}
|
|
|
|
public function exec(string $stmt): int {
|
|
return $this->pdo->exec($stmt);
|
|
}
|
|
|
|
public function prepare(string $stmt, array $options = []): DatabaseStatement {
|
|
$encodedOptions = serialize($options);
|
|
|
|
if(empty($this->stmts[$stmt][$encodedOptions])) {
|
|
$this->stmts[$stmt][$encodedOptions] = $this->pdo->prepare($stmt, $options);
|
|
}
|
|
|
|
return new DatabaseStatement($this->stmts[$stmt][$encodedOptions], $this->pdo, false);
|
|
}
|
|
|
|
public function query(string $stmt, ?int $fetchMode = null, ...$args): DatabaseStatement {
|
|
if($fetchMode === null) {
|
|
$pdoStmt = $this->pdo->query($stmt);
|
|
} else {
|
|
$pdoStmt = $this->pdo->query($stmt, $fetchMode, ...$args);
|
|
}
|
|
|
|
return new DatabaseStatement($pdoStmt, $this->pdo, true);
|
|
}
|
|
|
|
public function lastId(): int {
|
|
return $this->pdo->lastInsertId();
|
|
}
|
|
}
|