您没有在代码中使用准备好的语句。准备好的语句看起来更像是这样:
$stmt = $db->prepare("INSERT INTO foo (bar, baz) VALUES (?, ?);");
$stmt->bindValue(1, "Fez");
$stmt->bindValue(2, "Hat");
$stmt->execute();
您的示例代码可能容易受到 SQL 注入的攻击,因为您只是将变量直接插入到 SQL 字符串中。您将需要使用准备好的语句并绑定值(这是首选解决方案),或者只是确保将所有输入转义为exec()
正确。
还值得一提的是exec()
对于完全硬编码的语句来说很好 - 例如,$db->exec("SELECT foo FROM bar;");
- 由于 SQL 是硬编码的,因此不存在 SQL 注入的可能性。然而我喜欢always use prepare
相反,作为一种风格问题。
要在代码中专门执行查询,您可以执行以下操作:
$stmt = $db->prepare("INSERT INTO faq (`order`, `heading`, `content`) " .
"VALUES (?, ?, ?);");
$stmt->bindValue(1, $order);
$stmt->bindValue(2, $heading);
$stmt->bindValue(3, $content);
$stmt->execute();
我还推荐官方 PHP 文档,因为它展示了做同样事情的一些其他方法(即,您可以将参数作为数组传递给execute()
而不是单独绑定它们):http://php.net/manual/en/pdo.prepare.php http://php.net/manual/en/pdo.prepare.php.