使用SQLite3和PHP的预准备语句

时间:2013-08-28 10:11:51

标签: php sqlite prepared-statement prepare

我正在尝试使用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

的值

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

2 个答案:

答案 0 :(得分:5)

您设法混淆了绑定功能。

如果您尚未分配变量,则必须使用 bindParam
虽然 bindValue 必须仅与现有值一起使用。

此外,您应该启用错误报告

答案 1 :(得分:3)

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

$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']