pdo_030.phpt 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. --TEST--
  2. PDO Common: extending PDO (4)
  3. --EXTENSIONS--
  4. pdo
  5. --SKIPIF--
  6. <?php
  7. $dir = getenv('REDIR_TEST_DIR');
  8. if (false == $dir) die('skip no driver');
  9. require_once $dir . 'pdo_test.inc';
  10. PDOTest::skip();
  11. ?>
  12. --FILE--
  13. <?php
  14. if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
  15. require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
  16. $data = array(
  17. array('10', 'Abc', 'zxy'),
  18. array('20', 'Def', 'wvu'),
  19. array('30', 'Ghi', 'tsr'),
  20. );
  21. class PDOStatementX extends PDOStatement
  22. {
  23. public $dbh;
  24. protected function __construct($dbh)
  25. {
  26. $this->dbh = $dbh;
  27. $this->setFetchMode(PDO::FETCH_ASSOC);
  28. echo __METHOD__ . "()\n";
  29. }
  30. function __destruct()
  31. {
  32. echo __METHOD__ . "()\n";
  33. }
  34. function execute($params = array()): bool
  35. {
  36. echo __METHOD__ . "()\n";
  37. parent::execute();
  38. }
  39. }
  40. class PDODatabase extends PDO
  41. {
  42. function __destruct()
  43. {
  44. echo __METHOD__ . "()\n";
  45. }
  46. function query($sql, ...$rest): PDOStatement|false
  47. {
  48. echo __METHOD__ . "()\n";
  49. return parent::query($sql);
  50. }
  51. }
  52. $db = PDOTest::factory('PDODatabase');
  53. var_dump(get_class($db));
  54. $db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))');
  55. $stmt = $db->prepare("INSERT INTO test VALUES(?, ?, ?)");
  56. var_dump(get_class($stmt));
  57. foreach ($data as $row) {
  58. $stmt->execute($row);
  59. }
  60. unset($stmt);
  61. echo "===QUERY===\n";
  62. var_dump($db->getAttribute(PDO::ATTR_STATEMENT_CLASS));
  63. $db->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementx', array($db)));
  64. var_dump($db->getAttribute(PDO::ATTR_STATEMENT_CLASS));
  65. $stmt = $db->query('SELECT * FROM test');
  66. var_dump(get_class($stmt));
  67. var_dump(get_class($stmt->dbh));
  68. echo "===FOREACH===\n";
  69. foreach($stmt as $obj) {
  70. var_dump($obj);
  71. }
  72. echo "===DONE===\n";
  73. exit(0);
  74. ?>
  75. --EXPECTF--
  76. string(11) "PDODatabase"
  77. string(12) "PDOStatement"
  78. ===QUERY===
  79. array(1) {
  80. [0]=>
  81. string(12) "PDOStatement"
  82. }
  83. array(2) {
  84. [0]=>
  85. string(13) "PDOStatementX"
  86. [1]=>
  87. array(1) {
  88. [0]=>
  89. object(PDODatabase)#%d (0) {
  90. }
  91. }
  92. }
  93. PDODatabase::query()
  94. PDOStatementX::__construct()
  95. string(13) "PDOStatementX"
  96. string(11) "PDODatabase"
  97. ===FOREACH===
  98. array(3) {
  99. ["id"]=>
  100. string(2) "10"
  101. ["val"]=>
  102. string(3) "Abc"
  103. ["val2"]=>
  104. string(3) "zxy"
  105. }
  106. array(3) {
  107. ["id"]=>
  108. string(2) "20"
  109. ["val"]=>
  110. string(3) "Def"
  111. ["val2"]=>
  112. string(3) "wvu"
  113. }
  114. array(3) {
  115. ["id"]=>
  116. string(2) "30"
  117. ["val"]=>
  118. string(3) "Ghi"
  119. ["val2"]=>
  120. string(3) "tsr"
  121. }
  122. ===DONE===
  123. PDOStatementX::__destruct()
  124. PDODatabase::__destruct()