【发布时间】:2015-12-31 06:59:22
【问题描述】:
当使用准备好的语句在 PHP 中向 SQLite3 插入多行时,如果您没有为一行绑定参数,那么即使您“清除”行之间的语句,也会插入前一行的值。
看下面的例子:
$db = new SQLite3('dogsDb.sqlite');
//create the database
$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(); //this is supposed to clear bindings!
$sth->reset();
$sth->bindValue(':breed', 'russel', SQLITE3_TEXT);
$sth->bindValue(':age', 3, SQLITE3_INTEGER);
$sth->execute();
尽管我希望第二行的 'name' 列具有 NULL 值,但该值是 'jack'!
所以要么“清除”似乎不起作用(尽管它返回 true),要么我还没有真正理解它应该做什么。
如何清除 SQLite3(甚至 PDO)中插入之间的绑定?在某些行的某些字段可能具有空值的情况下插入多行的最佳方法是什么?
【问题讨论】:
-
这刚刚被确认为 PHP 错误,请参见此处:https://bugs.php.net/bug.php?id=70628
标签: php sqlite prepared-statement prepare