]> granicus.if.org Git - php/commitdiff
Fixed bug #78154
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 9 Dec 2020 11:46:47 +0000 (12:46 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 9 Dec 2020 11:46:47 +0000 (12:46 +0100)
Handle errors during next_result in exec.

NEWS
ext/pdo_mysql/mysql_driver.c
ext/pdo_mysql/tests/bug78152.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 9560df1c93981e0728a82655f50c1596a007c460..d3c5e521396ce6257596f810cbf1892f69dfa3a8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -34,6 +34,8 @@ PHP                                                                        NEWS
     (Kamil Tekiela)
   . Fixed bug #63185 (nextRowset() ignores MySQL errors with native prepared
     statements). (Nikita)
+  . Fixed bug #78152 (PDO::exec() - Bad error handling with multiple commands).
+    (Nikita)
 
 - Phpdbg:
   . Fixed bug #76813 (Access violation near NULL on source operand). (cmb)
index 344b6fe6372aa6f134b92eb7353a61fbba179df7..2d8c4698e76eb44ba9ad3aa0c72e42064ece4700 100644 (file)
@@ -269,7 +269,8 @@ static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l
                        MYSQL_RES* result;
                        while (mysql_more_results(H->server)) {
                                if (mysql_next_result(H->server)) {
-                                       PDO_DBG_RETURN(1);
+                                       pdo_mysql_error(dbh);
+                                       PDO_DBG_RETURN(-1);
                                }
                                result = mysql_store_result(H->server);
                                if (result) {
diff --git a/ext/pdo_mysql/tests/bug78152.phpt b/ext/pdo_mysql/tests/bug78152.phpt
new file mode 100644 (file)
index 0000000..8fc4fc7
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #78152: PDO::exec() - Bad error handling with multiple commands
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+$db = MySQLPDOTest::factory();
+MySQLPDOTest::createTestTable($db);
+
+var_dump($db->exec("INSERT INTO test(id, label) VALUES (41, 'x'); INSERT INTO test_bad(id, label) VALUES (42, 'y')"));
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+try {
+    var_dump($db->exec("INSERT INTO test(id, label) VALUES (42, 'x'); INSERT INTO test_bad(id, label) VALUES (43, 'y')"));
+} catch (PDOException $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+MySQLPDOTest::dropTestTable();
+?>
+--EXPECTF--
+Warning: PDO::exec(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test_bad' doesn't exist in %s on line %d
+bool(false)
+SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test_bad' doesn't exist