From: Marcus Boerger Date: Wed, 21 Sep 2005 22:53:50 +0000 (+0000) Subject: - Fixed Bug #34590 User defined PDOStatement class can't implement methods X-Git-Tag: RELEASE_0_9_0~149 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a28c82fceb8ca5f1093a82adaf4bf4e32ccded76;p=php - Fixed Bug #34590 User defined PDOStatement class can't implement methods --- diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index be8ff2ee71..4c091996ec 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -1948,7 +1948,7 @@ static union _zend_function *dbstmt_method_get( lc_method_name = zend_u_str_tolower_dup(ztype, method_name, method_len); - if (zend_u_hash_find(&U_CLASS_ENTRY(pdo_dbstmt_ce)->function_table, ztype, lc_method_name, + if (zend_u_hash_find(&Z_OBJCE_P(object)->function_table, ztype, lc_method_name, method_len+1, (void**)&fbc) == FAILURE) { pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(object TSRMLS_CC); /* not a pre-defined method, nor a user-defined method; check diff --git a/ext/pdo/tests/pdo_029.phpt b/ext/pdo/tests/pdo_029.phpt new file mode 100755 index 0000000000..c2663b1eee --- /dev/null +++ b/ext/pdo/tests/pdo_029.phpt @@ -0,0 +1,125 @@ +--TEST-- +PDO Common: extending PDO (3) +--SKIPIF-- + +--FILE-- +dbh = $dbh; + echo __METHOD__ . "()\n"; + } + + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function execute() + { + echo __METHOD__ . "()\n"; + parent::execute(); + } +} + +class PDODatabase extends PDO +{ + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function query($sql) + { + echo __METHOD__ . "()\n"; + $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('PDOStatementx', array($this)))); + $stmt->setFetchMode(PDO::FETCH_ASSOC); + $stmt->execute(); + return $stmt; + } +} + +$db = PDOTest::factory('PDODatabase'); +var_dump(get_class($db)); + +$db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))'); + +$stmt = $db->prepare("INSERT INTO test VALUES(?, ?, ?)"); +var_dump(get_class($stmt)); +foreach ($data as $row) { + $stmt->execute($row); +} + +unset($stmt); + +echo "===QUERY===\n"; + +$stmt = $db->query('SELECT * FROM test'); +var_dump(get_class($stmt)); +var_dump(get_class($stmt->dbh)); + +echo "===FOREACH===\n"; + +foreach($stmt as $obj) { + var_dump($obj); +} + +echo "===DONE===\n"; +exit(0); +?> +--EXPECT-- +string(11) "PDODatabase" +string(12) "PDOStatement" +===QUERY=== +PDODatabase::query() +PDOStatementX::__construct() +PDOStatementX::execute() +string(13) "PDOStatementX" +string(11) "PDODatabase" +===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=== +PDODatabase::__destruct() +PDOStatementX::__destruct()