PHP PDO准备查询

时间:2011-11-27 14:06:11

标签: php pdo prepare

我在PDO上阅读并在StackOverFlow上搜索了关于pdo和prepare语句的内容。我想知道什么是好处或使用准备声明。例如:

$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();

VS

$sql = "SELECT name, colour, calories FROM fruit WHERE calories < $calories AND colour = $colour";
$result = $connection->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);

两个查询都会返回相同的结果,所以为什么要使用prepare,对我而言,由于你必须执行一个额外的步骤,它会慢一些。

感谢

4 个答案:

答案 0 :(得分:12)

准备好的陈述是:

  1. 更安全:PDO或底层数据库库将负责为您转义绑定变量。如果您始终使用预准备语句,则永远不会受到SQL注入攻击的攻击。<​​/ li>
  2. (有时)更快:许多数据库将缓存预准备语句的查询计划,并通过符号引用预准备语句,而不是重新传输整个查询文本。如果您只准备一次语句,然后重复使用带有不同变量的预准备语句对象,则这一点最为明显。
  3. 在这两个中,#1 更重要,并使准备好的陈述不可或缺!如果你没有使用准备好的语句,唯一明智的做法就是在软件中重新实现这个功能。 (当我被迫使用mysql驱动程序并且无法使用PDO时,我已多次这样做了。)

答案 1 :(得分:1)

使用大量查询时准备得更快(您已准备好查询)并且更安全。

您的第二个代码可能无效 - 您在查询中使用参数但未对其进行定义。

使用query(),你必须使用quote()手动填充查询 - 这是更多的工作,往往会使程序员粗心。

答案 2 :(得分:0)

准备和绑定参数是为了防止sql注入,
就像在发送到数据库之前转义变量一样,
而你的第二个查询对此没有任何辩护。

答案 3 :(得分:0)

实际上你错过了第三种选择:

$stmt = $dbh->prepare( '
   SELECT 
       name, 
       colour, 
       calories 
   FROM fruit 
   WHERE calories < :calories 
     AND colour = :colour
');
$stmt->bindParam( ':calories', $calories, PDO::PARAM_INT );
$stmt->bindParam( ':colour', $colour, PDO::PARAM_STR, 64 );
if ( $sth->execute() )
{
   $data = $sth->fetchAll( PDO::FETCH_ASSOC);
}

也许我错过了一些东西,但设置光标选项似乎有点无意义,如果你最终还是会做fetchAll()