Вы сказали:
Задача добавить заход по ссылке
Если зашли по ссылке которая генерируется динамически из id lesson и его же обернутым ключевым словом статичным lesson+ Получается проверка и создание ссылки состоит из id урока из базы данных
пример
if(!empty($_GET['lesson']){
$id = explode('-', $_GET['lesson']);
if(empty($id[0]) || $id[1]!=md5($id[0].'lesson+')){
echo 'Ссылка не найдена';
exit;
}
$HASHLINK = md5($id[0].'lesson+');
....
Если ссылка верная узнаем ученика кому принадлежит урок и загружаем ajax только его уроки
То есть ссылки на урок у одного ученика могут быть разные которые открываются но всегда ведающие в список слева на все уроки одного ученика кому принадлежат уроки
Возможно идея как реализовать это Добавить куда то скрытый input c id_link или вместе value="15-9e9b6f6a1e1c0b9c4e9b3d4e7c8a9d0f"
Проверять js при загрузки страницы Если id_link со значением тогда запускаем ajax функции для одного ученика и его уроки А если нет ссылки тогда все уроки и всех учеников
Так же скрыть кнопки Изменение Создание урока для тех кто заходит по ссылки
Или у тебя какие варианты еще есть предложить
Два файла кидаю которые надо изменить и подробно описать изменения
index.php
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Уроки и домашние задания</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<style>
#left-panel {
height: 100vh;
overflow-y: auto;
}
.lesson-item {
cursor: pointer;
}
.lesson-item:hover,.lesson-item.active {
background: #f0f0f0;
}
#left-panel, #left-panel-mobile {
max-height: calc(100vh - 60px);
overflow-y: auto;
}
.lesson-item {
cursor: pointer;
}
.lesson-item:hover,
.lesson-item.active {
background: #f0f0f0;
}
.table-responsive {
overflow-x: auto; /* горизонтальная прокрутка */
-webkit-overflow-scrolling: touch; /* плавная прокрутка на iOS */
}
.table td, .table th {
/* word-break: break-word; перенос длинных слов */
}
#sticky-header {
position: sticky;
top: 0;
z-index: 100;
background: #fff;
border-bottom: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="container-fluid">
<!-- КНОПКА МЕНЮ (только мобилка) -->
<button class="btn btn-outline-primary d-md-none m-2"
data-bs-toggle="offcanvas"
data-bs-target="#leftOffcanvas">
☰ Уроки
</button>
<!-- OFFCANVAS ДЛЯ МОБИЛКИ -->
<div class="offcanvas offcanvas-start d-md-none" id="leftOffcanvas">
<div class="offcanvas-header">
<h5>Уроки</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas"></button>
</div>
<div class="offcanvas-body" id="left-panel-mobile"></div>
</div>
<div class="row">
<!-- ЛЕВАЯ ПАНЕЛЬ -->
<div class="col-md-3 col-lg-2 border-end d-none d-md-block" id="left-panel">
<!--<div class="col-12 col-md-3 col-lg-2 border-end" id="left-panel">-->
<h5 class="mt-3">Уроки</h5>
<div id="lesson-list"></div>
</div>
<!-- ПРАВАЯ ПАНЕЛЬ -->
<div class="col-12 col-md-9 col-lg-10 p-4">
<h4 id="form-title">Создание урока</h4>
<div id="sticky-header" class="d-flex justify-content-between align-items-center mb-3">
<div id="lesson-info" class="fw-bold text-primary">
Урок не выбран
</div>
<button class="btn btn-outline-success"
data-bs-toggle="collapse"
data-bs-target="#lesson-form">
➕ Создать / Редактировать
</button>
</div>
<form id="lesson-form" class="collapse">
<input type="hidden" id="lesson_id">
<!-- Ученик -->
<div class="mb-3">
<label>Ученик</label>
<select id="student" class="form-control" style="width: 100%"></select>
</div>
<!-- Предмет / тема -->
<div class="mb-3">
<label>Тема урока</label>
<input type="text" id="topic" class="form-control">
</div>
<!-- Дата -->
<div class="mb-3">
<label>Дата</label>
<input type="date" id="lesson_date" class="form-control">
</div>
<!-- Время -->
<div class="row">
<div class="col">
<label>Начало</label>
<input type="time" id="time_start" class="form-control">
</div>
<div class="col">
<label>Конец</label>
<input type="time" id="time_end" class="form-control">
</div>
</div>
<!-- Повтор -->
<div class="mb-3 mt-3">
<label>Повтор</label>
<select id="repeat_type" class="form-control">
<option value="none">Без повтора</option>
<option value="daily">Каждый день</option>
<option value="weekly">Каждую неделю</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Сохранить</button>
</form>
<hr>
<!-- ДОМАШНИЕ ЗАДАНИЯ -->
<h5>Домашние задания</h5>
<button class="btn btn-success mb-2" id="add-homework">Добавить задание</button>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Дата</th>
<th>Файлы задания</th>
<th>Файлы ответа</th>
<th></th>
</tr>
</thead>
<tbody id="homework-table"></tbody>
</table>
</div>
</div>
</div>
</div>
<script>
/*$('#student').select2({
ajax: {
url: 'api.php',
dataType: 'json',
delay: 250,
data: function (params) {
return {
action: 'search_students',
q: params.term
};
},
processResults: function (data) {
return { results: data };
}
}
});*/
$('#student').select2({
tags: true, // разрешаем пользовательский ввод
tokenSeparators: [','],
ajax: {
url: 'api.php',
dataType: 'json',
delay: 250,
data: function (params) {
return {
action: 'search_students',
q: params.term
};
},
processResults: function (data) {
return { results: data };
}
},
createTag: function (params) {
return {
id: params.term, // пользовательский ввод
text: params.term,
newOption: true
};
}
});
/*
function loadLessons() {
$.getJSON('api.php', {action: 'get_lessons'}, function(data) {
$('#lesson-list').html('');
data.forEach(function(lesson) {
$('#lesson-list').append(
<div class="p-2 lesson-item" data-id="${lesson.id}">
<strong>${lesson.topic}</strong><br>
<small>${lesson.date}</small>
</div>
);
});
});
}*/
function loadLessons() {
$.getJSON('api.php', {action: 'get_lessons'}, function(data) {
$('#lesson-list').html('');
let html = '';
if (data.length === 0) {
//$('#lesson-list').html('<p>Уроки отсутствуют</p>');//
html = '<p>Уроки отсутствуют</p>';
//return;
}else{
data.forEach(function(lesson) {
/*$('#lesson-list').append(
<div class="p-2 lesson-item" data-id="${lesson.id}">
<strong>${lesson.topic}</strong><br>
<small>${lesson.date} | ${lesson.student_name}</small>
</div>
);*/
html +=
<div class="p-2 lesson-item" data-id="${lesson.id}">
<strong>${lesson.topic}</strong><br>
<small>${lesson.date} | ${lesson.student_name}</small>
</div>;
});
}
$('#lesson-list').html(html);
$('#left-panel-mobile').html(html);
}).fail(function(jqXHR, textStatus, errorThrown){
console.log("Ошибка AJAX:", textStatus, errorThrown);
$('#lesson-list').html('<p>Ошибка загрузки уроков</p>');
});
}
loadLessons();
$('#lesson-form').submit(function(e){
e.preventDefault();
let data = {
action: 'save_lesson',
id: $('#lesson_id').val(),
student_id: $('#student').val(),
topic: $('#topic').val(),
date: $('#lesson_date').val(),
start: $('#time_start').val(),
end: $('#time_end').val(),
repeat: $('#repeat_type').val()
};
$.post('api.php', data, function(){
loadLessons();
alert('Сохранено');
});
});
$(document).on('click','.lesson-item',function(){
let id = $(this).data('id');
// Закрываем оффканвас на мобильной версии
/*var offcanvasEl = document.getElementById('leftOffcanvas');
var bsOffcanvas = bootstrap.Offcanvas.getInstance(offcanvasEl);
if(bsOffcanvas){
bsOffcanvas.hide();
}*/
// Закрываем offcanvas на мобильных
var offcanvasEl = document.getElementById('leftOffcanvas');
if (offcanvasEl.classList.contains('show')) { // проверяем, открыт ли
var bsOffcanvas = bootstrap.Offcanvas.getInstance(offcanvasEl);
if (!bsOffcanvas) {
bsOffcanvas = new bootstrap.Offcanvas(offcanvasEl);
}
bsOffcanvas.hide();
}
// Снимаем класс .active со всех уроков
$('.lesson-item').removeClass('active');
// Добавляем класс .active к выбранному
$(this).addClass('active');
$.getJSON('api.php',{action:'get_lesson',id:id},function(data){
$('#lesson_id').val(data.id);
$('#topic').val(data.topic);
$('#lesson_date').val(data.date);
$('#time_start').val(data.time_start);
$('#time_end').val(data.time_end);
$('#repeat_type').val(data.repeat_type).change();
$('#lesson-info').html(
${data.topic} • ${data.date}<br>
<small>${data.student_name || ''}</small>
);
// Обновление селекта ученика
if(data.student_id && data.student_name){
let newOption = new Option(data.student_name, data.student_id, true, true);
$('#student').append(newOption).trigger('change');
}
$('#lesson-form').collapse('hide');
loadHomework(id);
});
});
function loadHomework(lesson_id){
$.getJSON('api.php',{action:'get_homework',lesson_id:lesson_id},function(data){
$('#homework-table').html('');
/*data.forEach(function(hw){
$('#homework-table').append(
<tr>
<td>${hw.created_at}</td>
<td>${hw.task_files.join(', ')}</td>
<td>${hw.answer_files.join(', ')}</td>
<td><button class="btn btn-danger btn-sm">Удалить</button></td>
</tr>
);
});*/
data.forEach(hw=>{
$('#homework-table').append(
<tr data-id="${hw.id}">
<td>${hw.created_at}
<input class="form-control mt-1 comment-th" value="${hw.comment_th}">
</td>
<td>
${hw.task_files.map(f=><a href="/uploads/${f.file_name}" download>${f.file_name}</a>).join('<br>')}
<input type="file" multiple class="task-files" data-homework-id="${hw.id}">
</td>
<td>
${hw.answer_files.map(f=><a href="/uploads/${f.file_name}" download>${f.file_name}</a>).join('<br>')}
<input type="file" multiple class="answer-files" data-homework-id="${hw.id}">
</td>
<td>
<button class="btn btn-primary btn-sm save-comment">Сохранить</button>
</td>
</tr>
);
});
});
}
$('#add-homework').click(function(){
let lesson_id = $('#lesson_id').val();
if(!lesson_id){
alert('Сначала выберите или создайте урок!');
return;
}
$.post('api.php', {action: 'add_homework', lesson_id: lesson_id}, function(data){
if(data.status === 'ok'){
loadHomework(lesson_id);
}
}, 'json');
});
/*function loadHomework(lesson_id){
$.getJSON('api.php',{action:'get_homework',lesson_id:lesson_id},function(data){
$('#homework-table').html('');
data.forEach(function(hw){
$('#homework-table').append(
<tr data-id="${hw.id}">
<td>${hw.created_at}</td>
<td>${hw.task_files.join(', ')}</td>
<td>${hw.answer_files.join(', ')}</td>
<td><button class="btn btn-danger btn-sm delete-homework">Удалить</button></td>
</tr>
);
});
});
}*/
function loadHomework(lesson_id){
$.getJSON('api.php',{action:'get_homework',lesson_id:lesson_id},function(data){
$('#homework-table').html('');
data.forEach(function(hw){
console.log(hw);
//let task_files = hw.task_files.map(f=><span class="file-item" data-id="${f.id}" data-type="task">${f.file_name} <button class="btn btn-sm btn-danger remove-file">x</button></span>).join('<br>');
//let answer_files = hw.answer_files.map(f=><span class="file-item" data-id="${f.id}" data-type="answer">${f.file_name} <button class="btn btn-sm btn-danger remove-file">x</button></span>).join('<br>');
let task_files = hw.task_files.map(f =>
<span class="file-item" data-id="${f.id}" data-type="task"><a href="/uploads/${f.file_name}" target="_blank" download>${f.file_name}</a>
<button class="btn btn-sm btn-danger remove-file">x</button></span>
).join('<br>');
let answer_files = hw.answer_files.map(f =>
<span class="file-item" data-id="${f.id}" data-type="answer"><a href="/uploads/${f.file_name}" target="_blank" download>${f.file_name}</a>
<button class="btn btn-sm btn-danger remove-file">x</button></span>
).join('<br>');
$('#homework-table').append(
<tr data-id="${hw.id}">
<td>
${hw.created_at}<br>
<input type="text" class="form-control comment-th" value="${hw.comment_th}" placeholder="Комментарий">
</td>
<td>
${task_files}
<input type="file" multiple class="task-files" data-homework-id="${hw.id}">
</td>
<td>
${answer_files}
<input type="file" multiple class="answer-files" data-homework-id="${hw.id}">
</td>
<td>
<button class="btn btn-primary btn-sm save-comment">Сохранить</button>
<button class="btn btn-danger btn-sm delete-homework">Удалить</button>
</td>
</tr>
);
});
});
}
$(document).on('change', '.task-files, .answer-files', function(){
let files = this.files;
let homework_id = $(this).data('homework-id');
let type = $(this).hasClass('task-files') ? 'task' : 'answer';
let formData = new FormData();
formData.append('action','upload_homework_file');
formData.append('homework_id', homework_id);
formData.append('type', type);
for(let i=0;i<files.length;i++){
formData.append('files[]', files[i]);
}
$.ajax({
url:'api.php',
type:'POST',
data: formData,
processData:false,
contentType:false,
success:function(){
loadHomework($('#lesson_id').val());
}
});
// очистка input чтобы можно было загрузить новые файлы
$(this).val('');
});
$(document).on('click','.remove-file',function(){
let file_id = $(this).parent().data('id');
if(!confirm('Удалить файл?')) return;
$.post('api.php',{action:'delete_homework_file',file_id:file_id},function(){
loadHomework($('#lesson_id').val());
});
});
$(document).on('click','.save-comment',function(){
let tr = $(this).closest('tr');
let homework_id = tr.data('id');
let comment = tr.find('.comment-th').val();
$.post('api.php',{
action:'save_homework_comment',
homework_id:homework_id,
comment_th:comment
}, function(data){
if(data.status === 'ok'){
alert('Комментарий сохранён!');
loadHomework($('#lesson_id').val());
} else {
alert('Ошибка сохранения');
}
}, 'json');
});
</script>
api.php
<?
error_reporting(E_ALL);
ini_set("display_errors", 1);
$db = new SQLite3('school.db');
/*
$db->exec("
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
CREATE TABLE IF NOT EXISTS lessons (
id INTEGER PRIMARY KEY AUTOINCREMENT,
student_id INTEGER,
topic TEXT,
date TEXT,
time_start TEXT,
time_end TEXT,
repeat_type TEXT
);
CREATE TABLE IF NOT EXISTS homework (
id INTEGER PRIMARY KEY AUTOINCREMENT,
lesson_id INTEGER,
created_at TEXT
);
CREATE TABLE IF NOT EXISTS homework_files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
homework_id INTEGER,
file_name TEXT,
type TEXT
);
");
*/
$action = $_REQUEST['action'] ?? '';
###############################
if ($action=='search_students') {
$q = $_GET['q'] ?? '';
$res = $db->query("SELECT id,name FROM students WHERE name LIKE '%$q%'");
$out = [];
while($row=$res->fetchArray()) {
$out[] = ['id'=>$row['id'],'text'=>$row['name']];
}
echo json_encode($out);
exit;
}
/*
if ($_POST['action']=='save_lesson') {
if ($_POST['id']) {
$db->exec("UPDATE lessons SET
topic='{$_POST['topic']}',
date='{$_POST['date']}',
time_start='{$_POST['start']}',
time_end='{$_POST['end']}',
repeat_type='{$_POST['repeat']}'
WHERE id={$_POST['id']}");
} else {
$db->exec("INSERT INTO lessons
(student_id,topic,date,time_start,time_end,repeat_type)
VALUES
({$_POST['student_id']},
'{$_POST['topic']}',
'{$_POST['date']}',
'{$_POST['start']}',
'{$_POST['end']}',
'{$_POST['repeat']}')");
}
echo json_encode(['status'=>'ok']);
exit;
}*/
if ($action == 'save_lesson') {
$student_id = $_POST['student_id'] ?? null;
$topic = $_POST['topic'] ?? '';
$date = $_POST['date'] ?? '';
$time_start = $_POST['start'] ?? '';
$time_end = $_POST['end'] ?? '';
$repeat = $_POST['repeat'] ?? 'none';
$lesson_id = $_POST['id'] ?? null;
// Если студент новый (текст), добавляем в таблицу students
if (!is_numeric($student_id)) {
$stmt = $db->prepare("INSERT INTO students (name) VALUES (:name)");
$stmt->bindValue(':name', $student_id, SQLITE3_TEXT);
$stmt->execute();
$student_id = $db->lastInsertRowID(); // получаем ID нового студента
}
if ($lesson_id) {
// обновление
$stmt = $db->prepare("UPDATE lessons SET student_id=:student_id, topic=:topic, date=:date, time_start=:start, time_end=:end, repeat_type=:repeat WHERE id=:id");
$stmt->bindValue(':id', $lesson_id, SQLITE3_INTEGER);
} else {
// создание
$stmt = $db->prepare("INSERT INTO lessons (student_id, topic, date, time_start, time_end, repeat_type) VALUES (:student_id, :topic, :date, :start, :end, :repeat)");
}
$stmt->bindValue(':student_id', $student_id, SQLITE3_INTEGER);
$stmt->bindValue(':topic', $topic, SQLITE3_TEXT);
$stmt->bindValue(':date', $date, SQLITE3_TEXT);
$stmt->bindValue(':start', $time_start, SQLITE3_TEXT);
$stmt->bindValue(':end', $time_end, SQLITE3_TEXT);
$stmt->bindValue(':repeat', $repeat, SQLITE3_TEXT);
$stmt->execute();
echo json_encode(['status'=>'ok']);
exit;
}
if ($action == 'get_lessons') {
$res = $db->query("SELECT lessons.id, lessons.topic, lessons.date, students.name AS student_name
FROM lessons
LEFT JOIN students ON lessons.student_id = students.id
ORDER BY lessons.id DESC"); // новые сверху
$lessons = [];
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
$lessons[] = [
'id' => $row['id'],
'topic' => $row['topic'],
'date' => $row['date'],
'student_name' => $row['student_name']
];
}
echo json_encode($lessons);
exit;
}
if($action == 'get_lesson'){
$id = $_GET['id'] ?? 0;
$res = $db->query("SELECT * FROM lessons WHERE id=$id");
$lesson = $res->fetchArray(SQLITE3_ASSOC);
if(!$lesson){
echo json_encode(['status'=>'error','message'=>'Урок не найден']);
exit;
}
// Получаем имя студента
$student_res = $db->query("SELECT name FROM students WHERE id=".$lesson['student_id']);
$student_row = $student_res->fetchArray(SQLITE3_ASSOC);
$lesson['student_name'] = $student_row['name'] ?? '';
echo json_encode($lesson);
exit;
}
if($action == 'add_homework'){
$lesson_id = $_POST['lesson_id'] ?? 0;
if(!$lesson_id){
echo json_encode(['status'=>'error','message'=>'Не указан урок']);
exit;
}
$stmt = $db->prepare("INSERT INTO homework (lesson_id, created_at) VALUES (:lesson_id, :created_at)");
$stmt->bindValue(':lesson_id', $lesson_id, SQLITE3_INTEGER);
$stmt->bindValue(':created_at', date('Y-m-d H:i:s'), SQLITE3_TEXT);
$stmt->execute();
echo json_encode(['status'=>'ok']);
exit;
}
/*
if($action == 'get_homework'){
$lesson_id = $_GET['lesson_id'] ?? 0;
$res = $db->query("SELECT * FROM homework WHERE lesson_id=$lesson_id ORDER BY id DESC");
$homeworks = [];
while($row = $res->fetchArray(SQLITE3_ASSOC)){
// получаем файлы
$files_res = $db->query("SELECT file_name, type FROM homework_files WHERE homework_id=".$row['id']);
$task_files = [];
$answer_files = [];
while($f = $files_res->fetchArray(SQLITE3_ASSOC)){
if($f['type'] == 'task') $task_files[] = $f['file_name'];
else $answer_files[] = $f['file_name'];
}
$homeworks[] = [
'id' => $row['id'],
'created_at' => $row['created_at'],
'task_files' => $task_files,
'answer_files' => $answer_files
];
}
echo json_encode($homeworks);
exit;
}*/
if($action == 'get_homework'){
$lesson_id = $_GET['lesson_id'] ?? 0;
$res = $db->query("SELECT * FROM homework WHERE lesson_id=$lesson_id ORDER BY id DESC");
$homeworks = [];
while($row = $res->fetchArray(SQLITE3_ASSOC)){
// получаем файлы
$files_res = $db->query("SELECT id, file_name, type FROM homework_files WHERE homework_id=".$row['id']);
$task_files = [];
$answer_files = [];
while($f = $files_res->fetchArray(SQLITE3_ASSOC)){
if($f['type'] == 'task') $task_files[] = ['id'=>$f['id'], 'file_name'=>$f['file_name']];
else $answer_files[] = ['id'=>$f['id'], 'file_name'=>$f['file_name']];
}
$homeworks[] = [
'id' => $row['id'],
'created_at' => $row['created_at'],
'comment_th' => $row['comment_th'],
'task_files' => $task_files,
'answer_files' => $answer_files
];
}
echo json_encode($homeworks);
exit;
}
/*
if($action == 'upload_homework_file'){
$homework_id = $_POST['homework_id'] ?? 0;
$type = $_POST['type'] ?? 'task';
foreach($_FILES['files']['name'] as $key => $name){
$tmp = $_FILES['files']['tmp_name'][$key];
$path = 'uploads/'.$name;
move_uploaded_file($tmp, $path);
$stmt = $db->prepare("INSERT INTO homework_files (homework_id, file_name, type) VALUES (:hid,:fname,:type)");
$stmt->bindValue(':hid', $homework_id, SQLITE3_INTEGER);
$stmt->bindValue(':fname', $name, SQLITE3_TEXT);
$stmt->bindValue(':type', $type, SQLITE3_TEXT);
$stmt->execute();
}
echo json_encode(['status'=>'ok']);
exit;
}*/
if($action == 'upload_homework_file'){
$homework_id = $_POST['homework_id'] ?? 0;
$type = $_POST['type'] ?? 'task';
$upload_dir = 'uploads/';
foreach($_FILES['files']['name'] as $key=>$name){
$tmp = $_FILES['files']['tmp_name'][$key];
//$tmp = $_FILES['files']['tname'][$key];
$ext = pathinfo($name, PATHINFO_EXTENSION);
//$safe_name = uniqid().'_'.preg_replace('/[^a-zA-Z0-9._-]/','_', $name);
$safe_name = $name;
$path = $upload_dir.$safe_name;
if(!is_dir($upload_dir)) mkdir($upload_dir, 0777, true);
if(move_uploaded_file($tmp, $path)){
$stmt = $db->prepare("INSERT INTO homework_files (homework_id,file_name,type) VALUES (:hid,:fname,:type)");
$stmt->bindValue(':hid',$homework_id,SQLITE3_INTEGER);
$stmt->bindValue(':fname',$safe_name,SQLITE3_TEXT);
$stmt->bindValue(':type',$type,SQLITE3_TEXT);
$stmt->execute();
}
}
// echo '<pre>',print_r($GLOBALS,1);
// exit;
echo json_encode(['status'=>'ok']);
exit;
}
if($action == 'delete_homework_file'){
$file_id = $_POST['file_id'] ?? 0;
$res = $db->query("SELECT file_name FROM homework_files WHERE id=$file_id");
$row = $res->fetchArray(SQLITE3_ASSOC);
if($row){
$path = 'uploads/'.$row['file_name'];
if(file_exists($path)) unlink($path);
$db->exec("DELETE FROM homework_files WHERE id=$file_id");
}
echo json_encode(['status'=>'ok']);
exit;
}
if($action == 'save_homework_comment'){
$homework_id = $_POST['homework_id'] ?? 0;
$comment = $_POST['comment_th'] ?? '';
$stmt = $db->prepare("UPDATE homework SET comment_th=:comment WHERE id=:hid");
$stmt->bindValue(':comment', $comment, SQLITE3_TEXT);
$stmt->bindValue(':hid', $homework_id, SQLITE3_INTEGER);
$stmt->execute();
echo json_encode(['status'=>'ok']);
exit;
}