''"; if ($q !== '') { $cands = city_query_candidates($q); $cands[] = mb_strtolower($q, 'UTF-8'); $cands = array_values(array_unique($cands)); $ors = []; foreach ($cands as $i => $cand) { $ors[] = "LOWER(ville) LIKE :q$i"; $params[":q$i"] = $cand . '%'; } if ($ors) { $sql .= " AND (" . implode(' OR ', $ors) . ")"; } } $sql .= " ORDER BY val ASC LIMIT 15"; } else { $sql = "SELECT DISTINCT val FROM ( SELECT specialite AS val FROM praticien WHERE specialite IS NOT NULL AND specialite <> '' UNION ALL SELECT CONCAT(prenom, ' ', nom) AS val FROM praticien WHERE prenom IS NOT NULL AND prenom <> '' AND nom IS NOT NULL AND nom <> '' UNION ALL SELECT prenom AS val FROM praticien WHERE prenom IS NOT NULL AND prenom <> '' UNION ALL SELECT nom AS val FROM praticien WHERE nom IS NOT NULL AND nom <> '' ) t WHERE 1"; if ($q !== '') { $sql .= " AND LOWER(val) LIKE :q"; $params[':q'] = mb_strtolower($q, 'UTF-8') . '%'; } $sql .= " ORDER BY (LOWER(val) LIKE :qprefix) DESC, val ASC LIMIT 15"; $params[':qprefix'] = ($q !== '') ? (mb_strtolower($q, 'UTF-8') . '%') : ''; } $stmt = $pdo->prepare($sql); $stmt->execute($params); echo json_encode($stmt->fetchAll(PDO::FETCH_COLUMN)); exit; } /* ========================= Helpers ========================= */ function h($v): string {return htmlspecialchars((string) $v, ENT_QUOTES, 'UTF-8');} $reqUri = h($_SERVER['REQUEST_URI'] ?? '/'); ?> <?php echo h($translations['seo_index_title'] ?? '') ?>


' . h($label) . ''; } }; ?>


query(" SELECT id FROM praticien WHERE photo IS NOT NULL AND photo <> '' AND date_expiration > DATE_ADD(NOW(), INTERVAL 2 DAY) ORDER BY id DESC LIMIT 50 ")->fetchAll(PDO::FETCH_COLUMN); if (! $ids) { throw new Exception('Aucun praticien'); } /* ====================================================== 2️⃣ On mélange et on prend 4 ====================================================== */ shuffle($ids); $ids = array_slice($ids, 0, 4); /* ====================================================== 3️⃣ On récupère les 4 profils ====================================================== */ $placeholders = implode(',', array_fill(0, count($ids), '?')); $stmt = $pdo->prepare(" SELECT id, nom, prenom, specialite, photo FROM praticien WHERE id IN ($placeholders) "); $stmt->execute($ids); $randomPros = $stmt->fetchAll(PDO::FETCH_ASSOC); if (! $randomPros) { throw new Exception('Aucun praticien'); } /* ====================================================== 3️⃣ Notes ====================================================== */ function percent_from_5($note) { $n = max(0, min(5, (float) $note)); return (int) round($n / 5 * 100); } $ratingsById = []; $stRatings = $pdo->prepare(" SELECT praticien_id, ROUND(AVG(note),1) AS m, COUNT(*) AS c FROM avis_praticien WHERE statut='publie' AND praticien_id IN ($placeholders) GROUP BY praticien_id "); $stRatings->execute($ids); foreach ($stRatings->fetchAll(PDO::FETCH_ASSOC) as $r) { $ratingsById[(int) $r['praticien_id']] = [ 'm' => (float) $r['m'], 'c' => (int) $r['c'], ]; } /* ====================================================== 4️⃣ Affichage ====================================================== */ foreach ($randomPros as $rp): $pid = (int) $rp['id']; $photoName = ltrim((string) $rp['photo'], '/'); $rpImg = "/public/uploads/" . $photoName; $abs = APP_HTDOCS . "/public/uploads/" . $photoName; if (! $photoName || ! is_file($abs)) { $rpImg = "/public/uploads/img/user_placeholder.png"; } $fullName = trim(($rp['prenom'] ?? '') . ' ' . ($rp['nom'] ?? '')); $spec = trim((string) ($rp['specialite'] ?? '')); $detailUrl = "/detail_public.php?id=" . $pid; $hour = random_int(9, 18); $availability = ($translations['home_online_at'] ?? 'Онлайн:') . ' ' . sprintf('%02d:00', $hour); $stats = $ratingsById[$pid] ?? ['m' => 0, 'c' => 0]; $note = (float) $stats['m']; $count = (int) $stats['c']; $w = percent_from_5($note); ?>
<?php echo h($fullName) ?>
0): ?>
★★★★★
★★★★★
/5 ()
📅