From: Marcus Boerger Date: Wed, 21 Sep 2005 22:58:39 +0000 (+0000) Subject: - MFH Fixed Bug #34590 User defined PDOStatement class can't implement X-Git-Tag: php-5.1.0RC2~203 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3c44f6065959cb3ceac7b010eb216078cf24b47;p=php - MFH Fixed Bug #34590 User defined PDOStatement class can't implement methods - Reimplement Traversable interface # If there is a problem with this i need a backtrace. As far as i can # tell by gdb/valgrind/logic there is no error here. But missuse leads to # the same error report casing the exclusion of interface Traversable. --- diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index ef44b8aeba..f01fe279b7 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -1951,7 +1951,7 @@ static union _zend_function *dbstmt_method_get( lc_method_name = emalloc(method_len + 1); zend_str_tolower_copy(lc_method_name, method_name, method_len); - if (zend_hash_find(&pdo_dbstmt_ce->function_table, lc_method_name, + if (zend_hash_find(&Z_OBJCE_P(object)->function_table, 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 @@ -1992,9 +1992,7 @@ void pdo_stmt_init(TSRMLS_D) pdo_dbstmt_ce = zend_register_internal_class(&ce TSRMLS_CC); pdo_dbstmt_ce->get_iterator = pdo_stmt_iter_get; pdo_dbstmt_ce->create_object = pdo_dbstmt_new; -#if no_crazy_hidden_deps_on_other_interfaces zend_class_implements(pdo_dbstmt_ce TSRMLS_CC, 1, zend_ce_traversable); -#endif zend_declare_property_null(pdo_dbstmt_ce, "queryString", sizeof("queryString")-1, ZEND_ACC_PUBLIC TSRMLS_CC); memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); 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()