diff options
author | Anatol Belski <ab@php.net> | 2016-05-09 17:29:56 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2016-05-09 17:29:56 +0200 |
commit | 148fa6bb440ece5060cee34fb23312c7e7e20a86 (patch) | |
tree | 90b99f81614f0cb7787926d1e0ee4a662ff3c057 /ext/mysqli | |
parent | 7b65346b669d294283e37cb59bfa4fc3b17903c4 (diff) | |
parent | fc2a45b70a6675cad627cfe6341dc77d61952ba4 (diff) | |
download | php-git-148fa6bb440ece5060cee34fb23312c7e7e20a86.tar.gz |
Merge branch 'PHP-7.0'
* PHP-7.0:
Revert "Fixed bug #71820 pg_fetch_object bind parameters before call constructor"
Revert "Backport patch for bug #71820"
Diffstat (limited to 'ext/mysqli')
-rw-r--r-- | ext/mysqli/mysqli.c | 25 | ||||
-rw-r--r-- | ext/mysqli/tests/bug71820.phpt | 104 |
2 files changed, 4 insertions, 125 deletions
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index a907eed42f..8653f99c99 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -1271,13 +1271,15 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags zval dataset, retval; zend_fcall_info fci; zend_fcall_info_cache fcc; - zend_bool props_handled = 0; ZVAL_COPY_VALUE(&dataset, return_value); + object_and_properties_init(return_value, ce, NULL); if (!ce->default_properties_count && !ce->__set) { Z_OBJ_P(return_value)->properties = Z_ARR(dataset); - props_handled = 1; + } else { + zend_merge_properties(return_value, Z_ARRVAL(dataset)); + zval_ptr_dtor(&dataset); } if (ce->constructor) { @@ -1297,9 +1299,6 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags * single value is an array. Also we'd have to make that one * argument passed by reference. */ - if (!props_handled) { - zval_ptr_dtor(&dataset); - } zend_throw_exception(zend_ce_exception, "Parameter ctor_params must be an array", 0); return; } @@ -1312,14 +1311,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags fcc.object = Z_OBJ_P(return_value); if (zend_call_function(&fci, &fcc) == FAILURE) { - if (fci.params) { - efree(fci.params); - } - if (!props_handled) { - zval_ptr_dtor(&dataset); - } zend_throw_exception_ex(zend_ce_exception, 0, "Could not execute %s::%s()", ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name)); - return; } else { zval_ptr_dtor(&retval); } @@ -1327,16 +1319,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags efree(fci.params); } } else if (ctor_params) { - if (!props_handled) { - zval_ptr_dtor(&dataset); - } zend_throw_exception_ex(zend_ce_exception, 0, "Class %s does not have a constructor hence you cannot use ctor_params", ZSTR_VAL(ce->name)); - return; - } - - if (!props_handled) { - zend_merge_properties(return_value, Z_ARRVAL(dataset)); - zval_ptr_dtor(&dataset); } } } diff --git a/ext/mysqli/tests/bug71820.phpt b/ext/mysqli/tests/bug71820.phpt deleted file mode 100644 index 02a25939e2..0000000000 --- a/ext/mysqli/tests/bug71820.phpt +++ /dev/null @@ -1,104 +0,0 @@ ---TEST-- -Bug #71820 __set has to be called after constructor, mysqli part ---SKIPIF-- -<?php -require_once('skipif.inc'); -require_once('skipifconnectfailure.inc'); -require_once("connect.inc"); -?> ---FILE-- -<?php - -include "connect.inc"; - -$tableName = 'test_mysqli_fetch_object'; - -class TestRow -{ - - private $set_from_constructor; - private $data; - private $hello = "world"; - - public function __construct($set_from_constructor) - { - $this->set_from_constructor = $set_from_constructor; - } - - public function __set($name, $value) - { - if (!isset($this->data[$name])) { - /* $this->set_from_constructor has an expected value */ - $this->data[$name] = 42 == $this->set_from_constructor ? $value : -1; - return; - } - throw new \Exception('Duplicity column name.'); - } - -} - - -if (!($connection = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))) { - printf("[001] Cannot connect to the server"); -} - -$rc = mysqli_query($connection, "DROP TABLE IF EXISTS $tableName"); -if (!$rc) - printf("[002] [%d] %s\n", mysqli_errno($connection), mysqli_error($connection)); - -$table = <<<SQL -CREATE TABLE $tableName ( - id int NOT NULL auto_increment primary key, - name varchar(255) NOT NULL -); -SQL; - -$rc = mysqli_query($connection, $table); -if (!$rc) - printf("[003] [%d] %s\n", mysqli_errno($connection), mysqli_error($connection)); - -$rc = mysqli_query($connection, "INSERT INTO " . $tableName . " (name) VALUES ('Doe'), ('Joe')"); -if (!$rc) - printf("[004] [%d] %s\n", mysqli_errno($connection), mysqli_error($connection)); - -$result = mysqli_query($connection, 'SELECT * FROM ' . $tableName . ' LIMIT 10'); -if (!$result) - printf("[005] [%d] %s\n", mysqli_errno($result), mysqli_error($result)); - - -while ($row = mysqli_fetch_object($result, 'TestRow', [42])) { - var_dump($row); -} - -mysqli_close($connection); - -?> -==DONE== ---EXPECTF-- -object(TestRow)#%d (3) { - ["set_from_constructor":"TestRow":private]=> - int(42) - ["data":"TestRow":private]=> - array(2) { - ["id"]=> - string(1) "1" - ["name"]=> - string(3) "Doe" - } - ["hello":"TestRow":private]=> - string(5) "world" -} -object(TestRow)#%d (3) { - ["set_from_constructor":"TestRow":private]=> - int(42) - ["data":"TestRow":private]=> - array(2) { - ["id"]=> - string(1) "2" - ["name"]=> - string(3) "Joe" - } - ["hello":"TestRow":private]=> - string(5) "world" -} -==DONE== |