Как безопасно использовать WHERE?
Ты хочешь написать квери билдер. Практически всё уже написал. 
Всего-то надо вместо значений подставлять плейсхолдеры, а сами значения запоминать в переменной. 
Общий принцип такой:

class Test {
    protected $where;
    protected $params;

    public function getAll()
    {
        $result=$this->db->prepare("SELECT * FROM table WHERE 1=1 ".$this->where);
        $result->execute($this->params);
        return $result->fetchAll(PDO::FETCH_ASSOC);
    }

    public function byDate($start,$end=false)
    {
        if ($end) {
            $this->where .= " AND data BETWEEN :start AND :end";
            $this->params['end'] = $end;
        } else {
            $this->where .= " date >= :start";
        }
        $this->params['start'] = $start;
        return $this;
    }

    public function byCol($col)
    {
        $this->where .= " AND col = :col";
        $this->params['col'] = $col;
        return $this;
    }
}

$sql = new Test;
$data = $sql->byCol($col)->byDate($start)->getAll();

по-хорошему тут еще должны быть отдельные переменные для самого запроса, для order by, limit и так далее
Но начать можно с такого
Если это не тестовое задание, то проще всего использовать какой-нибудь готовый query builder. А так - использовать prepared statements, динамически создавая плейсхолдеры, а потом вызывая с нужными значениями. Т.е. типа такого$this->where .= "data BETWEEN :start AND ".($end ? ":end": "NOW()");