SQL sorgunda hata olduğunu düşünüyorsan muhtemelen hesap hatası yapıyorsundur bunun dışında kodunda bir hata göremedim. Ben şöyle bir yol izliyorum, karşılaştırıp değerlendirebilirsin.
function pagination($total, $page, $limit, $query)
{
$total = !is_numeric($total) ? 0 : (int) $total;
$page = !is_numeric($page) ? 1 : (int) $page;
$limit = !is_numeric($limit) ? 25 : (int) $limit;
$total = (int) $total;
// query limit start
$querystart = (($page === 0 ? 2 : $page) - 1) * $limit;
// last page page number
$last = ceil($total / $limit) ? ceil($total / $limit) : 1;
// first page number
$start = $page != $last && $page > $last ? ($page - 5) : 1;
// end of page before last page
$end = $page < $last ? $last - 1 : $last;
// select all for listing
$results = is_array($query) ? $query : $this->db->runSelect("{$query} LIMIT {$querystart}, {$limit}"); // bu kısım örnek
return [
'last' => $last,
'start' => $start,
'end' => $end,
'page' => $page,
'total_results' => $total,
'results' => $results,
];
}