]> granicus.if.org Git - php/commitdiff
Fix bug #64172
authorDaniel Persson <daniel.persson@textalk.se>
Sat, 26 Sep 2015 19:48:18 +0000 (21:48 +0200)
committerStanislav Malyshev <stas@php.net>
Mon, 19 Oct 2015 00:03:39 +0000 (17:03 -0700)
Check if the SQLSTATE error code is equal to PDO_ERR_NONE before we ask the driver.
And if no error is reported skip the extra call to the driver.

ext/pdo/pdo_dbh.c
ext/pdo/tests/bug_64172.phpt [new file with mode: 0644]
ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt

index 1607792defe49e23280a1959007d4b456510307f..ddf3b78ae04310650d490db502e7d8cbea39efba 100644 (file)
@@ -1016,14 +1016,17 @@ static PHP_METHOD(PDO, errorInfo)
 
        if (dbh->query_stmt) {
                add_next_index_string(return_value, dbh->query_stmt->error_code);
+               if(!strncmp(dbh->query_stmt->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE))) goto fill_array;
        } else {
                add_next_index_string(return_value, dbh->error_code);
+               if(!strncmp(dbh->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE))) goto fill_array;
        }
 
        if (dbh->methods->fetch_err) {
                dbh->methods->fetch_err(dbh, dbh->query_stmt, return_value);
        }
 
+fill_array:
        /**
         * In order to be consistent, we have to make sure we add the good amount
         * of nulls depending on the current number of elements. We make a simple
diff --git a/ext/pdo/tests/bug_64172.phpt b/ext/pdo/tests/bug_64172.phpt
new file mode 100644 (file)
index 0000000..e8949fe
--- /dev/null
@@ -0,0 +1,84 @@
+--TEST--
+PDO Common: Bug #64172 errorInfo is not properly cleaned up
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo')) die('skip');
+$dir = getenv('REDIR_TEST_DIR');
+if (false == $dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+
+$db = PDOTest::factory();
+
+@$db->exec("DROP TABLE test");
+$db->exec("CREATE TABLE test (x int)");
+$db->exec("INSERT INTO test VALUES (1)");
+
+echo "===FAIL===\n";
+$db->query('SELECT * FROM bad_table');
+echo "\n";
+echo "===TEST===\n";
+var_dump(is_string($db->errorInfo()[0])) . "\n";
+var_dump(is_int($db->errorInfo()[1])) . "\n";
+var_dump(is_string($db->errorInfo()[2])) . "\n";
+echo "===GOOD===\n";
+$stmt = $db->query('SELECT * FROM test');
+$stmt->fetchAll();
+$stmt = null;
+var_dump($db->errorInfo());
+
+echo "===FAIL===\n";
+$db->exec("INSERT INTO bad_table VALUES(1)");
+echo "\n";
+echo "===TEST===\n";
+var_dump(is_string($db->errorInfo()[0])) . "\n";
+var_dump(is_int($db->errorInfo()[1])) . "\n";
+var_dump(is_string($db->errorInfo()[2])) . "\n";
+echo "===GOOD===\n";
+$db->exec("INSERT INTO test VALUES (2)");
+var_dump($db->errorInfo());
+
+$db->exec("DROP TABLE test");
+?>
+===DONE===
+--EXPECTF--
+===FAIL===
+
+Warning: PDO::query(): SQLSTATE[%s]: %s
+%A
+===TEST===
+bool(true)
+bool(true)
+bool(true)
+===GOOD===
+array(3) {
+  [0]=>
+  string(5) "00000"
+  [1]=>
+  NULL
+  [2]=>
+  NULL
+}
+===FAIL===
+
+Warning: PDO::exec(): SQLSTATE[%s]: %s
+%A
+===TEST===
+bool(true)
+bool(true)
+bool(true)
+===GOOD===
+array(3) {
+  [0]=>
+  string(5) "00000"
+  [1]=>
+  NULL
+  [2]=>
+  NULL
+}
+===DONE===
\ No newline at end of file
index d5a348957fe4c8e96851fc3b5397b42c65f579ab..9028f0b49ff40808fe09bd67bae245461e56138d 100644 (file)
@@ -129,8 +129,8 @@ array(3) {
   [0]=>
   %unicode|string%(5) "00000"
   [1]=>
-  int(1146)
+  NULL
   [2]=>
-  %unicode|string%(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist"
+  NULL
 }
 done!