diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 8911e3a29f7..5af6ff790b2 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -357,6 +357,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 00000000000..d9f053c4bca --- /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===