MagratheaPHP2
Up to date Narrative last written —; no source changes since. Method signatures below are reflected live.

Database — MySQLi Connection Wrapper

File: src/DB/Database.php Namespace: Magrathea2\DB Extends: Singleton

The primary database access layer. Wraps a mysqli connection and provides query execution methods, transaction support, prepared statements, and file import.


Constants (Fetch Modes)

ConstantValueDescription
FETCH_ASSOC1Returns rows as associative arrays
FETCH_OBJECT2Returns rows as stdClass objects (default)
FETCH_NUM3Returns rows as numeric arrays
FETCH_ARRAY4Returns rows as both assoc + numeric

Properties

PropertyTypeDescription
$mysqlimysqliThe underlying MySQLi connection
$connDetailsarrayConnection parameters
$fetchmodeintCurrent fetch mode
$countintNumber of queries executed

Connection Methods

SetConnection(string $host, string $database, string $username, string $password, ?int $port): Database

Set connection parameters. Called internally by MagratheaPHP::Connect().

Database::Instance()->SetConnection("localhost", "mydb", "root", "pass", 3306);

SetConnectionArray(array $dsn_arr): Database

Set connection from an array with keys host, database, username, password, port.

Database::Instance()->SetConnectionArray([
    "host"     => "localhost",
    "database" => "mydb",
    "username" => "root",
    "password" => "secret",
]);

OpenConnectionPlease(): bool

Opens the actual MySQLi connection. Throws MagratheaDBException on failure.

CloseConnectionThanks(): void

Closes the active connection.

getDatabaseName(): string|null

Returns the name of the currently connected database.

SetFetchMode(string $fetch): Database

Change the default fetch mode. Accepts "assoc", "object", "num", "array".

Database::Instance()->SetFetchMode("assoc");

Query Methods

Query(string $sql): object

Executes a raw SQL query. Returns a mysqli_result or throws MagratheaDBException.

$result = Database::Instance()->Query("SELECT * FROM users WHERE active = 1");

QueryAll(string $sql): array

Executes a SELECT and returns all rows as an array (format depends on fetch mode).

$users = Database::Instance()->QueryAll("SELECT * FROM users");
foreach ($users as $user) {
    echo $user->name; // FETCH_OBJECT (default)
}

QueryRow(string $sql): array|object

Executes a SELECT and returns only the first row.

$user = Database::Instance()->QueryRow("SELECT * FROM users WHERE id = 1");
echo $user->email;

QueryOne(string $sql): mixed

Executes a SELECT and returns only the first column of the first row (scalar value).

$count = Database::Instance()->QueryOne("SELECT COUNT(*) FROM users");
echo $count; // "42"

QueryTransaction(array $query_array): void

Executes an array of SQL statements as a single atomic transaction. Rolls back all on any failure.

Database::Instance()->QueryTransaction([
    "INSERT INTO orders (user_id, total) VALUES (1, 99.99)",
    "UPDATE inventory SET stock = stock - 1 WHERE product_id = 5",
]);

QueryMulti(array|string $queries, bool $killable = true): array

Executes multiple SQL statements. If $queries is a string, it splits on ;. Returns an array of results.

$results = Database::Instance()->QueryMulti([
    "SELECT * FROM users",
    "SELECT * FROM products",
]);

ImportFile(string $file_path, bool $killable = true): array

Reads a .sql file and executes all statements within it.

Database::Instance()->ImportFile("/migrations/001_create_users.sql");

Prepared Statements

PrepareAndExecute(string $query, array $arrTypes, array $arrValues): mixed

Safely executes a prepared statement. Use this for any query involving untrusted input.

$result = Database::Instance()->PrepareAndExecute(
    "SELECT * FROM users WHERE email = ? AND active = ?",
    ["s", "i"],          // types: s=string, i=int, d=double, b=blob
    ["user@example.com", 1]
);

Testing / Mock

Mock(): void

Replaces the internal MySQLi connection with a mock that does nothing. Useful for unit tests.

Database::Instance()->Mock();

Full Usage Examples

Basic SELECT

use Magrathea2\DB\Database;

$db = Database::Instance();
$rows = $db->QueryAll("SELECT id, name, email FROM users WHERE active = 1");

foreach ($rows as $row) {
    printf("[%d] %s <%s>\n", $row->id, $row->name, $row->email);
}

Counting rows

$total = Database::Instance()->QueryOne("SELECT COUNT(*) FROM orders WHERE status = 'pending'");
echo "Pending orders: $total";

Transaction (multi-step insert)

Database::Instance()->QueryTransaction([
    "INSERT INTO invoices (user_id, amount) VALUES (10, 250.00)",
    "INSERT INTO invoice_items (invoice_id, product_id) VALUES (LAST_INSERT_ID(), 3)",
    "UPDATE products SET stock = stock - 1 WHERE id = 3",
]);

Safe input with prepared statement

$email = $_POST["email"]; // untrusted user input

$user = Database::Instance()->PrepareAndExecute(
    "SELECT * FROM users WHERE email = ?",
    ["s"],
    [$email]
);

Notes

Class Reference — Database

Magrathea2\DB\Database extends Singleton implements Stringable /home/platypusweb/platypusweb.com.br/site/magratheaphp2/src/DB/Database.php

This class will provide a layer for connecting with mysql

CloseConnectionThanks()

Already used you.. Bye.

ImportFile($file_path, $killable = true)

imports a .sql file to the database

ParamTypeDefault
$file_path mixed required
$killable mixed true
Mock(): void
OpenConnectionPlease(): bool

Open connection, please. Please! 0=)

PrepareAndExecute($query, $arrTypes, $arrValues)

Prepares and execute a query and returns the inserted id (if any) @todo validates types and avoids injection. Does it?

ParamTypeDefault
$query mixed required
$arrTypes mixed required
$arrValues mixed required
Query(string $sql)

executes the query and returns the full data

ParamTypeDefault
$sql string required
QueryAll(string $sql)

executes the query and returns the full data in an array

ParamTypeDefault
$sql string required
QueryMulti($queries, $killable = true)

receives a string with multiple queries and executes them all

ParamTypeDefault
$queries mixed required
$killable mixed true
QueryOne($sql)

executes the query and returns only the first value of the first row of the result

ParamTypeDefault
$sql mixed required
QueryRow(string $sql): object|array

executes the query and returns only the first row of the result

ParamTypeDefault
$sql string required
QueryTransaction($query_array)

receives an array of queries and executes them all

ParamTypeDefault
$query_array mixed required
SetConnection($host, $database, $username, $password, $port = null): Magrathea2\DB\Database

Setups connection

ParamTypeDefault
$host mixed required
$database mixed required
$username mixed required
$password mixed required
$port mixed null
SetConnectionArray($dsn_arr): Magrathea2\DB\Database

Sets the connection array object array( 'hostspec' => $host, 'database' => $database, 'username' => $username, 'password' => $password, );

ParamTypeDefault
$dsn_arr mixed required
SetFetchMode($fetch): Magrathea2\DB\Database

Sets fetchmode, according with MDB2 values. Default mode: assoc. options available: assoc: array with keys as the column names object: object with columns as properties if anything different from those values is sent, "assoc" is used

ParamTypeDefault
$fetch mixed required
getDatabaseName(): ?string

Gets database name