在PHP中到处使用预处理语句? (PDO)

时间:2011-07-19 07:40:41

标签: php mysql transactions pdo prepared-statement

我将要切换我在几个站点/项目中使用的数据库类,从使用自定义mysql_query方法*到使用PDO和预处理语句。不过我先问一个问题 - 我是否想要使用准备好的语句无处不在?即使在查询只会运行一次的地方?那些我需要做的事情如下:

INSERT INTO `table` (`column`, `column`) VALUES ('value','value'), ('value','value'),('value','value'), etc.

我应该使用单个预准备语句(和单个VALUE),但每次都使用不同的变量执行它,还是应该使用上面的样式?如果我在这里使用准备好的声明,我们说话的表现有多糟糕?在这种情况下我是否需要使用交易?

*我的mysql_query方法类似于预备语句,因为用户可以调用$mysql->Query("SELECT * FROM%s WHERE '%s'='%s'", $var, $var, $var),并且该方法使用mysql_real_escape_string自动转义所有内容。

3 个答案:

答案 0 :(得分:6)

预准备语句提供了针对SQL注入的良好程度的保护,并且它们还为某些类型的查询提供了性能优势。就个人而言,我会在任何地方使用它们。

如果您发现某个特定查询导致性能问题,您可以进行一些分析以找出问题的原因,然后根据需要优化代码或查询。但是在遇到问题之前不要尝试进行微观优化。

至于交易,只需在需要时使用它们。例如,当您需要执行一系列全有或全无更新时,如果一个更新失败,则整个批次必须失败。这些对于多对多关系这样的事情非常有用,其中必须更新三个表,并且如果发生故障,您不希望保留部分关系。

答案 1 :(得分:3)

仅使用PDO参数将变量传递到查询中。

您也可以使用预准备语句进行多次插入:

$insertQuery = 'INSERT INTO table (col1, col2) VALUES ';
$insertQueryData = array();
$insertData = array();

foreach ($data as $record) {
  $insertQueryData[] = '(?, ?)';
  $insertData[] = $record['col1'];
  $insertData[] = $record['col2'];
}

$insertQuery .= implode(', ', $insertQueryData);

$statement = $db->prepare($insertQuery);
$statement->execute($insertData);

答案 2 :(得分:1)

你应该每次都做好准备好的陈述。但是,您可能希望编写一个小助手:一次性准备,绑定和运行查询,而无需多行代码。