]> granicus.if.org Git - php/commitdiff
Use Z_PARAM_CLASS in PDOStatement::fetchObject()
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 13 Aug 2020 14:20:29 +0000 (16:20 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 13 Aug 2020 14:20:29 +0000 (16:20 +0200)
Instead of implementing custom logic.

Zend/zend_API.h
ext/pdo/pdo_stmt.c
ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt

index b6f5944078e3ccd99a89abc5af8ca9c8a8120bdc..adf84affd284fd7512cd9f81ac1fffd0e564662e 100644 (file)
@@ -1405,6 +1405,9 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_value_error(uint32_t arg_num
 #define Z_PARAM_CLASS(dest) \
        Z_PARAM_CLASS_EX(dest, 0, 0)
 
+#define Z_PARAM_CLASS_OR_NULL(dest) \
+       Z_PARAM_CLASS_EX(dest, 1, 0)
+
 #define Z_PARAM_CLASS_NAME_OR_OBJ_EX(dest, allow_null) \
        Z_PARAM_PROLOGUE(0, 0); \
        if (UNEXPECTED(!zend_parse_arg_class_name_or_obj(_arg, &dest, allow_null))) { \
index 88e8136134f1a963090d3bc2f206bfc69ed8ed88..96f7574638e88b35d6528fa40d8a3c6fbc1ac1d0 100644 (file)
@@ -1191,14 +1191,14 @@ PHP_METHOD(PDOStatement, fetchObject)
        zend_long how = PDO_FETCH_CLASS;
        zend_long ori = PDO_FETCH_ORI_NEXT;
        zend_long off = 0;
-       zend_string *class_name = NULL;
+       zend_class_entry *ce = NULL;
        zend_class_entry *old_ce;
        zval old_ctor_args, *ctor_args = NULL;
-       int error = 0, old_arg_count;
+       int old_arg_count;
 
        ZEND_PARSE_PARAMETERS_START(0, 2)
                Z_PARAM_OPTIONAL
-               Z_PARAM_STR_EX(class_name, 1, 0)
+               Z_PARAM_CLASS_OR_NULL(ce)
                Z_PARAM_ARRAY(ctor_args)
        ZEND_PARSE_PARAMETERS_END();
 
@@ -1222,31 +1222,21 @@ PHP_METHOD(PDOStatement, fetchObject)
                        ZVAL_UNDEF(&stmt->fetch.cls.ctor_args);
                }
        }
-       if (class_name && !error) {
-               stmt->fetch.cls.ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_AUTO);
-
-               if (!stmt->fetch.cls.ce) {
-                       pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "Could not find user-supplied class");
-                       error = 1;
-               }
-       } else if (!error) {
+       if (ce) {
+               stmt->fetch.cls.ce = ce;
+       } else {
                stmt->fetch.cls.ce = zend_standard_class_def;
        }
 
-       if (!error && !do_fetch(stmt, TRUE, return_value, how, ori, off, 0)) {
-               error = 1;
-       }
-       if (error) {
+       if (!do_fetch(stmt, TRUE, return_value, how, ori, off, 0)) {
                PDO_HANDLE_STMT_ERR();
+               RETVAL_FALSE;
        }
        do_fetch_opt_finish(stmt, 1);
 
        stmt->fetch.cls.ce = old_ce;
        ZVAL_COPY_VALUE(&stmt->fetch.cls.ctor_args, &old_ctor_args);
        stmt->fetch.cls.fci.param_count = old_arg_count;
-       if (error) {
-               RETURN_FALSE;
-       }
 }
 /* }}} */
 
index 97606823583358371ef506f2cca3e6c0b8ec041f..31ee2a3e073412e3ea851bab7219a66b5b8039ac 100644 (file)
@@ -67,6 +67,11 @@ try {
 
     var_dump($rows[$rowno - 1]);
 
+    try {
+        $stmt->fetchObject('class_does_not_exist');
+    } catch (TypeError $e) {
+        echo $e->getMessage(), "\n";
+    }
 } catch (PDOException $e) {
     // we should never get here, we use warnings, but never trust a system...
     printf("[001] %s, [%s} %s\n",
@@ -106,4 +111,5 @@ object(myclass)#%d (4) {
   ["null"]=>
   NULL
 }
+PDOStatement::fetchObject(): Argument #1 ($class_name) must be a valid class name, class_does_not_exist given
 done!