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 аккаунта
E-mail
Роль
Дата создания format('d.m.Y H:i')); } ?>
Дата изменения format('d.m.Y H:i')); } ?>
Статус e-mail Подтверждён Не подтверждён
ID в связанной таблице (reference_id)
Данные клиента
Запись клиента не найдена.
ID клиента
Фамилия
Имя
E-mail
Телефон
Дата рождения
Адрес
Город
Индекс
Пол
CGU (accepted_cgu) Принял(а) Не принял(а) или не указано
Запись практика не найдена.
ID практика
Фото (файл)
Фото практика
Тариф
Длительность приёма (мин)
Фамилия
Имя
E-mail
Телефон
Специальность
Адрес
Город
Индекс
SIRET
CGU (accepted_cgu) Принял(а) Не принял(а) или не указано
Презентация
Основное видео (URL)
Доступность (сырой текст)
Тип календаря
Абонемент ID
Дата окончания абонемента
Синхронизация активна Да Нет
Создан format('d.m.Y H:i')); } ?>
Изменён format('d.m.Y H:i')); } ?>
Для этой роли подробная карточка ещё не настроена.
true, 'html' => $html ], JSON_UNESCAPED_UNICODE);