【问题标题】:Use prepared statements everywhere in PHP? (PDO)在 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 的内容。

【问题讨论】:

标签: php mysql transactions pdo prepared-statement


【解决方案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】:

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

      【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2010-11-05
      • 2016-12-30
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多