2011-07-19 38 views
4

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

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

我应该使用一个单一的准备语句(而单个值),但与不同的变量执行它每一次,或者我应该使用上面的风格?如果我在这里使用准备好的语句,我们在谈论性​​能受到多大影响?我需要在这种情况下使用交易吗?

*我的mysql_query方法与预先准备的语句类似,用户可以拨打$mysql->Query("SELECT * FROM%s WHERE '%s'='%s'", $var, $var, $var),该方法会自动使用mysql_real_escape_string转义所有内容。

+0

为了您对质量插入的关注,请看下面这个:[PDO Prepared在单个查询中插入多行](http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in -single-query) – Jacob

回答

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); 
1

你应该每次做准备的语句。但是,您可能希望编写一个小型帮助程序:准备,绑定和运行查询,不需要多行代码即可完成。

+3

这是我之前做的一个:[Simple PDO wrapper](http://stackoverflow.com/questions/6740153/simple-pdo-wrapper) – Mike

6

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

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

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