felipe                                   Sun, 15 Nov 2009 16:20:37 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=290786

Log:
- Fixed bug #49521 (PDO fetchObject sets values before calling constructor)
  (patch by Pierrick)

Bug: http://bugs.php.net/49521 (Assigned) PDO fetchObject sets values before 
calling constructor
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/ext/pdo/pdo_stmt.c
    U   php/php-src/branches/PHP_5_2/ext/pdo/tests/pdo_005.phpt
    A   php/php-src/branches/PHP_5_2/ext/pdo_sqlite/tests/bug49521.phpt
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c
    U   php/php-src/branches/PHP_5_3/ext/pdo/tests/pdo_005.phpt
    U   
php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
    A   php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/bug49521.phpt
    U   php/php-src/trunk/ext/pdo/pdo_stmt.c
    U   php/php-src/trunk/ext/pdo/tests/pdo_005.phpt
    U   php/php-src/trunk/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
    A   php/php-src/trunk/ext/pdo_sqlite/tests/bug49521.phpt

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_2/NEWS	2009-11-15 16:20:37 UTC (rev 290786)
@@ -2,6 +2,8 @@
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Nov 2009, PHP 5.2.12RC2
 - Fixed bug #50174 (Incorrectly matched docComment). (Felipe)
+- Fixed bug #49521 (PDO fetchObject sets values before calling constructor).
+  (Pierrick)

 12 Nov 2009, PHP 5.2.12RC1
 - Updated timezone database to version 2009.18 (2009r). (Derick)

Modified: php/php-src/branches/PHP_5_2/ext/pdo/pdo_stmt.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/pdo/pdo_stmt.c	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_2/ext/pdo/pdo_stmt.c	2009-11-15 16:20:37 UTC (rev 290786)
@@ -1102,6 +1102,32 @@
 			}
 		}

+		switch (how) {
+			case PDO_FETCH_CLASS:
+				if (ce->constructor && !(flags & PDO_FETCH_PROPS_LATE)) {
+					stmt->fetch.cls.fci.object_pp = &return_value;
+					stmt->fetch.cls.fcc.object_pp = &return_value;
+					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
+						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
+						return 0;
+					} else {
+						if (stmt->fetch.cls.retval_ptr) {
+							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
+						}
+					}
+				}
+				if (flags & PDO_FETCH_CLASSTYPE) {
+					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
+					stmt->fetch.cls.ce = old_ce;
+					stmt->fetch.cls.ctor_args = old_ctor_args;
+					stmt->fetch.cls.fci.param_count = old_arg_count;
+				}
+				break;
+
+			default:
+				break;
+		}
+
 		for (idx = 0; i < stmt->column_count; i++, idx++) {
 			zval *val;
 			MAKE_STD_ZVAL(val);
@@ -1235,27 +1261,6 @@
 		}

 		switch (how) {
-			case PDO_FETCH_CLASS:
-				if (ce->constructor && !(flags & PDO_FETCH_PROPS_LATE)) {
-					stmt->fetch.cls.fci.object_pp = &return_value;
-					stmt->fetch.cls.fcc.object_pp = &return_value;
-					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
-						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
-						return 0;
-					} else {
-						if (stmt->fetch.cls.retval_ptr) {
-							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
-						}
-					}
-				}
-				if (flags & PDO_FETCH_CLASSTYPE) {
-					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
-					stmt->fetch.cls.ce = old_ce;
-					stmt->fetch.cls.ctor_args = old_ctor_args;
-					stmt->fetch.cls.fci.param_count = old_arg_count;
-				}
-				break;
-
 			case PDO_FETCH_FUNC:
 				stmt->fetch.func.fci.param_count = idx;
 				stmt->fetch.func.fci.retval_ptr_ptr = &retval;

Modified: php/php-src/branches/PHP_5_2/ext/pdo/tests/pdo_005.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_2/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -34,7 +34,7 @@

 	public function __construct(&$row)
 	{
-		echo __METHOD__ . "($row,{$this->id})\n";
+		echo __METHOD__ . "($row)\n";
 		$this->row = $row++;
 	}
 }
@@ -108,9 +108,9 @@
     string(2) "CC"
   }
 }
-TestDerived::__construct(0,1)
-TestDerived::__construct(1,2)
-TestDerived::__construct(2,3)
+TestDerived::__construct(0)
+TestDerived::__construct(1)
+TestDerived::__construct(2)
 array(3) {
   [0]=>
   object(TestDerived)#%d (5) {

Added: php/php-src/branches/PHP_5_2/ext/pdo_sqlite/tests/bug49521.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/pdo_sqlite/tests/bug49521.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_2/ext/pdo_sqlite/tests/bug49521.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -0,0 +1,39 @@
+--TEST--
+Bug #49521 (PDO fetchObject sets values before calling constructor)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) die ("skip Need PDO_SQlite support");
+?>
+--FILE--
+<?php
+
+class Book {
+    public $title = 'test';
+    public $author;
+
+	public function __construct($x) {
+		$this->title = '';
+		echo __METHOD__,"\n";
+	}
+	public function __set($a, $b) {
+		echo __METHOD__,"\n";
+		var_dump($a);
+	}
+}
+
+$pdo = new PDO('sqlite::memory:');
+$pdo->exec('CREATE TABLE book(title,author)');
+$pdo->exec('INSERT INTO book VALUES ("PHP","Rasmus")');
+$statement = $pdo->prepare('SELECT * FROM book WHERE title="PHP"');
+$statement->execute();
+var_dump($statement->fetchObject('Book', array(1)));
+
+?>
+--EXPECTF--
+Book::__construct
+object(Book)#%d (2) {
+  [%u|b%"title"]=>
+  string(3) "PHP"
+  [%u|b%"author"]=>
+  string(6) "Rasmus"
+}


Property changes on: php/php-src/branches/PHP_5_2/ext/pdo_sqlite/tests/bug49521.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_3/NEWS	2009-11-15 16:20:37 UTC (rev 290786)
@@ -47,6 +47,8 @@
 - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private
   property in base class). (Felipe)
 - Fixed bug #49647 (DOMUserData does not exist). (Rob)
+- Fixed bug #49521 (PDO fetchObject sets values before calling constructor).
+  (Pierrick)
 - Fixed bug #49244 (Floating point NaN cause garbage characters). (Sjoerd)
 - Fixed bug #49224 (Compile error due to old DNS functions on AIX systems).
   (Scott)

Modified: php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c	2009-11-15 16:20:37 UTC (rev 290786)
@@ -1106,6 +1106,32 @@
 			}
 		}

+		switch (how) {
+			case PDO_FETCH_CLASS:
+				if (ce->constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE))) {
+					stmt->fetch.cls.fci.object_ptr = return_value;
+					stmt->fetch.cls.fcc.object_ptr = return_value;
+					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
+						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
+						return 0;
+					} else {
+						if (stmt->fetch.cls.retval_ptr) {
+							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
+						}
+					}
+				}
+				if (flags & PDO_FETCH_CLASSTYPE) {
+					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
+					stmt->fetch.cls.ce = old_ce;
+					stmt->fetch.cls.ctor_args = old_ctor_args;
+					stmt->fetch.cls.fci.param_count = old_arg_count;
+				}
+				break;
+
+			default:
+				break;
+		}
+
 		for (idx = 0; i < stmt->column_count; i++, idx++) {
 			zval *val;
 			MAKE_STD_ZVAL(val);
@@ -1239,27 +1265,6 @@
 		}

 		switch (how) {
-			case PDO_FETCH_CLASS:
-				if (ce->constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE))) {
-					stmt->fetch.cls.fci.object_ptr = return_value;
-					stmt->fetch.cls.fcc.object_ptr = return_value;
-					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
-						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
-						return 0;
-					} else {
-						if (stmt->fetch.cls.retval_ptr) {
-							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
-						}
-					}
-				}
-				if (flags & PDO_FETCH_CLASSTYPE) {
-					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
-					stmt->fetch.cls.ce = old_ce;
-					stmt->fetch.cls.ctor_args = old_ctor_args;
-					stmt->fetch.cls.fci.param_count = old_arg_count;
-				}
-				break;
-
 			case PDO_FETCH_FUNC:
 				stmt->fetch.func.fci.param_count = idx;
 				stmt->fetch.func.fci.retval_ptr_ptr = &retval;

Modified: php/php-src/branches/PHP_5_3/ext/pdo/tests/pdo_005.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_3/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -34,7 +34,7 @@

 	public function __construct(&$row)
 	{
-		echo __METHOD__ . "($row,{$this->id})\n";
+		echo __METHOD__ . "($row)\n";
 		$this->row = $row++;
 	}
 }
@@ -108,9 +108,9 @@
     string(2) "CC"
   }
 }
-TestDerived::__construct(0,1)
-TestDerived::__construct(1,2)
-TestDerived::__construct(2,3)
+TestDerived::__construct(0)
+TestDerived::__construct(1)
+TestDerived::__construct(2)
 array(3) {
   [0]=>
   object(TestDerived)#%d (5) {
@@ -151,4 +151,4 @@
     ["val2"]=>
     string(2) "CC"
   }
-}
\ No newline at end of file
+}

Modified: php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -71,21 +71,21 @@
 MySQLPDOTest::dropTestTable();
 ?>
 --EXPECTF--
+myclass::__construct(0, 1): 0 / 0
 myclass::__set(id, -'1'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(0, 1): 4 / 4
+myclass::__construct(1, 2): 4 / 0
 myclass::__set(id, -'2'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(1, 2): 8 / 4
+myclass::__construct(2, 3): 8 / 0
 myclass::__set(id, -'3'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(2, 3): 12 / 4
 object(myclass)#%d (4) {
   [%u|b%"set_calls":"myclass":private]=>
   int(4)
@@ -96,4 +96,4 @@
   [%u|b%"null"]=>
   NULL
 }
-done!
\ No newline at end of file
+done!

Added: php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/bug49521.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/bug49521.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/bug49521.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -0,0 +1,39 @@
+--TEST--
+Bug #49521 (PDO fetchObject sets values before calling constructor)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) die ("skip Need PDO_SQlite support");
+?>
+--FILE--
+<?php
+
+class Book {
+    public $title = 'test';
+    public $author;
+
+	public function __construct($x) {
+		$this->title = '';
+		echo __METHOD__,"\n";
+	}
+	public function __set($a, $b) {
+		echo __METHOD__,"\n";
+		var_dump($a);
+	}
+}
+
+$pdo = new PDO('sqlite::memory:');
+$pdo->exec('CREATE TABLE book(title,author)');
+$pdo->exec('INSERT INTO book VALUES ("PHP","Rasmus")');
+$statement = $pdo->prepare('SELECT * FROM book WHERE title="PHP"');
+$statement->execute();
+var_dump($statement->fetchObject('Book', array(1)));
+
+?>
+--EXPECTF--
+Book::__construct
+object(Book)#%d (2) {
+  [%u|b%"title"]=>
+  string(3) "PHP"
+  [%u|b%"author"]=>
+  string(6) "Rasmus"
+}


Property changes on: php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/bug49521.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/ext/pdo/pdo_stmt.c
===================================================================
--- php/php-src/trunk/ext/pdo/pdo_stmt.c	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/trunk/ext/pdo/pdo_stmt.c	2009-11-15 16:20:37 UTC (rev 290786)
@@ -1107,6 +1107,32 @@
 			}
 		}

+		switch (how) {
+			case PDO_FETCH_CLASS:
+				if (ce->constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE))) {
+					stmt->fetch.cls.fci.object_ptr = return_value;
+					stmt->fetch.cls.fcc.object_ptr = return_value;
+					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
+						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
+						return 0;
+					} else {
+						if (stmt->fetch.cls.retval_ptr) {
+							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
+						}
+					}
+				}
+				if (flags & PDO_FETCH_CLASSTYPE) {
+					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
+					stmt->fetch.cls.ce = old_ce;
+					stmt->fetch.cls.ctor_args = old_ctor_args;
+					stmt->fetch.cls.fci.param_count = old_arg_count;
+				}
+				break;
+
+			default:
+				break;
+		}
+
 		for (idx = 0; i < stmt->column_count; i++, idx++) {
 			zval *val;
 			MAKE_STD_ZVAL(val);
@@ -1245,27 +1271,6 @@
 		}

 		switch (how) {
-			case PDO_FETCH_CLASS:
-				if (ce->constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE))) {
-					stmt->fetch.cls.fci.object_ptr = return_value;
-					stmt->fetch.cls.fcc.object_ptr = return_value;
-					if (zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == FAILURE) {
-						pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class constructor" TSRMLS_CC);
-						return 0;
-					} else {
-						if (stmt->fetch.cls.retval_ptr) {
-							zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
-						}
-					}
-				}
-				if (flags & PDO_FETCH_CLASSTYPE) {
-					do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
-					stmt->fetch.cls.ce = old_ce;
-					stmt->fetch.cls.ctor_args = old_ctor_args;
-					stmt->fetch.cls.fci.param_count = old_arg_count;
-				}
-				break;
-
 			case PDO_FETCH_FUNC:
 				stmt->fetch.func.fci.param_count = idx;
 				stmt->fetch.func.fci.retval_ptr_ptr = &retval;

Modified: php/php-src/trunk/ext/pdo/tests/pdo_005.phpt
===================================================================
--- php/php-src/trunk/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/trunk/ext/pdo/tests/pdo_005.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -34,7 +34,7 @@

 	public function __construct(&$row)
 	{
-		echo __METHOD__ . "($row,{$this->id})\n";
+		echo __METHOD__ . "($row)\n";
 		$this->row = $row++;
 	}
 }
@@ -108,9 +108,9 @@
     unicode(2) "CC"
   }
 }
-TestDerived::__construct(0,1)
-TestDerived::__construct(1,2)
-TestDerived::__construct(2,3)
+TestDerived::__construct(0)
+TestDerived::__construct(1)
+TestDerived::__construct(2)
 array(3) {
   [0]=>
   object(TestDerived)#%d (5) {

Modified: php/php-src/trunk/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
===================================================================
--- php/php-src/trunk/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt	2009-11-15 16:16:26 UTC (rev 290785)
+++ php/php-src/trunk/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -71,21 +71,21 @@
 MySQLPDOTest::dropTestTable();
 ?>
 --EXPECTF--
+myclass::__construct(0, 1): 0 / 0
 myclass::__set(id, -'1'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(0, 1): 4 / 4
+myclass::__construct(1, 2): 4 / 0
 myclass::__set(id, -'2'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(1, 2): 8 / 4
+myclass::__construct(2, 3): 8 / 0
 myclass::__set(id, -'3'-) 1
 myclass::__set(, -''-) 2
 myclass::__set(null, -NULL-) 3
 myclass::__set(, -''-) 4
-myclass::__construct(2, 3): 12 / 4
 object(myclass)#%d (4) {
   [%u|b%"set_calls":"myclass":private]=>
   int(4)
@@ -96,4 +96,4 @@
   [%u|b%"null"]=>
   NULL
 }
-done!
\ No newline at end of file
+done!

Added: php/php-src/trunk/ext/pdo_sqlite/tests/bug49521.phpt
===================================================================
--- php/php-src/trunk/ext/pdo_sqlite/tests/bug49521.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/pdo_sqlite/tests/bug49521.phpt	2009-11-15 16:20:37 UTC (rev 290786)
@@ -0,0 +1,39 @@
+--TEST--
+Bug #49521 (PDO fetchObject sets values before calling constructor)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) die ("skip Need PDO_SQlite support");
+?>
+--FILE--
+<?php
+
+class Book {
+    public $title = 'test';
+    public $author;
+
+	public function __construct($x) {
+		$this->title = '';
+		echo __METHOD__,"\n";
+	}
+	public function __set($a, $b) {
+		echo __METHOD__,"\n";
+		var_dump($a);
+	}
+}
+
+$pdo = new PDO('sqlite::memory:');
+$pdo->exec('CREATE TABLE book(title,author)');
+$pdo->exec('INSERT INTO book VALUES ("PHP","Rasmus")');
+$statement = $pdo->prepare('SELECT * FROM book WHERE title="PHP"');
+$statement->execute();
+var_dump($statement->fetchObject('Book', array(1)));
+
+?>
+--EXPECTF--
+Book::__construct
+object(Book)#%d (2) {
+  [%u|b%"title"]=>
+  string(3) "PHP"
+  [%u|b%"author"]=>
+  string(6) "Rasmus"
+}


Property changes on: php/php-src/trunk/ext/pdo_sqlite/tests/bug49521.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to