diff options
| author | Ilia Alshanetsky <iliaa@php.net> | 2006-08-09 14:45:00 +0000 |
|---|---|---|
| committer | Ilia Alshanetsky <iliaa@php.net> | 2006-08-09 14:45:00 +0000 |
| commit | 43fca8a3f8ca9dbfc4952cc2d4d471394793be3e (patch) | |
| tree | 576894e8419116c4e1e4a3a5b87a2ccbfd7bbfaf /ext | |
| parent | 946594bb6b525489883d30c80c87ef695f0ea91f (diff) | |
| download | php-git-43fca8a3f8ca9dbfc4952cc2d4d471394793be3e.tar.gz | |
Fixed bug #38394 (PDO fails to recover from failed prepared statement
execution).
Diffstat (limited to 'ext')
| -rwxr-xr-x | ext/pdo/pdo_stmt.c | 6 | ||||
| -rw-r--r-- | ext/pdo/tests/bug_38394.phpt | 50 |
2 files changed, 56 insertions, 0 deletions
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-- +<?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("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=== |
