在 SQLite3 和 PHP 中使用准备好的语句

Posted

技术标签:

【中文标题】在 SQLite3 和 PHP 中使用准备好的语句【英文标题】:Using prepared statements with SQLite3 and PHP 【发布时间】:2013-08-31 08:34:00 【问题描述】:

我正在尝试使用 php 中的 SQLite3 将数据添加到数据库中。我在没有准备好的陈述的情况下让它工作,但现在我正试图让它更安全。我没有使用 PDO。

到目前为止,以下代码不起作用。它只是将单词 ":name" 和 ":email" 插入数据库,而不是它们的绑定值:

$smt = $db->prepare("insert into names (name, email) values (':name', ':email')");
$smt->bindValue(':name', $var_name);
$smt->bindValue(':email', $var_email);

$var_name = ($_POST[post_name]);
$var_email = ($_POST[post_email]);

$smt->execute();

所以我一开始以为这是因为我在准备好的语句中在:name:email 周围加上了单引号。所以我把那些拿出来了。现在,当我发布表单时,它只是将空白条目放入数据库,它不会插入 $var_name$var_email 的值

语句 is 正在执行,我认为它只是没有正确绑定变量。我做错了什么?

【问题讨论】:

也许,添加一种数据会有所帮助:SQLITE3_TEXT?虽然,它是可选的。 php.net/manual/en/sqlite3stmt.bindvalue.php 是的,我忘了说我也试过了,谢谢 【参考方案1】:

你设法混淆了绑定函数。

如果您还没有分配变量,则必须使用 bindParam。 而 bindValue 只能与现有值一起使用。

另外,您应该打开错误报告

【讨论】:

哦等等,使用 PDO 时执行只接受参数,我在我的问题中说我没有使用 PDO .. 我怎样才能让它在没有 PDO 的情况下工作? 好了,那就看前面的功能说明,好好使用吧【参考方案2】:

你不需要中间变量,你必须这样做:

$smt = $db->prepare("insert into names (name, email) values (':name', ':email')");
$smt->bindValue(':name', $_POST['post_name'], SQLITE3_TEXT);
$smt->bindValue(':email', $_POST['post_email'], SQLITE3_TEXT);

$smt->execute();

正如SQLite3Stmt::bindValue() 中所述,值是立即绑定的,而不是像SQLite3Stmt::bindParam() 那样在execute() 时间获取变量的值。所以问题是执行语句时变量是空的。


记住:

您不需要在变量赋值时添加括号:$a = ($b); -> $a = $b; 您必须引用变量键名。否则 PHP 将尝试查找具有此名称的常量,如果它不存在则会抛出警告......但如果存在则分配一个错误的键值! $_POST[post_name] -> $_POST['post_name']

【讨论】:

以上是关于在 SQLite3 和 PHP 中使用准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用准备好的语句进行查询?

在 PHP 中到处使用准备好的语句? (PDO)

使用 PHP 和 MSSQL 准备好的语句

什么时候在 PHP Mysqli 中使用准备好的语句? - 用户表单搜索输入与选择查询

使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

在 PHP 中创建准备好的语句