在 PHP 中到处使用准备好的语句? (PDO)
Posted
技术标签:
【中文标题】在 PHP 中到处使用准备好的语句? (PDO)【英文标题】:Use prepared statements everywhere in PHP? (PDO) 【发布时间】:2011-10-08 07:07:15 【问题描述】:我将切换我在多个站点/项目中使用的数据库类,从使用自定义 mysql_query 方法*,到使用 PDO 和准备好的语句。不过,我首先有一个问题 - 我想在所有地方使用准备好的语句吗?即使在查询只会运行一次的地方?我需要执行以下操作的情况如何:
INSERT INTO `table` (`column`, `column`) VALUES ('value','value'), ('value','value'),('value','value'), etc.
我应该使用单个准备好的语句(和单个 VALUE),但每次使用不同的变量执行它,还是应该使用上面的样式?如果我在这里使用准备好的语句,我们所说的性能损失有多严重?在这种情况下我需要使用事务吗?
*我的 mysql_query 方法类似于准备好的语句,因为用户可以调用$mysql->Query("SELECT * FROM
%sWHERE '%s'='%s'", $var, $var, $var)
,并且该方法自动转义所有带有mysql_real_escape_string
的内容。
【问题讨论】:
关于批量插入的问题,看看这个:PDO Prepared Inserts multiple rows in single query 【参考方案1】:准备好的语句可以很好地防止 SQL 注入,它们还为某些类型的查询提供了性能优势。就个人而言,我会在任何地方使用它们。
如果您发现某个特定查询导致了性能问题,您可以进行一些分析以追踪问题的原因,然后根据需要优化代码或查询。但不要在出现问题之前尝试进行微优化。
至于交易,请在需要时使用。例如,当您需要执行一系列全有或全无更新时,如果其中一个失败,则整个批次都必须失败。这些对于多对多关系之类的事情很有用,其中必须更新三个表,并且您不希望在发生故障时保留部分关系。
【讨论】:
【参考方案2】:仅使用 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);
【讨论】:
【参考方案3】:你应该每次都做准备好的陈述。但是,您可能想编写一个小助手:准备、绑定和运行查询,无需多行代码即可完成。
【讨论】:
这是我之前做的一个:Simple PDO wrapper以上是关于在 PHP 中到处使用准备好的语句? (PDO)的主要内容,如果未能解决你的问题,请参考以下文章
带有 SQL Server 和准备好的语句的 PHP PDO