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); ?> <?= $name . " - " . $p['specialite'] . " - " . htmlspecialchars($translations['seo_detail_public_title'], ENT_QUOTES, 'UTF-8')?> ">

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