如何插入带有 PDO 扩展的 SQLite?

Posted

技术标签:

【中文标题】如何插入带有 PDO 扩展的 SQLite?【英文标题】:How do I insert into SQLite with PDO extension? 【发布时间】:2010-11-13 15:37:10 【问题描述】:

我在使用 pdo 插入 sqlite3 数据库时遇到了一些麻烦。您必须原谅我对 PDO 的无知,它似乎来自 Python 的数据库接口。

所以这是我的问题。我有一个简单的插入:

$dbh = new PDO('sqlite:vets.db');
    $count = $dbh->exec("INSERT INTO vets(name,email,clinic,streetname,citystatezip,link,phone,fax,animal,region,visible) VALUES ($name,$email,$clinic,$streetname,$citystatezip,$link,$phone,$fax,$animal,$region,$visible)");
    $dbh = null;

我只是想在我的数据库上执行那个 SQL 命令并完成它。尽管执行此脚本不会导致错误,但它永远不会更新数据库。我已经尝试了数据库本身的各种权限,甚至将其设置为 777,但这并没有什么不同。

有人可以帮我吗?

【问题讨论】:

只是作为旁注(可能与您的问题无关),您是否考虑过转义您在查询中注入的数据? (见 PDO::quote);或使用准备好的语句(参见 PDO::prepare + PDO::execute)。您是否尝试检查没有 SQL 错误? (见php.net/manual/fr/pdo.errorinfo.php) 您是否使用 PDO sqlite 适配器进行过其他成功的查询? 此外,您的 SQL 语句中的每个值似乎都没有引号。 (当然,除非引号包含在每个变量中) 根据docs.python.org/library/sqlite3.html,它与python没有什么不同。 【参考方案1】:

PDO 的一大好处是您可以创建准备好的语句。这是我的一个 PHP 项目中的一些代码:

$qry = $db->prepare(
    'INSERT INTO twocents (path, name, message) VALUES (?, ?, ?)');
$qry->execute(array($path, $name, $message));

如您所见,我使用? 来插入一个值,然后使用一组值代替问号执行查询。

如果您这样做,您的查询将更加安全,并且更有可能工作(因为如果您像您一样直接在查询中插入变量,缺失值会阻止您的查询工作。)

【讨论】:

非常感谢您帮我解决这个问题。我真的不明白这些准备好的陈述。谢谢! 我不记得为什么它要求将参数包装在 array() 中(即使是一个参数!)。为什么不只接受参数列表? 好问题...它最有可能支持/表现得像 PDO 的底层库。这绝对是可能的,因为 PHP 支持可变数量的参数。您可以使用调用 parent::execute(func_get_args())execute 创建自己的子类 不幸的是,这不起作用。它给了我一个错误。我必须将参数放在数组中。【参考方案2】:

您的 SQL 查询中可能有错误。您可以打印它,然后尝试在一些 SQLite GUI 界面中执行它,例如 SQLite Database Browser。

// you can skip PDO part for now, because we know it doesn't work
// $dbh = new PDO('sqlite:vets.db');
$query = "INSERT INTO vets(name,email,clinic,streetname,citystatezip,link,phone,fax,animal,region,visible) VALUES ($name,$email,$clinic,$streetname,$citystatezip,$link,$phone,$fax,$animal,$region,$visible)";
echo $query;
// $count = $dbh->exec($query);
// $dbh = null;

我看到您没有用引号括起您的值,这可能是问题的根源。也许表字段名称中也有一些拼写错误。一旦您真正看到查询,所有内容都会显示出来。

【讨论】:

你说得对,我忘了引用我的数据。谢谢。

以上是关于如何插入带有 PDO 扩展的 SQLite?的主要内容,如果未能解决你的问题,请参考以下文章

使用php pdo在sqlite数据库中插入多个复选框的值

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

PHP开发-PDO

PHP开发-PDO

php PDO 和 mysql:如何插入地理点类型?