]> granicus.if.org Git - php/commitdiff
PDO MySQL: Use stmt_next_result with libmysqlclient as well
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Dec 2020 11:13:52 +0000 (12:13 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Dec 2020 11:20:04 +0000 (12:20 +0100)
libmysqlclient added this function in version 5.5, which happens
to be the minimum we support. If we have a prepared statement,
we should use it on both mysqlnd and libmysqlclient, even if the
handling afterwards is different.

This fixes error handling with native prepared statements.

ext/pdo_mysql/mysql_statement.c

index 46f39c985d31f461f8351d9d5057561726d2f5e3..80d8747cd96ee57b2f2be948eb753b4aada75090 100644 (file)
@@ -341,30 +341,29 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */
        PDO_DBG_INF_FMT("stmt=%p", S->stmt);
 
        /* ensure that we free any previous unfetched results */
-       if (S->stmt) {
-               mysql_stmt_free_result(S->stmt);
-       }
        pdo_mysql_free_result(S);
 
-#ifdef PDO_USE_MYSQLND
        if (S->stmt) {
-               if (mysqlnd_stmt_next_result(S->stmt)) {
+               mysql_stmt_free_result(S->stmt);
+               if (mysql_stmt_next_result(S->stmt)) {
+                       pdo_mysql_error_stmt(stmt);
+                       S->done = 1;
+                       PDO_DBG_RETURN(0);
+               }
+       } else {
+               if (mysql_next_result(H->server)) {
                        pdo_mysql_error_stmt(stmt);
                        S->done = 1;
                        PDO_DBG_RETURN(0);
                }
+       }
 
+#ifdef PDO_USE_MYSQLND
+       if (S->stmt) {
                PDO_DBG_RETURN(pdo_mysql_stmt_after_execute_prepared(stmt));
        }
 #endif
-
-       if (mysql_next_result(H->server)) {
-               pdo_mysql_error_stmt(stmt);
-               S->done = 1;
-               PDO_DBG_RETURN(0);
-       } else {
-               PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt));
-       }
+       PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt));
 }
 /* }}} */