<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Электронный научно-практический журнал «Современные научные исследования и инновации» &#187; Шаяхметов Марк Назарович</title>
	<atom:link href="http://web.snauka.ru/issues/author/author90341/feed" rel="self" type="application/rss+xml" />
	<link>https://web.snauka.ru</link>
	<description></description>
	<lastBuildDate>Sat, 18 Apr 2026 09:41:14 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Интерактивное изменение данных с помощью Ajax</title>
		<link>https://web.snauka.ru/issues/2025/11/103862</link>
		<comments>https://web.snauka.ru/issues/2025/11/103862#comments</comments>
		<pubDate>Sat, 01 Nov 2025 13:03:10 +0000</pubDate>
		<dc:creator>Шаяхметов Марк Назарович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[интерактивное изменение данных]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/11/103862</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение Современные веб-приложения требуют высокой интерактивности и отзывчивости интерфейсов. Одной из ключевых технологий, обеспечивающих бесшовное взаимодействие пользователя с приложением, является Ajax (Asynchronous JavaScript and XML). В рамках данной лабораторной работы мы реализуем систему интерактивного редактирования табличных данных. Цели работы - Освоить принципы работы Ajax [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p><strong>Введение</strong></p>
<p>Современные веб-приложения требуют высокой интерактивности и отзывчивости интерфейсов. Одной из ключевых технологий, обеспечивающих бесшовное взаимодействие пользователя с приложением, является Ajax (Asynchronous JavaScript and XML). В рамках данной лабораторной работы мы реализуем систему интерактивного редактирования табличных данных.</p>
<p><strong>Цели работы</strong></p>
<p>- Освоить принципы работы Ajax</p>
<p>- Реализовать интерактивное редактирование табличных данных</p>
<p>- Обеспечить безопасность при работе с базой данных</p>
<p>- Создать пользовательский интерфейс с мгновенным откликом</p>
<p><strong>Архитектура решения</strong></p>
<p><em>Технологический стек</em></p>
<p>- **Frontend:** HTML5, CSS3, JavaScript (jQuery)</p>
<p>- **Backend:** PHP 7.4+</p>
<p>- **База данных:** MySQL 5.7+</p>
<p>- **Протокол:** HTTP/HTTPS</p>
<p><em>Компоненты системы</em></p>
<p>1. **Клиентская часть** &#8211; интерактивная таблица с возможностью редактирования</p>
<p>2. **Серверная часть** &#8211; PHP-скрипты для обработки запросов</p>
<p>3. **База данных** &#8211; хранение и управление данными</p>
<p><strong>Практическая реализация</strong></p>
<p>1. Подготовка базы данных</p>
<p>&#8220;`sql</p>
<p>CREATE TABLE students (</p>
<p style="padding-left: 30px;">id INT PRIMARY KEY AUTO_INCREMENT,</p>
<p style="padding-left: 30px;">first_name VARCHAR(50) NOT NULL,</p>
<p style="padding-left: 30px;">last_name VARCHAR(50) NOT NULL,</p>
<p style="padding-left: 30px;">age INT,</p>
<p style="padding-left: 30px;">group_name VARCHAR(20),</p>
<p style="padding-left: 30px;">email VARCHAR(100)</p>
<p>);</p>
<p>&nbsp;</p>
<p>INSERT INTO students (first_name, last_name, age, group_name, email) VALUES</p>
<p>(&#8216;Иван&#8217;, &#8216;Иванов&#8217;, 20, &#8216;ИТ-101&#8242;, &#8216;ivan@mail.ru&#8217;),</p>
<p>(&#8216;Петр&#8217;, &#8216;Петров&#8217;, 21, &#8216;ИТ-102&#8242;, &#8216;petr@mail.ru&#8217;),</p>
<p>(&#8216;Мария&#8217;, &#8216;Сидорова&#8217;, 19, &#8216;ИТ-101&#8242;, &#8216;maria@mail.ru&#8217;);</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>2. Структура HTML-документа</p>
<p>&nbsp;</p>
<p>&#8220;`html</p>
<p>&lt;!DOCTYPE html&gt;</p>
<p>&lt;html lang=&#8221;ru&#8221;&gt;</p>
<p>&lt;head&gt;</p>
<p style="padding-left: 30px;">&lt;meta charset=&#8221;UTF-8&#8243;&gt;</p>
<p style="padding-left: 30px;">&lt;title&gt;Ajax Table Editing&lt;/title&gt;</p>
<p style="padding-left: 30px;">&lt;script src=&#8221;https://code.jquery.com/jquery-3.6.0.min.js&#8221;&gt;&lt;/script&gt;</p>
<p style="padding-left: 30px;">&lt;style&gt;</p>
<p style="padding-left: 60px;">.dynamic { cursor: pointer; background-color: f0f8ff; }</p>
<p style="padding-left: 60px;">.dynamic:hover { background-color: e0f0ff; }</p>
<p style="padding-left: 60px;">.editing { background-color: fffacd; }</p>
<p style="padding-left: 60px;">input.dynamic-input { width: 100%; border: 1px solid 007bff; padding: 2px; }</p>
<p style="padding-left: 30px;">&lt;/style&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p style="padding-left: 30px;">&lt;div id=&#8221;table-container&#8221;&gt;&lt;/div&gt;</p>
<p style="padding-left: 30px;">&lt;script src=&#8221;script.js&#8221;&gt;&lt;/script&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>3. Подключение к базе данных (connect.php)</p>
<p>&nbsp;</p>
<p>&#8220;`php</p>
<p>&lt;?php</p>
<p>$host = &#8216;localhost&#8217;;</p>
<p>$dbname = &#8216;university&#8217;;</p>
<p>$user = &#8216;username&#8217;;</p>
<p>$pass = &#8216;password&#8217;;</p>
<p>&nbsp;</p>
<p>try {</p>
<p style="padding-left: 30px;">$pdo = new PDO(&#8220;mysql:host=$host;dbname=$dbname;charset=utf8&#8243;, $user, $pass);</p>
<p style="padding-left: 30px;">$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</p>
<p>} catch(PDOException $e) {</p>
<p style="padding-left: 30px;">die(&#8220;Connection failed: &#8221; . $e-&gt;getMessage());</p>
<p>}</p>
<p>?&gt;</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>4. JavaScript-логика интерактивного редактирования</p>
<p>&nbsp;</p>
<p>Основной функционал реализован в файле `script.js`:</p>
<p>&nbsp;</p>
<p>&#8220;`javascript</p>
<p>$(document).ready(function() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;loadTable();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;function loadTable() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url: &#8216;load_table.php&#8217;,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: &#8216;GET&#8217;,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success: function(response) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;table-container&#8217;).html(response);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDynamicCells();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;function initDynamicCells() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;.dynamic&#8217;).off(&#8216;click&#8217;).on(&#8216;click&#8217;, function() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $cell = $(this);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var currentValue = $cell.text().trim();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var field = $cell.data(&#8216;field&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var id = $cell.data(&#8216;id&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var table = $cell.data(&#8216;table&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $input = $(&#8216;&lt;input&gt;&#8217;, {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: &#8216;text&#8217;,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value: currentValue,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class: &#8216;dynamic-input&#8217;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cell.html($input).addClass(&#8216;editing&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$input.focus();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$input.off(&#8216;blur keypress&#8217;).on(&#8216;blur keypress&#8217;, function(e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (e.type === &#8216;blur&#8217; || (e.type === &#8216;keypress&#8217; &amp;&amp; e.which === 13)) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var newValue = $input.val().trim();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (newValue !== currentValue) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveData(id, field, newValue, table, $cell);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cell.text(currentValue).removeClass(&#8216;editing&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;function saveData(id, field, value, table, $cell) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url: &#8216;itable_save.php&#8217;,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: &#8216;POST&#8217;,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data: {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id: id,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field: field,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value: value,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table: table</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success: function(response) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (response.success) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cell.text(value).removeClass(&#8216;editing&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMessage(&#8216;Данные успешно сохранены!&#8217;, &#8216;success&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMessage(&#8216;Ошибка сохранения: &#8216; + response.error, &#8216;error&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error: function() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMessage(&#8216;Ошибка соединения с сервером&#8217;, &#8216;error&#8217;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>});</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>5. Генерация таблицы (load_table.php)</p>
<p>&nbsp;</p>
<p>&#8220;`php</p>
<p>&lt;?php</p>
<p>include &#8216;connect.php&#8217;;</p>
<p>&nbsp;</p>
<p>$stmt = $pdo-&gt;query(&#8220;SELECT * FROM students ORDER BY id&#8221;);</p>
<p>$students = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);</p>
<p>?&gt;</p>
<p>&nbsp;</p>
<p>&lt;table border=&#8221;1&#8243; id=&#8221;dynamic-table&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;ID&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Имя&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Фамилия&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Возраст&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Группа&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Email&lt;/th&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/thead&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php foreach($students as $student): ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;?= htmlspecialchars($student['id']) ?&gt;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td data-id=&#8221;&lt;?= $student['id'] ?&gt;&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data-field=&#8221;first_name&#8221; data-table=&#8221;students&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?= htmlspecialchars($student['first_name']) ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td data-id=&#8221;&lt;?= $student['id'] ?&gt;&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data-field=&#8221;last_name&#8221; data-table=&#8221;students&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?= htmlspecialchars($student['last_name']) ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td data-id=&#8221;&lt;?= $student['id'] ?&gt;&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data-field=&#8221;age&#8221; data-table=&#8221;students&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?= htmlspecialchars($student['age']) ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td data-id=&#8221;&lt;?= $student['id'] ?&gt;&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data-field=&#8221;group_name&#8221; data-table=&#8221;students&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?= htmlspecialchars($student['group_name']) ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td data-id=&#8221;&lt;?= $student['id'] ?&gt;&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data-field=&#8221;email&#8221; data-table=&#8221;students&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?= htmlspecialchars($student['email']) ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php endforeach; ?&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tbody&gt;</p>
<p>&lt;/table&gt;</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>6. Обработчик сохранения данных (itable_save.php)</p>
<p>&nbsp;</p>
<p>&#8220;`php</p>
<p>&lt;?php</p>
<p>header(&#8216;Content-Type: application/json&#8217;);</p>
<p>include &#8216;connect.php&#8217;;</p>
<p>&nbsp;</p>
<p>$id = $_POST['id'] ?? null;</p>
<p>$field = $_POST['field'] ?? null;</p>
<p>$value = $_POST['value'] ?? null;</p>
<p>$table = $_POST['table'] ?? null;</p>
<p>&nbsp;</p>
<p>// Валидация и безопасность</p>
<p>$allowed_tables = ['students', 'teachers'];</p>
<p>$allowed_fields = ['first_name', 'last_name', 'age', 'group_name', 'email'];</p>
<p>&nbsp;</p>
<p>if (!$id || !$field || !$table ||</p>
<p style="padding-left: 30px;">!in_array($table, $allowed_tables) ||</p>
<p style="padding-left: 30px;">!in_array($field, $allowed_fields)) {</p>
<p style="padding-left: 30px;">echo json_encode(['success' =&gt; false, 'error' =&gt; 'Неверные параметры']);</p>
<p style="padding-left: 30px;">exit;</p>
<p>}</p>
<p>&nbsp;</p>
<p>try {</p>
<p style="padding-left: 30px;">$sql = &#8220;UPDATE $table SET $field = :value WHERE id = :id&#8221;;</p>
<p style="padding-left: 30px;">$stmt = $pdo-&gt;prepare($sql);</p>
<p style="padding-left: 30px;">$stmt-&gt;execute([':value' =&gt; $value, ':id' =&gt; $id]);</p>
<p style="padding-left: 30px;">echo json_encode(['success' =&gt; $stmt-&gt;rowCount() &gt; 0]);</p>
<p>} catch(PDOException $e) {</p>
<p style="padding-left: 30px;">echo json_encode(['success' =&gt; false, 'error' =&gt; $e-&gt;getMessage()]);</p>
<p>}</p>
<p>?&gt;</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p><strong>Меры безопасности</strong></p>
<p>1. Защита от SQL-инъекций</p>
<p>Использование подготовленных запросов (prepared statements) полностью исключает возможность SQL-инъекций:</p>
<p>&nbsp;</p>
<p>&#8220;`php</p>
<p>$sql = &#8220;UPDATE $table SET $field = :value WHERE id = :id&#8221;;</p>
<p>$stmt = $pdo-&gt;prepare($sql);</p>
<p>$stmt-&gt;execute([':value' =&gt; $value, ':id' =&gt; $id]);</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>2. Валидация входных данных</p>
<p>&nbsp;</p>
<p>Ограничение допустимых таблиц и полей через белые списки:</p>
<p>&nbsp;</p>
<p>&#8220;`php</p>
<p>$allowed_tables = ['students', 'teachers'];</p>
<p>$allowed_fields = ['first_name', 'last_name', 'age', 'group_name', 'email'];</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>3. Экранирование вывода</p>
<p>Предотвращение XSS-атак через `htmlspecialchars()`:</p>
<p>&#8220;`php</p>
<p>&lt;?= htmlspecialchars($student['first_name']) ?&gt;</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p><strong>Пользовательский опыт</strong></p>
<p><em>Визуальные индикаторы</em></p>
<p>- **Обычное состояние:** Светло-голубой фон ячеек</p>
<p>- **Ховер-эффект:** Усиление цвета при наведении</p>
<p>- **Режим редактирования:** Желтый фон с полем ввода</p>
<p>- **Уведомления:** Всплывающие сообщения о статусе операций</p>
<p><em>Удобство использования</em></p>
<p>- Редактирование по клику</p>
<p>- Сохранение при потере фокуса или нажатии Enter</p>
<p>- Визуальная обратная связь</p>
<p>- Отмена редактирования при нажатии Escape</p>
<p><strong>Тестирование функциональности</strong></p>
<p><em>Сценарии тестирования</em></p>
<p>1. **Редактирование текстовых полей**</p>
<p>- Ввод корректных данных</p>
<p>- Ввод специальных символов</p>
<p>- Пустые значения</p>
<p>&nbsp;</p>
<p>2. **Обработка ошибок**</p>
<p>- Потеря соединения</p>
<p>- Неверные параметры запроса</p>
<p>- Ошибки базы данных</p>
<p>&nbsp;</p>
<p>3. **Производительность**</p>
<p>- Время отклика сервера</p>
<p>- Плавность интерфейса</p>
<p>- Обработка одновременных запросов</p>
<p>&nbsp;</p>
<p><strong>Расширение функциональности</strong></p>
<p><em>Возможные улучшения</em></p>
<p>1. **Валидация данных на стороне клиента**</p>
<p>&#8220;`javascript</p>
<p>function validateField(field, value) {</p>
<p style="padding-left: 30px;">const validators = {</p>
<p style="padding-left: 60px;">&#8216;email&#8217;: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,</p>
<p style="padding-left: 60px;">&#8216;age&#8217;: /^\d+$/,</p>
<p style="padding-left: 60px;">&#8216;first_name&#8217;: /^[A-Za-zА-Яа-я\s]+$/</p>
<p style="padding-left: 30px;">};</p>
<p style="padding-left: 30px;">return !validators[field] || validators[field].test(value);</p>
<p>}</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>2. **История изменений**</p>
<p>&#8220;`sql</p>
<p>CREATE TABLE change_log (</p>
<p style="padding-left: 30px;">id INT PRIMARY KEY AUTO_INCREMENT,</p>
<p style="padding-left: 30px;">table_name VARCHAR(50),</p>
<p style="padding-left: 30px;">record_id INT,</p>
<p style="padding-left: 30px;">field_name VARCHAR(50),</p>
<p style="padding-left: 30px;">old_value TEXT,</p>
<p style="padding-left: 30px;">new_value TEXT,</p>
<p style="padding-left: 30px;">changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</p>
<p style="padding-left: 30px;">changed_by VARCHAR(100)</p>
<p>);</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p>3. **Конфликт параллельного редактирования**</p>
<p>&#8220;`php</p>
<p>// Проверка версии записи</p>
<p>$current_version = get_record_version($id);</p>
<p>if ($current_version != $_POST['version']) {</p>
<p style="padding-left: 30px;">echo json_encode(['success' =&gt; false, 'error' =&gt; 'Запись была изменена']);</p>
<p>}</p>
<p>&#8220;`</p>
<p>&nbsp;</p>
<p><strong>Заключение</strong></p>
<p>В ходе лабораторной работы была успешно реализована система интерактивного редактирования табличных данных с использованием технологии Ajax. Основные достижения:</p>
<p>1. **Интерактивность:** Пользователи могут редактировать данные непосредственно в таблице</p>
<p>2. **Производительность:** Отсутствие перезагрузки страницы экономит время</p>
<p>3. **Безопасность:** Реализованы меры защиты от основных уязвимостей</p>
<p>4. **Удобство:** Интуитивно понятный интерфейс с обратной связью</p>
<p><strong>Практическая значимость</strong></p>
<p>Разработанное решение может быть использовано в различных веб-приложениях:</p>
<p>- Системы управления контентом (CMS)</p>
<p>- Административные панели</p>
<p>- Системы учета и отчетности</p>
<p>- Образовательные платформы</p>
<p><strong> Перспективы развития</strong></p>
<p>Для промышленного использования систему можно дополнить:</p>
<p>- Ролевой моделью доступа</p>
<p>- Расширенной валидацией данных</p>
<p>- Системой уведомлений</p>
<p>- Поддержкой различных типов полей (выпадающие списки, даты)</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/11/103862/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проектирование и реализация базы данных для магазина кошек: практическое руководство</title>
		<link>https://web.snauka.ru/issues/2025/11/103854</link>
		<comments>https://web.snauka.ru/issues/2025/11/103854#comments</comments>
		<pubDate>Tue, 18 Nov 2025 07:38:11 +0000</pubDate>
		<dc:creator>Шаяхметов Марк Назарович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[базы данных]]></category>
		<category><![CDATA[проектирование базы данных]]></category>
		<category><![CDATA[реализация базы данных]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/11/103854</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение В современном мире домашние животные становятся неотъемлемой частью многих семей, а кошки — одними из самых популярных питомцев. С развитием специализированной розничной торговли возникает необходимость в эффективном управлении данными о животных, клиентах и продажах. Архитектура базы данных Концептуальная модель База данных строится на [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p><strong>Введение</strong></p>
<p>В современном мире домашние животные становятся неотъемлемой частью многих семей, а кошки — одними из самых популярных питомцев. С развитием специализированной розничной торговли возникает необходимость в эффективном управлении данными о животных, клиентах и продажах.</p>
<p><strong>Архитектура базы данных</strong></p>
<p>Концептуальная модель</p>
<p>База данных строится на основе трехуровневой архитектуры, включающей:</p>
<p>1. Таблица `cat` — основная сущность, содержащая информацию о кошках</p>
<p>2. Таблица `flea` — сущность клиентов (в контексте задачи использовано стилизованное название)</p>
<p>3. Таблица `cat_flea` — связующая таблица для отношения «многие-ко-многим»</p>
<p><strong>Физическая модель данных</strong></p>
<p><em>Таблица CAT (Кошки)</em></p>
<p>| Поле | Тип данных | Обязательное | Описание |</p>
<p>|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;-|</p>
<p>| `id_cat` | INT PRIMARY KEY | Да | Уникальный идентификатор |</p>
<p>| `name` | VARCHAR(50) | Да | Кличка животного |</p>
<p>| `breed` | VARCHAR(50) | Да | Порода |</p>
<p>| `age` | INT | Да | Возраст в месяцах |</p>
<p>| `price` | DECIMAL(10,2) | Да | Стоимость в рублях |</p>
<p>| `weight` | DECIMAL(4,2) | Да | Вес в килограммах |</p>
<p>| `birth_date` | DATE | Да | Дата рождения |</p>
<p>| `color` | VARCHAR(30) | Да | Окрас |</p>
<p>| `vaccinated` | BOOLEAN | Нет | Статус вакцинации |</p>
<p>| `description` | TEXT | Нет | Дополнительное описание |</p>
<p>&nbsp;</p>
<p><em>Таблица FLEA (Клиенты)</em></p>
<p>| Поле | Тип данных | Обязательное | Описание |</p>
<p>|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;-|</p>
<p>| `id_flea` | INT PRIMARY KEY | Да | Уникальный идентификатор |</p>
<p>| `first_name` | VARCHAR(50) | Да | Имя клиента |</p>
<p>| `last_name` | VARCHAR(50) | Да | Фамилия клиента |</p>
<p>| `email` | VARCHAR(100) | Нет | Электронная почта |</p>
<p>| `phone` | VARCHAR(20) | Нет | Контактный телефон |</p>
<p>| `registration_date` | DATE | Да | Дата регистрации |</p>
<p>| `address` | TEXT | Нет | Адрес проживания |</p>
<p>| `discount` | INT | Нет | Размер скидки в % |</p>
<p><em>Таблица CAT_FLEA (Покупки)</em></p>
<p>| Поле | Тип данных | Обязательное | Описание |</p>
<p>|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;-|</p>
<p>| `id_cat` | INT | Да | Внешний ключ на таблицу CAT |</p>
<p>| `id_flea` | INT | Да | Внешний ключ на таблицу FLEA |</p>
<p>| `count` | INT | Да | Количество приобретенных животных |</p>
<p>| `purchase_date` | DATE | Да | Дата совершения покупки |</p>
<p>| `total_price` | DECIMAL(10,2) | Да | Общая стоимость покупки |</p>
<p>&nbsp;</p>
<p><strong>Реализация на SQL</strong></p>
<p>&nbsp;</p>
<p><em>Создание таблиц</em></p>
<p>&nbsp;</p>
<p><strong>&#8220;`sql</strong></p>
<p><em>Таблица кошек</em></p>
<p>CREATE TABLE cat (</p>
<p>id_cat INT PRIMARY KEY AUTO_INCREMENT,</p>
<p>name VARCHAR(50) NOT NULL,</p>
<p>breed VARCHAR(50) NOT NULL,</p>
<p>age INT NOT NULL,</p>
<p>price DECIMAL(10,2) NOT NULL,</p>
<p>weight DECIMAL(4,2) NOT NULL,</p>
<p>birth_date DATE NOT NULL,</p>
<p>color VARCHAR(30) NOT NULL,</p>
<p>vaccinated BOOLEAN DEFAULT FALSE,</p>
<p>description TEXT</p>
<p>);</p>
<p>&nbsp;</p>
<p><em>Таблица клиентов</em></p>
<p>CREATE TABLE flea (</p>
<p>id_flea INT PRIMARY KEY AUTO_INCREMENT,</p>
<p>first_name VARCHAR(50) NOT NULL,</p>
<p>last_name VARCHAR(50) NOT NULL,</p>
<p>email VARCHAR(100),</p>
<p>phone VARCHAR(20),</p>
<p>registration_date DATE NOT NULL,</p>
<p>address TEXT,</p>
<p>discount INT DEFAULT 0</p>
<p>);</p>
<p>&nbsp;</p>
<p><em>Таблица покупок</em></p>
<p>CREATE TABLE cat_flea (</p>
<p>id_cat INT,</p>
<p>id_flea INT,</p>
<p>count INT NOT NULL DEFAULT 1,</p>
<p>purchase_date DATE NOT NULL,</p>
<p>total_price DECIMAL(10,2) NOT NULL,</p>
<p>PRIMARY KEY (id_cat, id_flea, purchase_date),</p>
<p>FOREIGN KEY (id_cat) REFERENCES cat(id_cat),</p>
<p>FOREIGN KEY (id_flea) REFERENCES flea(id_flea)</p>
<p>);</p>
<p>&nbsp;</p>
<p><strong>Наполнение данными</strong></p>
<p>База данных заполнена реалистичными данными, включающими 10 записей о кошках различных пород (британские, мейн-куны, хаусы, манулы и др.) и 10 записей о клиентах из разных городов России.</p>
<p><em>Пример данных из таблицы CAT:</em></p>
<p>| ID | Имя | Порода | Возраст | Цена | Вес |</p>
<p>|&#8212;-|&#8212;&#8211;|&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;|&#8212;&#8212;|&#8212;&#8211;|</p>
<p>| 1 | Мурзик | Британский | 12 | 15000.00 | 4.5 |</p>
<p>| 3 | Вася | Хаус | 6 | 8000.00 | 3.8 |</p>
<p>| 5 | Рыжик | Манул | 18 | 50000.00 | 7.1 |</p>
<p>&nbsp;</p>
<p><strong> Отношение «многие-ко-многим»</strong></p>
<p>Ключевым аспектом проекта является реализация отношения «многие-ко-многим» между кошками и клиентами через таблицу `cat_flea`. Это позволяет:</p>
<p>- Одному клиенту покупать нескольких кошек</p>
<p>- Одну кошку продавать нескольким клиентам (в случае покупки животных одного помета)</p>
<p>- Учитывать количество приобретаемых животных</p>
<p>- Фиксировать дату и стоимость каждой покупки</p>
<p>Пример из задания: Клиент Иванова Мария приобрела 3 кошек породы &#8220;хаус&#8221; и 2 кошек породы &#8220;манул&#8221;, что отражено в двух записях таблицы `cat_flea`.</p>
<p><strong>Практическое применение</strong></p>
<p><em>Аналитические запросы</em></p>
<p>sql</p>
<p>Топ-5 самых популярных пород</p>
<p>SELECT c.breed, SUM(cf.count) as total_sold</p>
<p>FROM cat_flea cf</p>
<p>JOIN cat c ON cf.id_cat = c.id_cat</p>
<p>GROUP BY c.breed</p>
<p>ORDER BY total_sold DESC</p>
<p>LIMIT 5;</p>
<p>&nbsp;</p>
<p><em>Выручка по месяцам</em></p>
<p>SELECT YEAR(purchase_date) as year,</p>
<p>MONTH(purchase_date) as month,</p>
<p>SUM(total_price) as monthly_revenue</p>
<p>FROM cat_flea</p>
<p>GROUP BY YEAR(purchase_date), MONTH(purchase_date)</p>
<p>ORDER BY year, month;</p>
<p>&nbsp;</p>
<p><em>Операционные отчеты</em></p>
<p>База данных позволяет генерировать:</p>
<p>- Отчеты по продажам</p>
<p>- Статистику популярности пород</p>
<p>- Информацию о клиентской базе</p>
<p>- Финансовые отчеты</p>
<p><strong>Заключение</strong></p>
<p>Разработанная база данных демонстрирует классический подход к проектированию реляционных баз данных для предметной области розничной торговли. Использование отношения «многие-ко-многим» обеспечивает гибкость учета продаж, а разнообразие типов данных в таблицах соответствует реальным бизнес-требованиям.</p>
<p>Архитектура базы может быть расширена дополнительными таблицами (поставщики, ветеринарные услуги, корма), что делает ее хорошей основой для полноценной системы управления зоомагазином.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/11/103854/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
