false, 'error'=>'Доступ запрещён.'], JSON_UNESCAPED_UNICODE);
exit;
}
$mustReauth=function(int $ttl=600){$t=(int)($_SESSION['admin_reauth_at']??0);return ($t===0||(time()-$t)>$ttl);};
if ($mustReauth()){ $qs=http_build_query(['page'=>'reauth','redir'=>($_SERVER['REQUEST_URI']??'index.php?page=maintenance')]); header('Location:?'.$qs); exit; }
function jerr(string $msg, int $code = 400): void {
http_response_code($code);
echo json_encode(['ok'=>false, 'error'=>$msg], JSON_UNESCAPED_UNICODE);
exit;
}
function h($s) {
return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8');
}
// CSRF
$csrf = $_POST['csrf'] ?? '';
if (empty($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $csrf)) {
jerr('Ошибка CSRF. Обновите страницу.', 400);
}
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
jerr('Неверный идентификатор пользователя.', 400);
}
// Загружаем запись из compte
$st = $pdo->prepare("SELECT * FROM compte WHERE id = ?");
$st->execute([$id]);
$c = $st->fetch(PDO::FETCH_ASSOC);
if (!$c) {
jerr('Аккаунт не найден.', 404);
}
$role = $c['role'] ?? '';
$client = null;
$prat = null;
$secBase = null; // если для секретаря будет отдельная таблица в будущем
if ($role === 'client') {
$refId = (int)($c['reference_id'] ?? 0);
if ($refId > 0) {
$st2 = $pdo->prepare("SELECT * FROM client WHERE id = ?");
$st2->execute([$refId]);
$client = $st2->fetch(PDO::FETCH_ASSOC);
}
} elseif ($role === 'praticien' || $role === 'secretaire') {
$refId = (int)($c['reference_id'] ?? 0);
if ($refId > 0) {
$st2 = $pdo->prepare("SELECT * FROM praticien WHERE id = ?");
$st2->execute([$refId]);
$prat = $st2->fetch(PDO::FETCH_ASSOC);
}
}
// Строим HTML
ob_start();
?>
Основная информация аккаунта
| ID аккаунта |
= (int)$c['id'] ?> |
| E-mail |
= h($c['email']) ?> |
| Роль |
|
| Дата создания |
format('d.m.Y H:i'));
}
?>
|
| Дата изменения |
format('d.m.Y H:i'));
}
?>
|
| Статус e-mail |
Подтверждён
Не подтверждён
|
| ID в связанной таблице (reference_id) |
= (int)($c['reference_id'] ?? 0) ?> |
Данные клиента
Запись клиента не найдена.
| ID клиента | = (int)$client['id'] ?> |
| Фамилия | = h($client['nom']) ?> |
| Имя | = h($client['prenom']) ?> |
| E-mail | = h($client['email']) ?> |
| Телефон | = h($client['telephone']) ?> |
| Дата рождения | = h($client['date_naissance']) ?> |
| Адрес | = nl2br(h($client['adresse'])) ?> |
| Город | = h($client['ville']) ?> |
| Индекс | = h($client['code_postal']) ?> |
| Пол | = h($client['genre']) ?> |
| CGU (accepted_cgu) |
Принял(а)
Не принял(а) или не указано
|
= $role === 'praticien' ? 'Данные практика' : 'Данные, связанные с секретарём' ?>
Запись практика не найдена.
| ID практика | = (int)$prat['id'] ?> |
| Фото (файл) |
|
| Тариф | = h($prat['titre']) ?> |
| Длительность приёма (мин) | = (int)$prat['duree_rdv'] ?> |
| Фамилия | = h($prat['nom']) ?> |
| Имя | = h($prat['prenom']) ?> |
| E-mail | = h($prat['email']) ?> |
| Телефон | = h($prat['telephone']) ?> |
| Специальность | = h($prat['specialite']) ?> |
| Адрес | = nl2br(h($prat['adresse'])) ?> |
| Город | = h($prat['ville']) ?> |
| Индекс | = h($prat['code_postal']) ?> |
| SIRET | = h($prat['siret']) ?> |
| CGU (accepted_cgu) |
Принял(а)
Не принял(а) или не указано
|
| Презентация | = nl2br(h($prat['presentation'])) ?> |
| Основное видео (URL) | = h($prat['video']) ?> |
| Доступность (сырой текст) | = nl2br(h($prat['disponibilite'])) ?> |
| Тип календаря | = h($prat['calendrier_type']) ?> |
| Абонемент ID | = h($prat['abonnement_id']) ?> |
| Дата окончания абонемента | = h($prat['date_expiration']) ?> |
| Синхронизация активна |
Да
Нет
|
| Создан |
format('d.m.Y H:i'));
}
?>
|
| Изменён |
format('d.m.Y H:i'));
}
?>
|
Для этой роли подробная карточка ещё не настроена.
true,
'html' => $html
], JSON_UNESCAPED_UNICODE);