k-kinzal / ztd-query-mysqli-adapter
MySQLi adapter for ZTD Query
Package info
github.com/k-kinzal/ztd-query-mysqli-adapter
pkg:composer/k-kinzal/ztd-query-mysqli-adapter
Requires
- php: ^8.1
- ext-mysqli: *
- k-kinzal/ztd-query-core: ^0.1
- k-kinzal/ztd-query-mysql: ^0.1
Requires (Dev)
- brianium/paratest: ^6.11 || ^7
- friendsofphp/php-cs-fixer: ^3.92
- infection/infection: ^0.28 || ^0.29 || ^0.30 || ^0.31 || ^0.32
- k-kinzal/sql-faker: ^0.1
- k-kinzal/sql-fixture: ^0.1
- k-kinzal/testcontainers-php: ^0.5.1
- nikic/php-fuzzer: ^0.0.11
- phpstan/phpstan: ^2.1
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^10.5 || ^11 || ^12 || ^13
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
ZTD Query is a Zero Table Dependency testing library for PHP: it runs the SQL of an application on a real database engine without reading or writing any physical table. Before a query reaches the database, every table it references is replaced by a CTE holding the rows the test has written, and every INSERT, UPDATE, and DELETE is turned into a SELECT whose result is kept in the session, so later queries see the change. Tests therefore need no migrations, seeding, or cleanup, and they can run in parallel against one empty database. This package is the mysqli adapter: ZtdMysqli extends mysqli and applies ZTD to every query it runs on MySQL.
Requirements
- PHP 8.1+ with the mysqli extension
- MySQL 8.0–9.1
Installation
MySQL:
composer require --dev k-kinzal/ztd-query-mysqli-adapter k-kinzal/ztd-query-mysql
Usage
ZtdMysqli extends mysqli, so it can be passed wherever the application expects a mysqli connection. Tables are created and filled through the same connection; they exist only in the session.
use PHPUnit\Framework\TestCase; use ZtdQuery\Adapter\Mysqli\ZtdMysqli; final class UserQueryTest extends TestCase { public function testSelectsActiveUsers(): void { $mysqli = new ZtdMysqli('127.0.0.1', 'root', 'root', 'test'); $mysqli->query('CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, active BOOLEAN NOT NULL)'); $mysqli->query("INSERT INTO users (id, name, active) VALUES (1, 'Alice', TRUE), (2, 'Bob', FALSE)"); $result = $mysqli->execute_query('SELECT name FROM users WHERE active = ? ORDER BY id', [1]); self::assertSame([['name' => 'Alice']], $result->fetch_all(MYSQLI_ASSOC)); } }
ZtdMysqli::fromMysqli($mysqli) wraps an existing connection instead of opening a new one, and disableZtd() and enableZtd() switch between the physical database and the session. Read the number of affected rows with lastAffectedRows(); the affected_rows property is not available on a ZtdMysqli.
Configuration
use ZtdQuery\Adapter\Mysqli\ZtdMysqli; use ZtdQuery\Config\UnknownSchemaBehavior; use ZtdQuery\Config\UnsupportedSqlBehavior; use ZtdQuery\Config\ZtdConfig; $config = new ZtdConfig( // Unsupported statements: Exception (default), Notice, or Ignore unsupportedBehavior: UnsupportedSqlBehavior::Exception, // Tables the session does not know: Passthrough to the database (default), or Exception unknownSchemaBehavior: UnknownSchemaBehavior::Exception, // Per-statement overrides of unsupportedBehavior; the first matching rule wins behaviorRules: [ 'CREATE INDEX' => UnsupportedSqlBehavior::Ignore, // case-insensitive prefix '/^SET\s+/i' => UnsupportedSqlBehavior::Notice, // regular expression ], ); $mysqli = new ZtdMysqli($host, $user, $password, $database, config: $config);
Ignore skips the statement, Notice skips it and raises a PHP notice, and Exception throws an exception.
SQL Support
| Statement | MySQL |
|---|---|
| SELECT, including joins, grouping, set operations, subqueries, CTEs, recursive CTEs, and window functions | Supported |
| INSERT with VALUES or SELECT | Supported |
| Upsert | ON DUPLICATE KEY UPDATE, INSERT IGNORE, REPLACE |
| UPDATE and DELETE | Supported, including multi-table forms and ORDER BY ... LIMIT |
RETURNING |
– |
| TRUNCATE | Supported |
| CREATE TABLE, DROP TABLE | Supported |
| ALTER TABLE | Supported |
| BEGIN, COMMIT, ROLLBACK | Applied to the session: ROLLBACK discards the writes made since BEGIN |
| Views, indexes, routines, triggers, SET, and server or user administration | Unsupported |
Unsupported statements are handled as configured by unsupportedBehavior. The full specification is in ztd-query-mysql.
License
MIT License. See LICENSE for details.