ИНТЕРАКТИВНОЕ ИЗМЕНЕНИЕ ДАННЫХ С ПОМОЩЬЮ AJAX

Шаяхметов Марк Назарович
Нефтекамский филиал Уфимского университета науки и технологий
студент 4 курса, Факультет экономико-математический

Аннотация
В данной статье рассматривается практическая реализация интерактивного редактирования данных в веб-таблицах с использованием технологии Ajax. Представлено пошаговое руководство по созданию системы, позволяющей пользователям изменять данные непосредственно в ячейках таблицы без перезагрузки страницы.

Ключевые слова: ,


Рубрика: 05.00.00 ТЕХНИЧЕСКИЕ НАУКИ

Библиографическая ссылка на статью:
Шаяхметов М.Н. Интерактивное изменение данных с помощью Ajax // Современные научные исследования и инновации. 2025. № 11 [Электронный ресурс]. URL: https://web.snauka.ru/issues/2025/11/103862 (дата обращения: 09.04.2026).

Научный руководитель: Вильданов Алмаз Нафкатович
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал

Введение

Современные веб-приложения требуют высокой интерактивности и отзывчивости интерфейсов. Одной из ключевых технологий, обеспечивающих бесшовное взаимодействие пользователя с приложением, является Ajax (Asynchronous JavaScript and XML). В рамках данной лабораторной работы мы реализуем систему интерактивного редактирования табличных данных.

Цели работы

- Освоить принципы работы Ajax

- Реализовать интерактивное редактирование табличных данных

- Обеспечить безопасность при работе с базой данных

- Создать пользовательский интерфейс с мгновенным откликом

Архитектура решения

Технологический стек

- **Frontend:** HTML5, CSS3, JavaScript (jQuery)

- **Backend:** PHP 7.4+

- **База данных:** MySQL 5.7+

- **Протокол:** HTTP/HTTPS

Компоненты системы

1. **Клиентская часть** – интерактивная таблица с возможностью редактирования

2. **Серверная часть** – PHP-скрипты для обработки запросов

3. **База данных** – хранение и управление данными

Практическая реализация

1. Подготовка базы данных

“`sql

CREATE TABLE students (

id INT PRIMARY KEY AUTO_INCREMENT,

first_name VARCHAR(50) NOT NULL,

last_name VARCHAR(50) NOT NULL,

age INT,

group_name VARCHAR(20),

email VARCHAR(100)

);

 

INSERT INTO students (first_name, last_name, age, group_name, email) VALUES

(‘Иван’, ‘Иванов’, 20, ‘ИТ-101′, ‘ivan@mail.ru’),

(‘Петр’, ‘Петров’, 21, ‘ИТ-102′, ‘petr@mail.ru’),

(‘Мария’, ‘Сидорова’, 19, ‘ИТ-101′, ‘maria@mail.ru’);

“`

 

2. Структура HTML-документа

 

“`html

<!DOCTYPE html>

<html lang=”ru”>

<head>

<meta charset=”UTF-8″>

<title>Ajax Table Editing</title>

<script src=”https://code.jquery.com/jquery-3.6.0.min.js”></script>

<style>

.dynamic { cursor: pointer; background-color: f0f8ff; }

.dynamic:hover { background-color: e0f0ff; }

.editing { background-color: fffacd; }

input.dynamic-input { width: 100%; border: 1px solid 007bff; padding: 2px; }

</style>

</head>

<body>

<div id=”table-container”></div>

<script src=”script.js”></script>

</body>

</html>

“`

 

3. Подключение к базе данных (connect.php)

 

“`php

<?php

$host = ‘localhost’;

$dbname = ‘university’;

$user = ‘username’;

$pass = ‘password’;

 

try {

$pdo = new PDO(“mysql:host=$host;dbname=$dbname;charset=utf8″, $user, $pass);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch(PDOException $e) {

die(“Connection failed: ” . $e->getMessage());

}

?>

“`

 

4. JavaScript-логика интерактивного редактирования

 

Основной функционал реализован в файле `script.js`:

 

“`javascript

$(document).ready(function() {

    loadTable();

    

    function loadTable() {

        $.ajax({

            url: ‘load_table.php’,

            type: ‘GET’,

            success: function(response) {

                $(‘table-container’).html(response);

                initDynamicCells();

            }

        });

    }

    

    function initDynamicCells() {

        $(‘.dynamic’).off(‘click’).on(‘click’, function() {

            var $cell = $(this);

            var currentValue = $cell.text().trim();

            var field = $cell.data(‘field’);

            var id = $cell.data(‘id’);

            var table = $cell.data(‘table’);

            

            var $input = $(‘<input>’, {

                type: ‘text’,

                value: currentValue,

                class: ‘dynamic-input’

            });

            

            $cell.html($input).addClass(‘editing’);

            $input.focus();

            

            $input.off(‘blur keypress’).on(‘blur keypress’, function(e) {

                if (e.type === ‘blur’ || (e.type === ‘keypress’ && e.which === 13)) {

                    var newValue = $input.val().trim();

                    if (newValue !== currentValue) {

                        saveData(id, field, newValue, table, $cell);

                    } else {

                        $cell.text(currentValue).removeClass(‘editing’);

                    }

                }

            });

        });

    }

    

    function saveData(id, field, value, table, $cell) {

        $.ajax({

            url: ‘itable_save.php’,

            type: ‘POST’,

            data: {

                id: id,

                field: field,

                value: value,

                table: table

            },

            success: function(response) {

                if (response.success) {

                    $cell.text(value).removeClass(‘editing’);

                    showMessage(‘Данные успешно сохранены!’, ‘success’);

                } else {

                    showMessage(‘Ошибка сохранения: ‘ + response.error, ‘error’);

                }

            },

            error: function() {

                showMessage(‘Ошибка соединения с сервером’, ‘error’);

            }

        });

    }

});

“`

 

5. Генерация таблицы (load_table.php)

 

“`php

<?php

include ‘connect.php’;

 

$stmt = $pdo->query(“SELECT * FROM students ORDER BY id”);

$students = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

 

<table border=”1″ id=”dynamic-table”>

    <thead>

        <tr>

            <th>ID</th>

            <th>Имя</th>

            <th>Фамилия</th>

            <th>Возраст</th>

            <th>Группа</th>

            <th>Email</th>

        </tr>

    </thead>

    <tbody>

        <?php foreach($students as $student): ?>

        <tr>

            <td><?= htmlspecialchars($student['id']) ?></td>

            <td data-id=”<?= $student['id'] ?>”

                data-field=”first_name” data-table=”students”>

                <?= htmlspecialchars($student['first_name']) ?>

            </td>

            <td data-id=”<?= $student['id'] ?>”

                data-field=”last_name” data-table=”students”>

                <?= htmlspecialchars($student['last_name']) ?>

            </td>

            <td data-id=”<?= $student['id'] ?>”

                data-field=”age” data-table=”students”>

                <?= htmlspecialchars($student['age']) ?>

            </td>

            <td data-id=”<?= $student['id'] ?>”

                data-field=”group_name” data-table=”students”>

                <?= htmlspecialchars($student['group_name']) ?>

            </td>

            <td data-id=”<?= $student['id'] ?>”

                data-field=”email” data-table=”students”>

                <?= htmlspecialchars($student['email']) ?>

            </td>

        </tr>

        <?php endforeach; ?>

    </tbody>

</table>

“`

 

6. Обработчик сохранения данных (itable_save.php)

 

“`php

<?php

header(‘Content-Type: application/json’);

include ‘connect.php’;

 

$id = $_POST['id'] ?? null;

$field = $_POST['field'] ?? null;

$value = $_POST['value'] ?? null;

$table = $_POST['table'] ?? null;

 

// Валидация и безопасность

$allowed_tables = ['students', 'teachers'];

$allowed_fields = ['first_name', 'last_name', 'age', 'group_name', 'email'];

 

if (!$id || !$field || !$table ||

!in_array($table, $allowed_tables) ||

!in_array($field, $allowed_fields)) {

echo json_encode(['success' => false, 'error' => 'Неверные параметры']);

exit;

}

 

try {

$sql = “UPDATE $table SET $field = :value WHERE id = :id”;

$stmt = $pdo->prepare($sql);

$stmt->execute([':value' => $value, ':id' => $id]);

echo json_encode(['success' => $stmt->rowCount() > 0]);

} catch(PDOException $e) {

echo json_encode(['success' => false, 'error' => $e->getMessage()]);

}

?>

“`

 

Меры безопасности

1. Защита от SQL-инъекций

Использование подготовленных запросов (prepared statements) полностью исключает возможность SQL-инъекций:

 

“`php

$sql = “UPDATE $table SET $field = :value WHERE id = :id”;

$stmt = $pdo->prepare($sql);

$stmt->execute([':value' => $value, ':id' => $id]);

“`

 

2. Валидация входных данных

 

Ограничение допустимых таблиц и полей через белые списки:

 

“`php

$allowed_tables = ['students', 'teachers'];

$allowed_fields = ['first_name', 'last_name', 'age', 'group_name', 'email'];

“`

 

3. Экранирование вывода

Предотвращение XSS-атак через `htmlspecialchars()`:

“`php

<?= htmlspecialchars($student['first_name']) ?>

“`

 

Пользовательский опыт

Визуальные индикаторы

- **Обычное состояние:** Светло-голубой фон ячеек

- **Ховер-эффект:** Усиление цвета при наведении

- **Режим редактирования:** Желтый фон с полем ввода

- **Уведомления:** Всплывающие сообщения о статусе операций

Удобство использования

- Редактирование по клику

- Сохранение при потере фокуса или нажатии Enter

- Визуальная обратная связь

- Отмена редактирования при нажатии Escape

Тестирование функциональности

Сценарии тестирования

1. **Редактирование текстовых полей**

- Ввод корректных данных

- Ввод специальных символов

- Пустые значения

 

2. **Обработка ошибок**

- Потеря соединения

- Неверные параметры запроса

- Ошибки базы данных

 

3. **Производительность**

- Время отклика сервера

- Плавность интерфейса

- Обработка одновременных запросов

 

Расширение функциональности

Возможные улучшения

1. **Валидация данных на стороне клиента**

“`javascript

function validateField(field, value) {

const validators = {

‘email’: /^[^s@]+@[^s@]+.[^s@]+$/,

‘age’: /^d+$/,

‘first_name’: /^[A-Za-zА-Яа-яs]+$/

};

return !validators[field] || validators[field].test(value);

}

“`

 

2. **История изменений**

“`sql

CREATE TABLE change_log (

id INT PRIMARY KEY AUTO_INCREMENT,

table_name VARCHAR(50),

record_id INT,

field_name VARCHAR(50),

old_value TEXT,

new_value TEXT,

changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

changed_by VARCHAR(100)

);

“`

 

3. **Конфликт параллельного редактирования**

“`php

// Проверка версии записи

$current_version = get_record_version($id);

if ($current_version != $_POST['version']) {

echo json_encode(['success' => false, 'error' => 'Запись была изменена']);

}

“`

 

Заключение

В ходе лабораторной работы была успешно реализована система интерактивного редактирования табличных данных с использованием технологии Ajax. Основные достижения:

1. **Интерактивность:** Пользователи могут редактировать данные непосредственно в таблице

2. **Производительность:** Отсутствие перезагрузки страницы экономит время

3. **Безопасность:** Реализованы меры защиты от основных уязвимостей

4. **Удобство:** Интуитивно понятный интерфейс с обратной связью

Практическая значимость

Разработанное решение может быть использовано в различных веб-приложениях:

- Системы управления контентом (CMS)

- Административные панели

- Системы учета и отчетности

- Образовательные платформы

 Перспективы развития

Для промышленного использования систему можно дополнить:

- Ролевой моделью доступа

- Расширенной валидацией данных

- Системой уведомлений

- Поддержкой различных типов полей (выпадающие списки, даты)


Библиографический список
  1. Get started with WebGL [Электронный ресурс] / Microsoft. – Электрон. текстовые дан. – Режим доступа: http://msdn.microsoft.com/ruru/Library/dn385807(v=vs.85).aspx, свободный. – Загл. с экрана.
  2. Three.js – JavaScript 3D library [Электронный ресурс] / Mr.doob. – Электрон. текстовые дан. – Режим доступа: http://threejs.org, свободный. – Загл. с экрана.
  3. Вильданов А.Н. 3D-моделирование на WebGL с помощью библиотеки Three.js: учебное пособие. - Уфа: РИЦ БашГУ, 2014. – 114 с. – ISBN: 987-5- 7477-3560-6.
  4. Вильданов, А. Н. Разработка класса Eventcontrols для создания интерактивных трехмерных приложений в web с помощью Three. Js / А. Н. Вильданов // Дневник науки. – 2023. – № 7(79). – DOI10.51691/2541-8327_2023_7_2. – EDN SSDKQF.


Все статьи автора «Шаяхметов Марк Назарович»


© Если вы обнаружили нарушение авторских или смежных прав, пожалуйста, незамедлительно сообщите нам об этом по электронной почте.