prepare(" SELECT name, slug, country, avatar_url FROM ac_artists WHERE is_active = 1 ORDER BY created_at DESC, id DESC LIMIT :limit "); $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT); $stmt->execute(); $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC) ?: []; } catch (\Throwable $e) { return ''; } if (!$rows) { return '
No artists available yet.
'; } $cards = ''; foreach ($rows as $row) { $name = htmlspecialchars((string)($row['name'] ?? ''), ENT_QUOTES, 'UTF-8'); $slug = rawurlencode((string)($row['slug'] ?? '')); $country = htmlspecialchars(trim((string)($row['country'] ?? '')), ENT_QUOTES, 'UTF-8'); $avatar = trim((string)($row['avatar_url'] ?? '')); $avatarHtml = $avatar !== '' ? '' : '
AC
'; $cards .= '' . '
' . $avatarHtml . '
' . '
' . '
' . $name . '
' . ($country !== '' ? '
' . $country . '
' : '') . '
' . '
'; } return '
' . $cards . '
'; }); return function (Router $router): void { $controller = new ArtistsController(); $router->get('/artists', [$controller, 'index']); $router->get('/artist', [$controller, 'show']); $router->get('/admin/artists', [$controller, 'adminIndex']); $router->post('/admin/artists/install', [$controller, 'adminInstall']); $router->get('/admin/artists/new', [$controller, 'adminNew']); $router->get('/admin/artists/edit', function () use ($controller): Core\Http\Response { $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; return $controller->adminEdit($id); }); $router->post('/admin/artists/upload', [$controller, 'adminUpload']); $router->post('/admin/artists/save', [$controller, 'adminSave']); $router->post('/admin/artists/delete', [$controller, 'adminDelete']); };