Зависит от логики, в самом простом случае собирают строку через цикл foreach или другой удобный в данной ситуации,или через несколько if , там с любыми проверками условий. А затем готовую строку отправляют в prepare.
Ну те грубо говоря:
/*Допустим мы уже инициализировали и настроили соединение к БД pdo*/
/*Начальная строка для запроса*/
$sql = 'SELECT one, two, three
FROM table';
/*Дополнительная строка для запроса*/
$sql_add = '';
/*Массив для данных*/
$data = array();
if($one) {
//если уже не первый раз делаем, то нужно добавить AND
if(strlen($sql_add)){
$sql_add = $sql_add.' AND ';
}
//Добавляем новое условие
$sql_add = $sql_add . ' WHERE one = :one ';
//Добавляем новые данные в массив
array_push($data,[':one'=>$one]);
}
...
//Собираем все вместе
$sql = $sql.$sql_add;
//Подготовляем строку
$sth = $db->prepare($sql);
//Передаем значения и выполняем
$sth->execute($data);
$result = $sth->fetchAll();
Это простой грубый пример, во многих ORM есть свои инструменты для таких штук.