]> granicus.if.org Git - php/commitdiff
Fixed bug #38394 (PDO fails to recover from failed prepared statement
authorIlia Alshanetsky <iliaa@php.net>
Wed, 9 Aug 2006 14:45:00 +0000 (14:45 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Wed, 9 Aug 2006 14:45:00 +0000 (14:45 +0000)
execution).

NEWS
ext/pdo/pdo_stmt.c
ext/pdo/tests/bug_38394.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 4287e43d3974192129929a2f249b5334cf952cbc..d2261b492e577d86e1fc7e32996cce83a5b7a261 100644 (file)
--- 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)
index 203774600c16e9f174e564602018a94b97e6f0a3..94b5a2932feb1c0720c37929589a99f5329c0462 100755 (executable)
@@ -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 (file)
index 0000000..d9f053c
--- /dev/null
@@ -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===