在 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)的主要内容,如果未能解决你的问题,请参考以下文章

PDO - 使用准备好的语句[重复]

带有 SQL Server 和准备好的语句的 PHP PDO

从 PDO 准备好的语句中获取原始 SQL 查询字符串

从 PDO 准备好的语句中获取原始 SQL 查询字符串

在 pdo 准备好的语句中执行多插入或许多不同的插入更好/更快吗?

如何查看准备好的 PDO SQL 语句 [重复]