我将要切换我在几个站点/项目中使用的数据库类,从使用自定义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
自动转义所有内容。
答案 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)
你应该每次都做好准备好的陈述。但是,您可能希望编写一个小助手:一次性准备,绑定和运行查询,而无需多行代码。