diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 852eb02c6bc90..165893b32f4a1 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -1198,11 +1198,13 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags ZVAL_COPY_VALUE(&dataset, return_value); object_init_ex(return_value, ce); + HashTable *prop_table = zend_symtable_to_proptable(Z_ARR(dataset)); + zval_ptr_dtor(&dataset); if (!ce->default_properties_count && !ce->__set) { - Z_OBJ_P(return_value)->properties = Z_ARR(dataset); + Z_OBJ_P(return_value)->properties = prop_table; } else { - zend_merge_properties(return_value, Z_ARRVAL(dataset)); - zval_ptr_dtor(&dataset); + zend_merge_properties(return_value, prop_table); + zend_array_release(prop_table); } if (ce->constructor) { diff --git a/ext/mysqli/tests/gh8068.phpt b/ext/mysqli/tests/gh8068.phpt new file mode 100644 index 0000000000000..db6ce230b936c --- /dev/null +++ b/ext/mysqli/tests/gh8068.phpt @@ -0,0 +1,25 @@ +--TEST-- +GH-8068 (mysqli_fetch_object creates inaccessible properties) +--SKIPIF-- + +--FILE-- +query('SELECT 42'); +$obj = $res->fetch_object(); +var_dump( + $obj, + $obj->{42} +); +?> +--EXPECT-- +object(stdClass)#4 (1) { + ["42"]=> + string(2) "42" +} +string(2) "42"