soko-web/src/Database/Mysql/Connection.php
Pőcze Bence f43121769b
All checks were successful
soko-web/pipeline/pr-master This commit looks good
turn on mysqli exceptions
2023-04-17 20:42:22 +02:00

95 lines
2.2 KiB
PHP

<?php namespace SokoWeb\Database\Mysql;
use SokoWeb\Interfaces\Database\IConnection;
use SokoWeb\Interfaces\Database\IResultSet;
use SokoWeb\Interfaces\Database\IStatement;
use mysqli;
class Connection implements IConnection
{
private mysqli $connection;
public function __construct(string $host, string $user, string $password, string $db, int $port = -1, string $socket = null)
{
if ($port < 0) {
$port = (int) ini_get('mysqli.default_port');
}
if ($socket === null) {
$socket = (string) ini_get('mysqli.default_socket');
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$this->connection = new mysqli($host, $user, $password, $db, $port, $socket);
$this->connection->set_charset('utf8mb4');
}
public function __destruct()
{
$this->connection->close();
}
public function startTransaction(): void
{
$this->connection->autocommit(false);
}
public function commit(): void
{
$this->connection->commit();
$this->connection->autocommit(true);
}
public function rollback(): void
{
$this->connection->rollback();
$this->connection->autocommit(true);
}
public function query(string $query): ?IResultSet
{
$result = $this->connection->query($query);
if ($result !== true) {
return new ResultSet($result);
}
return null;
}
public function multiQuery(string $query): array
{
$this->connection->multi_query($query);
$ret = [];
do {
if ($result = $this->connection->store_result()) {
$ret[] = new ResultSet($result);
} else {
$ret[] = null;
}
$this->connection->more_results();
} while ($this->connection->next_result());
return $ret;
}
public function prepare(string $query): IStatement
{
$stmt = $this->connection->prepare($query);
return new Statement($stmt);
}
public function lastId(): int
{
return $this->connection->insert_id;
}
public function getAffectedRows(): int
{
return $this->connection->affected_rows;
}
}