]> granicus.if.org Git - php/commitdiff
Fix #70628: Clearing bindings on an SQLite3 statement doesn't work
authorChristoph M. Becker <cmb@php.net>
Mon, 27 Jun 2016 14:55:15 +0000 (16:55 +0200)
committerChristoph M. Becker <cmb@php.net>
Mon, 27 Jun 2016 15:06:27 +0000 (17:06 +0200)
Obiously, it isn't sufficient to call sqlite3_clear_bindings() alone, but
also the bound_params of the php_sqlite3_stmt have to be cleared.

ext/sqlite3/sqlite3.c
ext/sqlite3/tests/bug70628.phpt [new file with mode: 0644]

index ce9472a71411554aebcc4d5bc848dd524e158144..4513b77d0f93f8f50ac01a9f0f2818dd4bd33c71 100644 (file)
@@ -1376,6 +1376,12 @@ PHP_METHOD(sqlite3stmt, clear)
                RETURN_FALSE;
        }
 
+       if (stmt_obj->bound_params) {
+               zend_hash_destroy(stmt_obj->bound_params);
+               FREE_HASHTABLE(stmt_obj->bound_params);
+               stmt_obj->bound_params = NULL;
+       }
+
        RETURN_TRUE;
 }
 /* }}} */
diff --git a/ext/sqlite3/tests/bug70628.phpt b/ext/sqlite3/tests/bug70628.phpt
new file mode 100644 (file)
index 0000000..3d807ba
--- /dev/null
@@ -0,0 +1,55 @@
+--TEST--
+Bug #70628 (Clearing bindings on an SQLite3 statement doesn't work)
+--SKIPIF--
+<?php
+if (!extension_loaded('sqlite3')) die('skip'); ?>
+--FILE--
+<?php
+$db = new SQLite3(':memory:');
+
+$db->exec("CREATE TABLE Dogs (Id INTEGER PRIMARY KEY, Breed TEXT, Name TEXT, Age INTEGER)");
+
+$sth = $db->prepare("INSERT INTO Dogs (Breed, Name, Age)  VALUES (:breed,:name,:age)");
+
+$sth->bindValue(':breed', 'canis', SQLITE3_TEXT);
+$sth->bindValue(':name', 'jack', SQLITE3_TEXT);
+$sth->bindValue(':age', 7, SQLITE3_INTEGER);
+$sth->execute();
+
+$sth->clear();
+$sth->reset();
+
+$sth->bindValue(':breed', 'russel', SQLITE3_TEXT);
+$sth->bindValue(':age', 3, SQLITE3_INTEGER);
+$sth->execute();
+
+$res = $db->query('SELECT * FROM Dogs');
+while (($row = $res->fetchArray(SQLITE3_ASSOC))) {
+    var_dump($row);
+}
+$res->finalize();
+
+$sth->close();
+$db->close();
+?>
+--EXPECT--
+array(4) {
+  ["Id"]=>
+  int(1)
+  ["Breed"]=>
+  string(5) "canis"
+  ["Name"]=>
+  string(4) "jack"
+  ["Age"]=>
+  int(7)
+}
+array(4) {
+  ["Id"]=>
+  int(2)
+  ["Breed"]=>
+  string(6) "russel"
+  ["Name"]=>
+  NULL
+  ["Age"]=>
+  int(3)
+}