类型不一致
当谈到INSERT主题时,还记得几页之前我关于SQLite是如何无类型的以及因此你可以插入任意类型的数据到任意字段中的话吗?这里有该规则的一个重要的例外:标记为整型关键字的字段。在SQLite中,标记为整型关键字的字段需要做两件重要的事情:它们为表中的每条记录提供一个唯一的数字标识符,且如果你将NULL值插入其中,那么SQLite自动插入一个比字段中已有的最大值大一的数值。
因此,SQLite中的整型关键字字段执行和MySQL中的自动增加字段一样的任务,而且是自动对记录编号的一种方便的方法。很明显地,你无法插入非数值到这样的字段中,这就是我为什么说它们是无类型规则的一个例外。
阅读更多的关于这方面的内容请参看:http://www.sqlite.org/datatypes.html。
因为之前例子中用到的books表格包含这样的字段(id字段),所以很明显地,每个插入到该字段的NULL值会生成一个新的记录号。如果你打算读取该号,那么PHP也有一种方法这样做(只使用sqlite_last_insert_rowid()即可,该函数返回最后被插入一行的ID号(这等价于PHP的MySQL API中的mysql_insert_id()函数))。
为了看到这个的实际效果,更新上面脚本中间的if()循环以包含对sqlite_last_insert_rowid()的调用,如下所示:
<?php // check to see if the form was submitted with a new record if (isset($_POST['submit'])) { // make sure both title and author are present if (!empty($_POST['title']) && !empty($_POST['author'])) { // generate INSERT query $insQuery = "INSERT INTO books (title, author) VALUES
(\"".sqlite_escape_string($_POST['title'])."\",
\"".sqlite_escape_string($_POST['author'])."\")"; // execute query $insResult = sqlite_query($handle, $insQuery) or
die("Error in query: ".sqlite_error_string(sqlite_last_error($handle))); // print success message echo "<i>Record successfully inserted with ID
".sqlite_last_insert_rowid($handle)."!</i><p />"; } else { // missing data // display error message echo "<i>Incomplete form input. Record not inserted!</i><p />"; } } ?>
如果你需要,你也可以使用sqlite_changes()函数发现多少行受到影响(你自己试试然后看看结果)。