我在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,对我而言,由于你必须执行一个额外的步骤,它会慢一些。
感谢
答案 0 :(得分:12)
准备好的陈述是:
在这两个中,#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()
。