【问题标题】:PHP PDO with dynamically created where statements动态创建 where 语句的 PHP PDO
【发布时间】:2020-04-11 10:14:02
【问题描述】:

我正在尝试将 mysqli_query 转换为 PDO。

我被动态创建的 WHERE 分句卡住了。 我读了这篇文章(PHP PDO dynamic WHERE clause),但是你失去了 PDO 的准备功能,这就是我想做的。

这是(部分)我的原始代码

// this is the '$_POST' array
$_POST['org'][0] = 1;
$_POST['org'][1] = 2;
$_POST['org'][2] = 5;

/* Execute a prepared statement by passing an array of values */
$sql['select'] = "SELECT * FROM `table` ";

if(isset($_POST['org']) AND count($_POST['org']) > 0) {  
  $sql['where'] .= "WHERE ( `org_id` = '".mysqli_real_escape_string($conn, $_POST['org'][0])."' ";

  foreach ($_POST['org'] as $key => $value) {
    if($key !== 0)
      $sql['where'] .= "OR `org_id` = '".mysqli_real_escape_string($conn, $value)."' ";
  }
}

$sql = $sql['select'] . $sql['where'];
$result = mysqli_query($conn, $sql) or die(mysqli_error($conn));

如何在 foreach 循环中使用准备好的语句?

【问题讨论】:

    标签: mysql pdo


    【解决方案1】:

    啊!

    这就是我现在所做的,并且有效。谢谢。

    $sql['where'] .= "WHERE ( `org_id` = ? ";
    $values[] = $_POST['org'][0];
    
    foreach ($_POST['org'] as $key => $value) {
      if($key !== 0) {
        $sql['where'] .= "OR `org_id` = ? ";
        $values[] = $value;
      }
    }
    
    $sql['where'] .= ")";
    
    $sql = $sql['select'] . $sql['where'];
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute((array) $values);
    
    

    谢谢!

    【讨论】:

    • 技术上是正确的,但使用命名占位符并构建关联数组使这更加灵活,而且工作量也略有增加。
    • 关于样式的说明:我的偏好是在 WHEREOR 之前包含所需的前导空格以及关键字,而不是要求前面的代码在末尾包含额外的尾随空格.例如.= " WHERE ....= " OR ... 对我来说更有意义。查看设置选择第一部分的代码时,为什么需要尾随空格并不明显。但是查看附加 WHERE 的代码,更明显为什么需要在 WHERE 关键字之前有空格,... 似乎我们应该在那里做,而不是回溯到其他代码
    • @tadman 你是什么意思?你能举个小例子吗?
    • 如果您使用与您的参数匹配的命名占位符,您可以只使用execute($_POST)execute($_POST['org']) 或其他任何东西。您还应该考虑org_id IN (?, ?, ...) 而不是org_id=? OR org_id=? OR ...。 d0niek 的答案包含了这两个元素。
    【解决方案2】:

    您应该构建查询,而不是在查询中使用值,而应该使用占位符(?:placeholder_name):

    $query = 'SELECT * FROM table WHERE col IN (?,?,?)';
    $stmt = $pdo->prepare($query);
    $stmt->execute($_POST['org']);
    

    阅读https://www.php.net/manual/en/pdo.prepare.php#refsect1-pdo.prepare-examples 了解更多示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 2011-01-31
      • 2012-11-03
      相关资源
      最近更新 更多