From 43fca8a3f8ca9dbfc4952cc2d4d471394793be3e Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Wed, 9 Aug 2006 14:45:00 +0000 Subject: [PATCH] Fixed bug #38394 (PDO fails to recover from failed prepared statement execution). --- NEWS | 2 ++ ext/pdo/pdo_stmt.c | 6 +++++ ext/pdo/tests/bug_38394.phpt | 50 ++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 ext/pdo/tests/bug_38394.phpt diff --git a/NEWS b/NEWS index 4287e43d39..d2261b492e 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ PHP NEWS - Fixed phpinfo() cutoff of variables at \0. (Ilia) - Fixed a bug in the filter extension that prevented magic_quotes_gpc from being applied when RAW filter is used. (Ilia) +- Fixed bug #38394 (PDO fails to recover from failed prepared statement + execution). (Ilia) - Fixed bug #38377 (session_destroy() gives warning after session_regenerate_id()). (Ilia) - Fixed bug #38354 (Unwanted reformatting of XML when using AsXML). (Christian) diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 203774600c..94b5a2932f 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -392,6 +392,12 @@ static PHP_METHOD(PDOStatement, execute) zval **tmp; uint str_length; ulong num_index; + + if (stmt->bound_params) { + zend_hash_destroy(stmt->bound_params); + FREE_HASHTABLE(stmt->bound_params); + stmt->bound_params = NULL; + } zend_hash_internal_pointer_reset(Z_ARRVAL_P(input_params)); while (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(input_params), (void*)&tmp)) { diff --git a/ext/pdo/tests/bug_38394.phpt b/ext/pdo/tests/bug_38394.phpt new file mode 100644 index 0000000000..d9f053c4bc --- /dev/null +++ b/ext/pdo/tests/bug_38394.phpt @@ -0,0 +1,50 @@ +--TEST-- +PDO Common: PHP Bug #38394: Prepared statement error stops subsequent statements +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE test (a INT, b INT, c INT)"); +$s = $db->prepare("INSERT INTO test (a,b,c) VALUES (:a,:b,:c)"); + +$s->execute(array('a' => 1, 'b' => 2, 'c' => 3)); + +@$s->execute(array('a' => 5, 'b' => 6, 'c' => 7, 'd' => 8)); + +$s->execute(array('a' => 9, 'b' => 10, 'c' => 11)); + +var_dump($db->query("SELECT * FROM test")->fetchAll(PDO::FETCH_ASSOC)); +?> +===DONE=== +--EXPECTF-- +array(2) { + [0]=> + array(3) { + ["a"]=> + string(1) "1" + ["b"]=> + string(1) "2" + ["c"]=> + string(1) "3" + } + [1]=> + array(3) { + ["a"]=> + string(1) "9" + ["b"]=> + string(2) "10" + ["c"]=> + string(2) "11" + } +} +===DONE=== -- 2.50.1