Функция составлена отвратительно.
Две самых главных проблемы - вывод и работа с БД.
1) Нужно всегда разделять логику приложения и логику отображения.
Во-первых, как правильно написал Fesor, никакого вывода в функциях быть не должно.
Во-вторых, и в остальном коде работа с БД и вывод должны быть всегда разделены. Сначала работает код, который получает данные из базы, и только потом начинается вывод, желательно в отдельном файле-шаблоне.
2) Несмотря на модную буковку i названиях функций, сам подход остался прежним, и представляет собой классический говнокод из прошлого века.
Во-первых, любые данные всегда должны подставляться в запрос
только через плейсхолдеры. новичкам это традиционно сложно понять, поэтому рекомендуется просто запомнить
Во-вторых, работать с БД надо не напрямую, а через враппер. Самый примитивный враппер - это PDO. Оно совсем не такое страшное, как написал каментатор выше, и код на самом деле получается короче, чем через mysqli
function get_banners($limit) {
global $link;
$sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
$stm = $link->prepare($sql);
$stm->execute([$limit]);
return $stm->fetchAll();
}
или (с
осмысленным враппером):
function get_banners($limit) {
$sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
return DB::prepare($sql)->execute([$limit])->fetchAll();
}
Вот пример нормального вывода:
<?
$banners = get_banners(5);
?>
<?php foreach ($banners as $row): ?>
<div class='last_banner'>
<div class='banner_item'>
<img src='<?=$row['banner_img']?>' alt='<?=$row['banner_title']?>'>
<a href='/click/banner_id<?=$row['banner_id'].?>' target='_blank'><?=$row['banner_title']?>"</a>
<?$row['banner_text']?>
</div>
</div>
<?php endforeach ?>
Впоследствии весь блок с HTML можно будет вынести в отдельный файл
А вот mysqli_free_result() как раз делать здесь бессмысленно - эта функция будет вызвана автоматически.