Почему PDO::execute не заменяет псевдопеременные в запросе?
Насколько помню есть замута с ипользованием плейсхолдеров в лимите, в доктрине во всяком случае. 
Попробуйте конкретно с лимитом вот так:$st->bindValue(":limit", $limit, ParameterType::INTEGER);
Заменяет:$sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT ?, ?';
$lines = $db->query($sql, [$_POST['slimit'], $_POST['limit']]);

public function query($sql, $params = false) {
  $query = $this->db->prepare($sql);
  if ( $params ) {
    $query->execute($params);
  }else {
    $query->execute();
  }
  return $query->fetchAll(\PDO::FETCH_ASSOC);
}