diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 1607792defe49..ddf3b78ae0431 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -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 index 0000000000000..e8949fe597b6d --- /dev/null +++ b/ext/pdo/tests/bug_64172.phpt @@ -0,0 +1,84 @@ +--TEST-- +PDO Common: Bug #64172 errorInfo is not properly cleaned up +--SKIPIF-- + +--FILE-- +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 diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt index d5a348957fe4c..9028f0b49ff40 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt @@ -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!