如何动态绑定SQL参数?

时间:2019-04-03 10:29:48

标签: php sql database filter

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

我使用此查询过滤日期:

EMPLOYEE  |   01   |  02  | .......... |    30    |    31
JOHN      |   -    |  -   | .......... | 00:59:01 | 01:15:08
RYAN      |   -    |  -   | .......... | 01:01:20 | 00:58:12

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

这就是我想要对其进行硬编码的方式:

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);

我认为我需要使用foreach函数,但是我真的不知道该怎么做。

1 个答案:

答案 0 :(得分: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数组将位置绑定到语句。