ID invalide.";exit;} function h($s) {return htmlspecialchars((string) $s, ENT_QUOTES, 'UTF-8');} function percent_from_5($note) {$n = max(0, min(5, (float) $note));return (int) round($n / 5 * 100);} function pseudo_from($prenom, $nom) { $p = trim((string) $prenom); $n = trim((string) $nom); $p = $p !== '' ? mb_convert_case($p, MB_CASE_TITLE, 'UTF-8') : 'Client'; $i = $n !== '' ? mb_strtoupper(mb_substr($nom, 0, 1, 'UTF-8'), 'UTF-8') : ''; return $i ? ($p . '.' . $i) : $p; } function video_thumb_info(?string $url): ?array { if (! $url || ! trim($url)) { return null; } $u = trim($url); if (preg_match('~(?:youtube\.com/(?:watch\?v=|embed/|shorts/)|youtu\.be/)([A-Za-z0-9_-]{6,})~i', $u, $m)) { $id = $m[1];return ['provider' => 'youtube', 'id' => $id, 'thumb' => "https://i.ytimg.com/vi/$id/hqdefault.jpg"]; } if (preg_match('~dailymotion\.com/video/([A-Za-z0-9]+)|dai\.ly/([A-Za-z0-9]+)~i', $u, $m)) { $id = $m[1] ?: $m[2];return ['provider' => 'dailymotion', 'id' => $id, 'thumb' => "https://www.dailymotion.com/thumbnail/video/$id"]; } $path = parse_url($u, PHP_URL_PATH) ?? '';if (preg_match('~\.(mp4|webm|ogg)$~i', $path)) {return ['provider' => 'file', 'id' => null, 'thumb' => null];} if (stripos($u, 'vimeo.com') !== false) {return ['provider' => 'vimeo', 'id' => null, 'thumb' => null];} return ['provider' => 'other', 'id' => null, 'thumb' => null]; } // 1) Praticien $st = $pdo->prepare("SELECT id, titre, nom, prenom, telephone, adresse, ville, code_postal, specialite, presentation, photo, video, disponibilite FROM praticien WHERE id = ?"); $st->execute([$praticien_id]); $p = $st->fetch(PDO::FETCH_ASSOC); if (! $p) {echo "
" . $translations['praticien_introuvable'] . "
";exit;} $name = $name = trim($p['prenom'] . ' ' . $p['nom']); $photo = ! empty($p['photo']) ? "/public/uploads/" . ltrim($p['photo'], '/') : "/public/uploads/img/user_placeholder.png"; // 2) Vidéos additionnelles $vs = $pdo->prepare("SELECT id, url, title, ordre FROM praticien_video WHERE praticien_id=? ORDER BY ordre ASC, id DESC"); $vs->execute([$praticien_id]); $videos = $vs->fetchAll(PDO::FETCH_ASSOC); // 3) Avis: moyenne + total + dernier $avg = $pdo->prepare("SELECT ROUND(AVG(note),1) AS m, COUNT(*) AS c FROM avis_praticien WHERE praticien_id=? AND statut='publie'"); $avg->execute([$praticien_id]); $stats = $avg->fetch(PDO::FETCH_ASSOC) ?: ['m' => null, 'c' => 0]; $last = $pdo->prepare("SELECT a.note,a.titre,a.commentaire,a.visit_date,a.created_at,c.prenom,c.nom FROM avis_praticien a LEFT JOIN client c ON c.id=a.client_id WHERE a.praticien_id=? AND a.statut='publie' ORDER BY a.created_at DESC LIMIT 1"); $last->execute([$praticien_id]); $lrow = $last->fetch(PDO::FETCH_ASSOC); ?> <?php echo $name . " - " . $p['specialite'] . " - " . htmlspecialchars($translations['seo_detail_public_title'], ENT_QUOTES, 'UTF-8') ?> ">

:
:
:
:
:
:
Photo
★★★★★
★★★★★
: /5
()
★★★★★
★★★★★
•