【问题标题】:How do I build a parameterized PDO statement in PHP for a dynamic query?如何在 PHP 中为动态查询构建参数化 PDO 语句?
【发布时间】:2010-10-09 16:12:07
【问题描述】:

抱歉,如果这已经被问过了。我已经看到有关静态 SQL 的答案,但在这种情况下,我想使用 PDO->prepare() 作为在运行时动态构建的查询字符串。

分解成一个简单的例子:

$TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";

if ($numberParams == 1) {
    $TempSQL = $TempSQL . " field1 = '$val1' ";
} else {
    $TempSQL = $TempSQL . " field2 = '$val2' ";
    $TempSQL = $TempSQL . " AND field3 = '$val3' ";
}

db->query($TempSQL);

如何将其重写为 db->prepare()?

我也应该即时构建语句->execute(array(':param' => $var))) 吗?

有没有更好/更整洁的方法?

【问题讨论】:

    标签: php mysql pdo sql-injection


    【解决方案1】:
    $TempSQL = 'SELECT field1, field2, field3 FROM table';
    $cond = array();
    $params = array();
    if (!empty($val1)) {
        $cond[] = "field1 = ?";
        $params[] = $val1;
    }
    if (!empty($val2)) {
        $cond[] = "field2 = ?";
        $params[] = $val2;
    }
    if (!empty($val3)) {
        $cond[] = "field3 = ?";
        $params[] = $val3;
    }
    if (count($cond)) {
        $TempSQL .= ' WHERE ' . implode(' AND ', $cond);
    }
    $stmt = $pdo->prepare($TempSQL);
    $stmt->execute($params);
    

    【讨论】:

      【解决方案2】:

      也许是这样的。 (未经测试)

      $TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";
      $args=array();
      
      if ($numberParams == 1) {
          $TempSQL = $TempSQL . " field1 = :val1"
          $args[':val1']=$val1;
      } else {
          $TempSQL = $TempSQL . " field2 = :val2 and field3 = :val3";
          $args[':val2']=$val2;
          $args[':val3']=$val3;
      }
      
      $stmt=$db->prepare($TempSQL);
      $stmt->execute($args);
      

      【讨论】:

      • 另外需要注意的是$TempSQL = $TempSQL . 'something'可以简写为$TempSQL .= 'something'
      【解决方案3】:

      根据您的示例,更简洁的方法是循环而不是切换。

      db->prepare() 允许您使用 bindParam() 或 PDOStatement->exec() 上的数组替换模式(在 php.net 上,示例是在字段名称前放置一个冒号)。您可以使用? from examples 3 and 4 而不是命名字段值。

      它仍然要求 SQL 语句的所有字段都是已知的。

      【讨论】:

        猜你喜欢
        • 2021-05-28
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        相关资源
        最近更新 更多