pdo_029.phpt 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. --TEST--
  2. PDO Common: extending PDO (3)
  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. echo __METHOD__ . "()\n";
  28. }
  29. function __destruct()
  30. {
  31. echo __METHOD__ . "()\n";
  32. }
  33. function execute($params = array()): bool
  34. {
  35. echo __METHOD__ . "()\n";
  36. return parent::execute();
  37. }
  38. }
  39. class PDODatabase extends PDO
  40. {
  41. function __destruct()
  42. {
  43. echo __METHOD__ . "()\n";
  44. }
  45. function query($sql, ...$rest): PDOStatement|false
  46. {
  47. echo __METHOD__ . "()\n";
  48. $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('PDOStatementx', array($this))));
  49. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  50. $stmt->execute();
  51. return $stmt;
  52. }
  53. }
  54. $db = PDOTest::factory('PDODatabase');
  55. var_dump(get_class($db));
  56. $db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))');
  57. $stmt = $db->prepare("INSERT INTO test VALUES(?, ?, ?)");
  58. var_dump(get_class($stmt));
  59. foreach ($data as $row) {
  60. $stmt->execute($row);
  61. }
  62. unset($stmt);
  63. echo "===QUERY===\n";
  64. $stmt = $db->query('SELECT * FROM test');
  65. var_dump(get_class($stmt));
  66. var_dump(get_class($stmt->dbh));
  67. echo "===FOREACH===\n";
  68. foreach($stmt as $obj) {
  69. var_dump($obj);
  70. }
  71. echo "===DONE===\n";
  72. exit(0);
  73. ?>
  74. --EXPECT--
  75. string(11) "PDODatabase"
  76. string(12) "PDOStatement"
  77. ===QUERY===
  78. PDODatabase::query()
  79. PDOStatementX::__construct()
  80. PDOStatementX::execute()
  81. string(13) "PDOStatementX"
  82. string(11) "PDODatabase"
  83. ===FOREACH===
  84. array(3) {
  85. ["id"]=>
  86. string(2) "10"
  87. ["val"]=>
  88. string(3) "Abc"
  89. ["val2"]=>
  90. string(3) "zxy"
  91. }
  92. array(3) {
  93. ["id"]=>
  94. string(2) "20"
  95. ["val"]=>
  96. string(3) "Def"
  97. ["val2"]=>
  98. string(3) "wvu"
  99. }
  100. array(3) {
  101. ["id"]=>
  102. string(2) "30"
  103. ["val"]=>
  104. string(3) "Ghi"
  105. ["val2"]=>
  106. string(3) "tsr"
  107. }
  108. ===DONE===
  109. PDOStatementX::__destruct()
  110. PDODatabase::__destruct()