【问题标题】:How to bind SQL parameters dynamically?如何动态绑定 SQL 参数?
【发布时间】:2019-08-24 20:27:38
【问题描述】:

我想制作一个可以展示活动的网站。我想根据位置和日期制作过滤功能。

我使用这个查询来过滤日期:

function selectAllActivities($date = false, $locations = false){
    $sql = "SELECT * FROM `activities`
            INNER JOIN `locations` ON `activities`.`location_id` = `locations`.`id`
            WHERE 1";

    if (!empty($date)){
      $sql .=  " AND `activities`.`start` >= :date AND `activities`.`start` < :next_day";
    }
    if (!empty($locations)){

      }

    }
    $stmt = $this->pdo->prepare($sql);

    if ($date){
      $dateTime = date("Y-m-d", strtotime($date));
      $dateTimeTomorrow= date("Y-m-d", strtotime($date.'+1 day'));
      $stmt->bindValue(':date', $dateTime);
      $stmt->bindValue(':next_day', $dateTimeTomorrow);
    }

    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);

对于位置,我在 $locations 中有一个包含所选日期的数组,但是当用户选择多个要过滤的位置时,我不知道如何将参数动态绑定到查询。

这就是我想要的硬编码方式:

SELECT * FROM `activities` WHERE 1 AND `location_id` IN (:location_id_0, :location_id_1, :location_id_2)

$stmt->bindValue(':location_id_1', $locations[0]);
$stmt->bindValue(':location_id_2', $locations[1]);
$stmt->bindValue(':location_id_3', $locations[2]);

我想我需要使用 foreach 函数,但我不知道如何使用。

【问题讨论】:

  • @Qirel 是的,它以数组的形式出现
  • 我在评论后的最后一个code-sn-p中注意到了,因此我删除了评论:)

标签: php sql database filter


【解决方案1】:

您将需要两个简单的 foreach 循环,如下所示:

if (is_array($locations)) {
    $placeHolders = [];        
    foreach ($locations as $key => $location) {
        $placeHolders[$key] = ':location_id_'.$key;
    }
    $sql .= ' AND `location_id` IN ('.implode(', ',$placeHolders).')';
}

$stmt = $this->pdo->prepare($sql);

if (is_array($locations)) {
    foreach ($locations as $key => $location) {
        $stmt->bindValue($placeHolders[$key], $location);
    }
}

$locations 不为空时,循环遍历它的数组。使用该数组的 $key,您可以为 MySQL 查询创建一个 $placeHolders 数组。

然后你准备声明。

然后使用$placeHolders 数组将位置绑定到语句。

【讨论】:

  • 通过使用这个,你在$sql完成了查询的生成你已经绑定了值,所以你需要分开查询和绑定的创建,使用相同的条件 - 但执行的不同阶段。
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 2015-01-01
  • 2012-08-04
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多