Modified existing PDO tests for PHP 8.0+ (#1279)
This commit is contained in:
parent
b3b2acea8f
commit
9f6ef12076
|
@ -5,7 +5,14 @@ Verification of capabilities for extending PDO.
|
|||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php require('skipif.inc'); ?>
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
die("skip Test designed for PHP 8.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
@ -48,7 +55,7 @@ class ExPDO extends PDO
|
|||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
}
|
||||
|
||||
function test()
|
||||
{
|
||||
|
@ -56,9 +63,9 @@ class ExPDO extends PDO
|
|||
var_dump($this->test1);
|
||||
var_dump($this->test2);
|
||||
$this->test2 = 22;
|
||||
}
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = parent::prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement')));
|
||||
|
|
140
test/functional/pdo_sqlsrv/PDO94_Extend1_p7.phpt
Normal file
140
test/functional/pdo_sqlsrv/PDO94_Extend1_p7.phpt
Normal file
|
@ -0,0 +1,140 @@
|
|||
--TEST--
|
||||
Extending PDO Test #1
|
||||
--DESCRIPTION--
|
||||
Verification of capabilities for extending PDO.
|
||||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
die("skip Test designed for PHP 7.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
||||
function Extend()
|
||||
{
|
||||
include 'MsSetup.inc';
|
||||
|
||||
$testName = "PDO - Extension";
|
||||
StartTest($testName);
|
||||
|
||||
$conn1 = PDOConnect('ExPDO', $server, $uid, $pwd, true);
|
||||
$conn1->test();
|
||||
var_dump($conn1);
|
||||
|
||||
// Prepare test table
|
||||
DropTable($conn1, $tableName);
|
||||
$conn1->query("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10))");
|
||||
$conn1->query("INSERT INTO [$tableName] VALUES(0, 'A')");
|
||||
$conn1->query("INSERT INTO [$tableName] VALUES(1, 'B')");
|
||||
|
||||
// Retrieve test data via a direct query
|
||||
$stmt1 = ExecuteQuery($conn1, "SELECT val, id FROM [$tableName]");
|
||||
$result = $stmt1->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE);
|
||||
var_dump($result);
|
||||
|
||||
|
||||
// Cleanup
|
||||
DropTable($conn1, $tableName);
|
||||
$stmt1 = null;
|
||||
$conn1 = null;
|
||||
|
||||
EndTest($testName);
|
||||
}
|
||||
|
||||
class ExPDO extends PDO
|
||||
{
|
||||
public $test1 = 1;
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function test()
|
||||
{
|
||||
$this->test2 = 2;
|
||||
var_dump($this->test1);
|
||||
var_dump($this->test2);
|
||||
$this->test2 = 22;
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = parent::prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement')));
|
||||
$stmt->execute();
|
||||
return ($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
class ExPDOStatement extends PDOStatement
|
||||
{
|
||||
protected function __construct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Repro
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
function Repro()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Extend();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Repro();
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
int(1)
|
||||
int(2)
|
||||
object(ExPDO)#%d (2) {
|
||||
["test1"]=>
|
||||
int(1)
|
||||
["test2"]=>
|
||||
int(22)
|
||||
}
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
array(2) {
|
||||
["A"]=>
|
||||
string(1) "0"
|
||||
["B"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::__destruct()
|
||||
Test "PDO - Extension" completed successfully.
|
|
@ -5,7 +5,14 @@ Verification of capabilities for extending PDO.
|
|||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php require('skipif.inc'); ?>
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
die("skip Test designed for PHP 8.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
@ -48,14 +55,14 @@ class ExPDO extends PDO
|
|||
return (call_user_func_array(array($this, 'parent::__construct'), $args));
|
||||
}
|
||||
|
||||
public function exec($args1)
|
||||
public function exec(string $args1) : int|false
|
||||
{
|
||||
$this->protocol();
|
||||
$args = func_get_args();
|
||||
return (call_user_func_array(array($this, 'parent::exec'), $args));
|
||||
}
|
||||
|
||||
public function query($statement, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false
|
||||
{
|
||||
$this->protocol();
|
||||
$args = func_get_args();
|
||||
|
|
141
test/functional/pdo_sqlsrv/PDO95_Extend2_p7.phpt
Normal file
141
test/functional/pdo_sqlsrv/PDO95_Extend2_p7.phpt
Normal file
|
@ -0,0 +1,141 @@
|
|||
--TEST--
|
||||
Extending PDO Test #1
|
||||
--DESCRIPTION--
|
||||
Verification of capabilities for extending PDO.
|
||||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
die("skip Test designed for PHP 7.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
||||
function Extend()
|
||||
{
|
||||
include 'MsSetup.inc';
|
||||
|
||||
$testName = "PDO - Extension";
|
||||
StartTest($testName);
|
||||
|
||||
// simply use $databaseName from MsSetup.inc to facilitate testing in Azure,
|
||||
// which does not support switching databases
|
||||
$conn2 = new ExPDO("sqlsrv:Server=$server;Database=$databaseName", $uid, $pwd);
|
||||
// With PHP 8.0 the default is PDO::ERRMODE_EXCEPTION rather than PDO::ERRMODE_SILENT
|
||||
$conn2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
|
||||
|
||||
DropTable($conn2, "tmp_table");
|
||||
$conn2->exec("CREATE TABLE tmp_table (id INT)");
|
||||
$conn2->exec("INSERT INTO tmp_table (id) VALUES (1), (2)");
|
||||
$stmt1 = $conn2->query("SELECT * FROM tmp_table ORDER BY id ASC");
|
||||
var_dump($stmt1->fetchAll(PDO::FETCH_ASSOC));
|
||||
var_dump($stmt1->fetch());
|
||||
$conn2->intercept_call();
|
||||
|
||||
// Cleanup
|
||||
DropTable($conn2, "tmp_table");
|
||||
$stmt1 = null;
|
||||
$conn2 = null;
|
||||
|
||||
EndTest($testName);
|
||||
}
|
||||
|
||||
class ExPDO extends PDO
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->protocol();
|
||||
$args = func_get_args();
|
||||
return (call_user_func_array(array($this, 'parent::__construct'), $args));
|
||||
}
|
||||
|
||||
public function exec($args1)
|
||||
{
|
||||
$this->protocol();
|
||||
$args = func_get_args();
|
||||
return (call_user_func_array(array($this, 'parent::exec'), $args));
|
||||
}
|
||||
|
||||
public function query($statement, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
{
|
||||
$this->protocol();
|
||||
$args = func_get_args();
|
||||
return (call_user_func_array(array($this, 'parent::query'), $args));
|
||||
}
|
||||
|
||||
public function __call($method, $args)
|
||||
{
|
||||
print "__call(".var_export($method, true).", ".var_export($args, true).")\n";
|
||||
}
|
||||
|
||||
private function protocol()
|
||||
{
|
||||
$stack = debug_backtrace();
|
||||
if (!isset($stack[1]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
printf("%s(", $stack[1]['function']);
|
||||
$args = '';
|
||||
foreach ($stack[1]['args'] as $k => $v)
|
||||
{
|
||||
$args .= sprintf("%s, ", var_export($v, true));
|
||||
}
|
||||
if ($args != '')
|
||||
{
|
||||
printf("%s", substr($args, 0, -2));
|
||||
}
|
||||
printf(")\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Repro
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
function Repro()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Extend();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Repro();
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
__construct('%s', '%s', '%s')
|
||||
exec('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(%s) AND type in (N\'U\')) DROP TABLE %s')
|
||||
exec('CREATE TABLE %s (id INT)')
|
||||
exec('INSERT INTO %s (id) VALUES (1), (2)')
|
||||
query('SELECT * FROM %s ORDER BY id ASC')
|
||||
array(2) {
|
||||
[0]=>
|
||||
array(1) {
|
||||
["id"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
[1]=>
|
||||
array(1) {
|
||||
["id"]=>
|
||||
string(1) "2"
|
||||
}
|
||||
}
|
||||
bool(false)
|
||||
__call('intercept_call', array (
|
||||
))
|
||||
exec('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(%s) AND type in (N\'U\')) DROP TABLE %s')
|
||||
Test "PDO - Extension" completed successfully.
|
|
@ -5,7 +5,14 @@ Verification of capabilities for extending PDO.
|
|||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php require('skipif.inc'); ?>
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
die("skip Test designed for PHP 8.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
@ -61,7 +68,7 @@ class ExPDO extends PDO
|
|||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this))));
|
||||
|
|
152
test/functional/pdo_sqlsrv/PDO96_Extend3_p7.phpt
Normal file
152
test/functional/pdo_sqlsrv/PDO96_Extend3_p7.phpt
Normal file
|
@ -0,0 +1,152 @@
|
|||
--TEST--
|
||||
Extending PDO Test #2
|
||||
--DESCRIPTION--
|
||||
Verification of capabilities for extending PDO.
|
||||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
die("skip Test designed for PHP 7.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
||||
function Extend()
|
||||
{
|
||||
include 'MsSetup.inc';
|
||||
|
||||
$testName = "PDO - Extension";
|
||||
StartTest($testName);
|
||||
|
||||
$data = array( array('10', 'Abc', 'zxy'),
|
||||
array('20', 'Def', 'wvu'),
|
||||
array('30', 'Ghi', 'tsr'));
|
||||
|
||||
$conn1 = PDOConnect('ExPDO', $server, $uid, $pwd, true);
|
||||
var_dump(get_class($conn1));
|
||||
|
||||
// Prepare test table
|
||||
DropTable($conn1, $tableName);
|
||||
$conn1->exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))");
|
||||
$stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)");
|
||||
var_dump(get_class($stmt1));
|
||||
foreach ($data as $row)
|
||||
{
|
||||
$stmt1->execute($row);
|
||||
}
|
||||
unset($stmt1);
|
||||
|
||||
// Retrieve test data via a direct query
|
||||
$stmt1 = $conn1->query("SELECT * FROM [$tableName]");
|
||||
var_dump(get_class($stmt1));
|
||||
var_dump(get_class($stmt1->dbh));
|
||||
foreach($stmt1 as $obj)
|
||||
{
|
||||
var_dump($obj);
|
||||
}
|
||||
|
||||
echo "===DONE===\n";
|
||||
|
||||
// Cleanup
|
||||
DropTable($conn1, $tableName);
|
||||
$stmt1 = null;
|
||||
$conn1 = null;
|
||||
|
||||
EndTest($testName);
|
||||
}
|
||||
|
||||
class ExPDO extends PDO
|
||||
{
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this))));
|
||||
$stmt->setFetchMode(PDO::FETCH_ASSOC);
|
||||
$stmt->execute();
|
||||
return ($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
class ExPDOStatement extends PDOStatement
|
||||
{
|
||||
public $dbh;
|
||||
|
||||
protected function __construct($dbh)
|
||||
{
|
||||
$this->dbh = $dbh;
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Repro
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
function Repro()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Extend();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Repro();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
string(5) "ExPDO"
|
||||
string(12) "PDOStatement"
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
string(14) "ExPDOStatement"
|
||||
string(5) "ExPDO"
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "10"
|
||||
["val"]=>
|
||||
string(3) "Abc"
|
||||
["val2"]=>
|
||||
string(3) "zxy"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "20"
|
||||
["val"]=>
|
||||
string(3) "Def"
|
||||
["val2"]=>
|
||||
string(3) "wvu"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "30"
|
||||
["val"]=>
|
||||
string(3) "Ghi"
|
||||
["val2"]=>
|
||||
string(3) "tsr"
|
||||
}
|
||||
===DONE===
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::__destruct()
|
||||
Test "PDO - Extension" completed successfully.
|
|
@ -5,7 +5,14 @@ Verification of capabilities for extending PDO.
|
|||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php require('skipif.inc'); ?>
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
die("skip Test designed for PHP 8.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
@ -66,7 +73,7 @@ class ExPDO extends PDO
|
|||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this))));
|
||||
|
@ -91,10 +98,10 @@ class ExPDOStatement extends PDOStatement
|
|||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function execute($params = array())
|
||||
function execute(?array $params = null) : bool
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
parent::execute();
|
||||
return parent::execute();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
166
test/functional/pdo_sqlsrv/PDO97_Extend4_p7.phpt
Normal file
166
test/functional/pdo_sqlsrv/PDO97_Extend4_p7.phpt
Normal file
|
@ -0,0 +1,166 @@
|
|||
--TEST--
|
||||
Extending PDO Test #3
|
||||
--DESCRIPTION--
|
||||
Verification of capabilities for extending PDO.
|
||||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
die("skip Test designed for PHP 7.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
||||
function Extend()
|
||||
{
|
||||
include 'MsSetup.inc';
|
||||
|
||||
$testName = "PDO - Extension";
|
||||
StartTest($testName);
|
||||
|
||||
$data = array( array('10', 'Abc', 'zxy'),
|
||||
array('20', 'Def', 'wvu'),
|
||||
array('30', 'Ghi', 'tsr'));
|
||||
|
||||
$conn1 = PDOConnect('ExPDO', $server, $uid, $pwd, true);
|
||||
var_dump(get_class($conn1));
|
||||
|
||||
// Prepare test table
|
||||
DropTable($conn1, $tableName);
|
||||
$conn1->exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))");
|
||||
$stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)");
|
||||
var_dump(get_class($stmt1));
|
||||
foreach ($data as $row)
|
||||
{
|
||||
$stmt1->execute($row);
|
||||
}
|
||||
unset($stmt1);
|
||||
|
||||
echo "===QUERY===\n";
|
||||
|
||||
// Retrieve test data via a direct query
|
||||
$stmt1 = $conn1->query("SELECT * FROM [$tableName]");
|
||||
var_dump(get_class($stmt1));
|
||||
var_dump(get_class($stmt1->dbh));
|
||||
|
||||
echo "===FOREACH===\n";
|
||||
|
||||
foreach($stmt1 as $obj)
|
||||
{
|
||||
var_dump($obj);
|
||||
}
|
||||
|
||||
echo "===DONE===\n";
|
||||
|
||||
// Cleanup
|
||||
DropTable($conn1, $tableName);
|
||||
$stmt1 = null;
|
||||
$conn1 = null;
|
||||
|
||||
EndTest($testName);
|
||||
}
|
||||
|
||||
class ExPDO extends PDO
|
||||
{
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this))));
|
||||
$stmt->setFetchMode(PDO::FETCH_ASSOC);
|
||||
$stmt->execute();
|
||||
return ($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
class ExPDOStatement extends PDOStatement
|
||||
{
|
||||
public $dbh;
|
||||
|
||||
protected function __construct($dbh)
|
||||
{
|
||||
$this->dbh = $dbh;
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function execute($params = array())
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
parent::execute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Repro
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
function Repro()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Extend();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Repro();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
string(5) "ExPDO"
|
||||
string(12) "PDOStatement"
|
||||
===QUERY===
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
ExPDOStatement::execute()
|
||||
string(14) "ExPDOStatement"
|
||||
string(5) "ExPDO"
|
||||
===FOREACH===
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "10"
|
||||
["val"]=>
|
||||
string(3) "Abc"
|
||||
["val2"]=>
|
||||
string(3) "zxy"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "20"
|
||||
["val"]=>
|
||||
string(3) "Def"
|
||||
["val2"]=>
|
||||
string(3) "wvu"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "30"
|
||||
["val"]=>
|
||||
string(3) "Ghi"
|
||||
["val2"]=>
|
||||
string(3) "tsr"
|
||||
}
|
||||
===DONE===
|
||||
ExPDOStatement::__destruct()
|
||||
ExPDO::__destruct()
|
||||
Test "PDO - Extension" completed successfully.
|
|
@ -5,7 +5,14 @@ Verification of capabilities for extending PDO.
|
|||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php require('skipif.inc'); ?>
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
die("skip Test designed for PHP 8.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
@ -69,7 +76,7 @@ class ExPDO extends PDO
|
|||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = parent::query($sql);
|
||||
|
@ -93,10 +100,10 @@ class ExPDOStatement extends PDOStatement
|
|||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function execute($params = array())
|
||||
function execute(?array $params = null) : bool
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
parent::execute();
|
||||
return parent::execute();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
181
test/functional/pdo_sqlsrv/PDO98_Extend5_p7.phpt
Normal file
181
test/functional/pdo_sqlsrv/PDO98_Extend5_p7.phpt
Normal file
|
@ -0,0 +1,181 @@
|
|||
--TEST--
|
||||
Extending PDO Test #4
|
||||
--DESCRIPTION--
|
||||
Verification of capabilities for extending PDO.
|
||||
--ENV--
|
||||
PHPT_EXEC=true
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("pdo_sqlsrv")) {
|
||||
die("skip Extension not loaded");
|
||||
}
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
die("skip Test designed for PHP 7.*");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'MsCommon.inc';
|
||||
|
||||
function Extend()
|
||||
{
|
||||
include 'MsSetup.inc';
|
||||
|
||||
$testName = "PDO - Extension";
|
||||
StartTest($testName);
|
||||
|
||||
$data = array( array('10', 'Abc', 'zxy'),
|
||||
array('20', 'Def', 'wvu'),
|
||||
array('30', 'Ghi', 'tsr'));
|
||||
|
||||
$conn1 = PDOConnect('ExPDO', $server, $uid, $pwd, true);
|
||||
var_dump(get_class($conn1));
|
||||
|
||||
// Prepare test table
|
||||
DropTable($conn1, $tableName);
|
||||
$conn1->exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))");
|
||||
$stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)");
|
||||
var_dump(get_class($stmt1));
|
||||
foreach ($data as $row)
|
||||
{
|
||||
$stmt1->execute($row);
|
||||
}
|
||||
unset($stmt1);
|
||||
|
||||
echo "===QUERY===\n";
|
||||
|
||||
// Retrieve test data via a direct query
|
||||
var_dump($conn1->getAttribute(PDO::ATTR_STATEMENT_CLASS));
|
||||
$conn1->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('ExPDOStatement', array($conn1)));
|
||||
var_dump($conn1->getAttribute(PDO::ATTR_STATEMENT_CLASS));
|
||||
$stmt1 = $conn1->query("SELECT * FROM [$tableName]");
|
||||
var_dump(get_class($stmt1));
|
||||
var_dump(get_class($stmt1->dbh));
|
||||
|
||||
echo "===FOREACH===\n";
|
||||
|
||||
foreach($stmt1 as $obj)
|
||||
{
|
||||
var_dump($obj);
|
||||
}
|
||||
|
||||
echo "===DONE===\n";
|
||||
|
||||
// Cleanup
|
||||
DropTable($conn1, $tableName);
|
||||
$stmt1 = null;
|
||||
$conn1 = null;
|
||||
|
||||
EndTest($testName);
|
||||
}
|
||||
|
||||
class ExPDO extends PDO
|
||||
{
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args)
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
$stmt = parent::query($sql);
|
||||
return ($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
class ExPDOStatement extends PDOStatement
|
||||
{
|
||||
public $dbh;
|
||||
|
||||
protected function __construct($dbh)
|
||||
{
|
||||
$this->dbh = $dbh;
|
||||
$this->setFetchMode(PDO::FETCH_ASSOC);
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function execute($params = array())
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
parent::execute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Repro
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
function Repro()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Extend();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Repro();
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
string(5) "ExPDO"
|
||||
string(12) "PDOStatement"
|
||||
===QUERY===
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(12) "PDOStatement"
|
||||
}
|
||||
array(2) {
|
||||
[0]=>
|
||||
string(14) "ExPDOStatement"
|
||||
[1]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
object(ExPDO)#%d (0) {
|
||||
}
|
||||
}
|
||||
}
|
||||
ExPDO::query()
|
||||
ExPDOStatement::__construct()
|
||||
string(14) "ExPDOStatement"
|
||||
string(5) "ExPDO"
|
||||
===FOREACH===
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "10"
|
||||
["val"]=>
|
||||
string(3) "Abc"
|
||||
["val2"]=>
|
||||
string(3) "zxy"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "20"
|
||||
["val"]=>
|
||||
string(3) "Def"
|
||||
["val2"]=>
|
||||
string(3) "wvu"
|
||||
}
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(2) "30"
|
||||
["val"]=>
|
||||
string(3) "Ghi"
|
||||
["val2"]=>
|
||||
string(3) "tsr"
|
||||
}
|
||||
===DONE===
|
||||
ExPDOStatement::__destruct()
|
||||
Test "PDO - Extension" completed successfully.
|
||||
ExPDO::__destruct()
|
Loading…
Reference in a new issue