classZtdMysqliStatement
final class ZtdMysqliStatement
extends MysqliStatementBindingBridge
@visibility public.mysqli_stmt wrapper that applies ZTD rewrite/simulation on execute().
Uses delegation pattern: extends mysqli_stmt for type compatibility, but delegates all operations to an inner mysqli_stmt instance.
All public methods are explicitly overridden to prevent parent class implementation from being called.
Properties are delegated via __get/__isset to the delegate instance.
$container = \Testcontainers\Testcontainers::run(\Container\MySql80Container::class);
$native = new \mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
$native->set_charset('utf8mb4');
$native->query('CREATE TABLE contacts (id INT PRIMARY KEY, name VARCHAR(100))');
$ztd = \ZtdQuery\Adapter\Mysqli\ZtdMysqli::fromMysqli($native);
$statement = $ztd->prepare('INSERT INTO contacts VALUES (?, ?)');
$statement->execute([7, 'Alice']) // => true
$statement->ztdAffectedRows() // => 1
$ztd->query('SELECT name FROM contacts')->fetch_all(MYSQLI_ASSOC) // => [['name' => 'Alice']]
$native->query('SELECT name FROM contacts')->fetch_all(MYSQLI_ASSOC) // => []
$native->query('DROP TABLE contacts');
$container->stop();Methods§
public function __construct(mysqli_stmt $delegate, Session $session, ?RewritePlan $plan)Wrap the prepared statement with its session and optional rewrite plan.
Parameters
$delegate | mysqli_stmt | |
$session | Session | |
$plan | ?RewritePlan |
Calls 2
public function __get(string $name): mixedDelegate property access to the delegate instance.
Handles affected_rows and num_rows specially when ZTD result is available.
Parameters
$name | string |
Returns
mixedCalls 5
- method-call StatementExecution::result() line 66
- function-call
in_arrayline 67 - method-call MysqliStatementPropertyReader::read() line 70
- new MysqliStatementPropertyReader line 70
- method-call StatementExecution::native() line 70
public function __isset(string $name): boolDelegate property isset check to the delegate instance.
Parameters
$name | string |
Returns
boolCalls 1
- function-call
in_arrayline 78
public function ztdAffectedRows(): intGet affected rows for ZTD results.
This method exists because mysqli_stmt's C extension property handler takes precedence over __get, making $stmt->affected_rows inaccessible when the parent constructor was not called. This provides a safe alternative for ZtdMysqli to query affected rows after execution.
Returns
int The number of affected rows from ZTD processing, or from the delegate.Test cases 4
Calls 1
- method-call StatementExecution::affectedRows() line 104
public function execute(array<mixed, mixed>|null $params = null): boolExecute the statement, applying ZTD simulation as needed.
Parameters
$params | array<mixed, mixed>|null | Optional parameters to bind (PHP 8.1+). |
Returns
boolThrows
ZtdMysqliException When the session cannot process the native result.Test cases 17
ZtdMysqliStatementTest::testData_seekMovesTheNativeCursorcallsZtdMysqliStatementTest::testExecuteAppliesRowsToTheShadowStorecallsZtdMysqliStatementTest::testExecuteDoesNotRunASkippedPlancallsZtdMysqliStatementTest::testExecuteHonorsReadAndUnplannedParameterscallsZtdMysqliStatementTest::testExecuteReturnsFalseForNativeFailurescallsZtdMysqliStatementTest::testFetchWritesBoundResultVariablescallsZtdMysqliStatementTest::testFree_resultReleasesBufferedRowscallsZtdMysqliStatementTest::testGet_resultConsumesTheCachedNativeResultOncecallsZtdMysqliStatementTest::testGet_resultReturnsFalseForAStatementWithoutRowscallsZtdMysqliStatementTest::testGet_warningsReturnsTheNativeWarningcallsZtdMysqliStatementTest::testMore_resultsReturnsFalseAfterASingleResultcallsZtdMysqliStatementTest::testNext_resultReturnsFalseWithoutAnotherResultcallsZtdMysqliStatementTest::testPrepareReplacesTheDelegatedStatementcallsZtdMysqliStatementTest::testResetClearsTheSimulatedAffectedRowCountcallsZtdMysqliStatementTest::testSend_long_dataConcatenatesBinaryChunkscallsZtdMysqliStatementTest::testStore_resultBuffersTheNativeRowscallsZtdMysqliStatementTest::testZtdAffectedRowsReturnsTheNativeWriteCountcalls
Calls 1
- method-call StatementExecution::execute() line 116
public function get_result(): mysqli_result|false{@inheritDoc}
Returns
mysqli_result|falseTest cases 5
ZtdMysqliStatementTest::testExecuteHonorsReadAndUnplannedParameterscallsZtdMysqliStatementTest::testGet_resultConsumesTheCachedNativeResultOncecallsZtdMysqliStatementTest::testGet_resultReturnsFalseForAStatementWithoutRowscallsZtdMysqliStatementTest::testPrepareReplacesTheDelegatedStatementcallsZtdMysqliStatementTest::testSend_long_dataConcatenatesBinaryChunkscalls
Calls 1
- method-call StatementExecution::getResult() line 125
public function fetch(): ?boolpublic function close()public function free_result(): voidpublic function reset(): boolpublic function store_result(): boolpublic function data_seek(int $offset): void{@inheritDoc}
Parameters
$offset | int |
Test cases 1
Calls 1
- method-call StatementExecution::native() line 181
public function result_metadata(): mysqli_result|falsepublic function attr_get(int $attribute): int{@inheritDoc}
Parameters
$attribute | int |
Returns
intThrows
ZtdMysqliException When the native attribute cannot be read.Test cases 1
Calls 2
- method-call StatementExecution::native() line 200
- new ZtdMysqliException line 202
public function attr_set(int $attribute, int $value): bool{@inheritDoc}
Parameters
$attribute | int | |
$value | int |
Returns
boolTest cases 1
Calls 1
- method-call StatementExecution::native() line 214
public function get_warnings(): mysqli_warning|false{@inheritDoc}
Returns
mysqli_warning|falseTest cases 1
Calls 1
- method-call StatementExecution::native() line 223
public function more_results(): boolpublic function next_result(): boolpublic function num_rows(): int|string{@inheritDoc}
Returns
int|stringTest cases 5
ZtdMysqliStatementTest::testExecuteAppliesRowsToTheShadowStorecallsZtdMysqliStatementTest::testFree_resultReleasesBufferedRowscallsZtdMysqliStatementTest::testGet_resultReturnsFalseForAStatementWithoutRowscallsZtdMysqliStatementTest::testNum_rowsReturnsTheNativeBufferedCountcallsZtdMysqliStatementTest::testStore_resultBuffersTheNativeRowscalls
Calls 2
- method-call StatementExecution::result() line 250
- method-call StatementExecution::native() line 255
public function prepare(string $query): bool{@inheritDoc}
Parameters
$query | string |
Returns
boolTest cases 1
Calls 1
- method-call StatementExecution::native() line 264
public function send_long_data(int $param_num, string $data): bool{@inheritDoc}
Parameters
$param_num | int | |
$data | string |
Returns
boolTest cases 1
Calls 1
- method-call StatementExecution::native() line 273
Private surface 1§
Implementation details, listed for orientation only.
private StatementExecution $executionTest cases 29§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 22
ZtdMysqliStatementTest::testAttr_getReadsTheConfiguredNativeCursorModecallsZtdMysqliStatementTest::testAttr_setUpdatesTheNativeCursorModecallsZtdMysqliStatementTest::testCloseClosesTheDelegatedStatementcallsZtdMysqliStatementTest::testData_seekMovesTheNativeCursorcallsZtdMysqliStatementTest::testExecuteAppliesRowsToTheShadowStorecallsZtdMysqliStatementTest::testExecuteDoesNotRunASkippedPlancallsZtdMysqliStatementTest::testExecuteHonorsReadAndUnplannedParameterscallsZtdMysqliStatementTest::testExecuteReturnsFalseForNativeFailurescallsZtdMysqliStatementTest::testFetchWritesBoundResultVariablescallsZtdMysqliStatementTest::testFree_resultReleasesBufferedRowscallsZtdMysqliStatementTest::testGet_resultConsumesTheCachedNativeResultOncecallsZtdMysqliStatementTest::testGet_resultReturnsFalseForAStatementWithoutRowscallsZtdMysqliStatementTest::testGet_warningsReturnsTheNativeWarningcallsZtdMysqliStatementTest::testMore_resultsReturnsFalseAfterASingleResultcallsZtdMysqliStatementTest::testNext_resultReturnsFalseWithoutAnotherResultcallsZtdMysqliStatementTest::testNum_rowsReturnsTheNativeBufferedCountcallsZtdMysqliStatementTest::testPrepareReplacesTheDelegatedStatementcallsZtdMysqliStatementTest::testResetClearsTheSimulatedAffectedRowCountcallsZtdMysqliStatementTest::testResult_metadataReturnsNativeColumnInformationcallsZtdMysqliStatementTest::testSend_long_dataConcatenatesBinaryChunkscallsZtdMysqliStatementTest::testStore_resultBuffersTheNativeRowscallsZtdMysqliStatementTest::testZtdAffectedRowsReturnsTheNativeWriteCountcalls