К основному контенту

SQLite Admin: Веб-интерфейс для работы с базой данных SQLite3

SQLite3 Web Admin Panel - управление данными в файловой базе SQLite 

SQLite3 — это популярная легковесная база данных, которая часто используется в небольших проектах, мобильных приложениях и для хранения локальных данных. Однако управление SQLite через командную строку или сторонние программы может быть неудобным. Поэтому мы представляем SQLite Admin — удобный веб-интерфейс на PHP, который позволяет просматривать, редактировать и управлять данными в базе SQLite3 прямо из браузера.

Возможности скрипта

SQLite Admin обладает следующими функциями:

  • Просмотр списка таблиц в базе данных.

  • Отображение структуры выбранной таблицы (имена колонок, типы данных, первичные ключи).

  • Автоматическое создание формы для добавления записей в соответствии со структурой таблицы.

  • Редактирование существующих записей.

  • Удаление записей:

    • Если у таблицы есть первичный ключ, удаление происходит по нему.

    • Если первичного ключа нет, удаление выполняется по всем колонкам.

  • Аутентификация через логин и пароль для защиты данных.

  • Полная поддержка запросов SQLite3.

Установка и настройка

1. Скачивание репозитория

Клонируйте проект с GitHub:

git clone https://github.com/partonen/sqlite-admin.git
cd sqlite-admin

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

Убедитесь, что в корневой директории находится файл database.sqlite. Если его нет, создайте новый файл SQLite:

touch database.sqlite

Дайте веб-серверу права на запись в базу данных:

chmod 666 database.sqlite

3. Настройка логина и пароля

Откройте файл sql.admin.php и измените учетные данные:

const USERNAME = 'admin';
const PASSWORD = 'password';

4. Запуск сервера

Если у вас установлен PHP, вы можете запустить встроенный сервер командой:

php -S localhost:8000

После этого откройте браузер и перейдите по адресу:

http://localhost:8000/sql.admin.php

Использование

После входа в систему появится интерфейс, в котором можно:

  • выбрать таблицу;

  • добавить новую запись, заполнив форму над соответствующими колонками;

  • редактировать записи, кликнув по ним;

  • удалять записи с помощью кнопки ❌.

Пример кода

<?php
session_start();

// Настройки входа
const USERNAME = 'pm-admin';
const PASSWORD = 'Dandavat2025';
const DB_FILE = 'muse-throttle-db.sqlite3';

// Проверка входа
if (!isset($_SESSION['logged_in'])) {
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['username'] === USERNAME && $_POST['password'] === PASSWORD) {
        $_SESSION['logged_in'] = true;
    } else {
        echo '<form method="post" style="text-align:center; margin-top:100px;">';
        echo '<h2>Вход</h2><input type="text" name="username" placeholder="Логин"><br>';
        echo '<input type="password" name="password" placeholder="Пароль"><br>';
        echo '<button type="submit">Войти</button></form>';
        exit();
    }
}

$db = new SQLite3(DB_FILE);

// Получаем список таблиц
$tables = [];
$res = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'");
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
    $tables[] = $row['name'];
}

// Выбор активной таблицы
$table = $_GET['table'] ?? ($tables[0] ?? '');
$table_structure = [];
if ($table) {
    // Получаем структуру таблицы
    $columns_res = $db->query("PRAGMA table_info($table)");
    $columns = [];
    $primary_key = null;
    while ($col = $columns_res->fetchArray(SQLITE3_ASSOC)) {
        $columns[] = $col['name'];
        $table_structure[] = $col;
        if ($col['pk']) {
            $primary_key = $col['name']; // Запоминаем имя поля с основным ключом
        }
    }
   
    // Обработка действий с записями
    if (isset($_POST['save'])) {
        $values = [];
        foreach ($columns as $col) {
            // Не добавляем поле с основным ключом в массив значений
            if ($col !== $primary_key) {
                $values[$col] = $_POST[$col] ?? '';
            }
        }
       
        if (!empty($_POST['id'])) {
            $set = implode(", ", array_map(fn($col) => "$col = :$col", array_keys($values)));
            $stmt = $db->prepare("UPDATE $table SET $set WHERE id = :id");
            $stmt->bindValue(':id', $_POST['id'], SQLITE3_INTEGER);
        } else {
            $cols = implode(", ", array_keys($values));
            $vals = implode(", ", array_map(fn($col) => ":$col", array_keys($values)));
            $stmt = $db->prepare("INSERT INTO $table ($cols) VALUES ($vals)");
        }
       
        foreach ($values as $col => $val) {
            $stmt->bindValue(":$col", $val, SQLITE3_TEXT);
        }
        $stmt->execute();
    } elseif (isset($_POST['delete'])) {
        $delete_params = [];
       
        // Если есть первичный ключ, удаляем по нему
        if ($primary_key) {
            $stmt = $db->prepare("DELETE FROM $table WHERE $primary_key = :$primary_key");
            $stmt->bindValue(":$primary_key", $_POST[$primary_key], SQLITE3_TEXT);
        } else {
            // Если первичного ключа нет, то удаляем по всем колонкам
            $conditions = [];
            foreach ($columns as $col) {
                $conditions[] = "$col = :$col";
                $delete_params[":$col"] = $_POST[$col];
            }
            $where_clause = implode(' AND ', $conditions);
            $stmt = $db->prepare("DELETE FROM $table WHERE $where_clause");
            foreach ($delete_params as $param => $value) {
                $stmt->bindValue($param, $value, SQLITE3_TEXT);
            }
        }
       
        $stmt->execute();
    }

    // Получаем данные
    $rows = $db->query("SELECT * FROM $table");
}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SQLite3 Админка</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        table { margin: auto; width: 80%; border-collapse: collapse; }
        th, td { padding: 10px; border: 1px solid #ddd; cursor: pointer; }
        input, button { margin: 5px; padding: 10px; }
        .logout { position: absolute; top: 10px; right: 10px; }
    </style>
</head>
<body>
    <a class="logout" href="?logout=1">Выйти</a>
    <h2>Выбор таблицы</h2>
    <form method="get">
        <select name="table" onchange="this.form.submit()">
            <?php foreach ($tables as $tbl): ?>
                <option value="<?= $tbl ?>" <?= $tbl === $table ? 'selected' : '' ?>><?= $tbl ?></option>
            <?php endforeach; ?>
        </select>
    </form>
   
    <?php if ($table): ?>
        <h2>Управление таблицей "<?= $table ?>"</h2>
        <h3>Структура таблицы</h3>
        <table>
            <tr><th>Имя</th><th>Тип</th><th>Основной ключ</th></tr>
            <?php foreach ($table_structure as $col): ?>
                <tr>
                    <td><?= $col['name'] ?></td>
                    <td><?= $col['type'] ?></td>
                    <td><?= $col['pk'] ? '✔' : '' ?></td>
                </tr>
            <?php endforeach; ?>
        </table>

        <h3>Добавить запись в таблицу "<?= $table ?>"</h3>
        <form method="post">
            <table style="margin:auto; width: 80%; text-align: left;">
                <tr>
                    <?php foreach ($columns as $col): ?>
                        <?php if ($col === $primary_key) continue; ?>
                        <th><?= ucfirst($col) ?>:</th>
                    <?php endforeach; ?>
                </tr>
                <tr>
                    <?php foreach ($table_structure as $col): ?>
                        <?php if ($col['pk']) continue; // Пропускаем основное поле ?>
                        <td>
                            <?php
                                $field_type = $col['type'];
                                if (strpos($field_type, 'TEXT') !== false) {
                                    echo "<input type='text' name='{$col['name']}' required><br>";
                                } elseif (strpos($field_type, 'INTEGER') !== false) {
                                    echo "<input type='number' name='{$col['name']}' required><br>";
                                } else {
                                    echo "<input type='text' name='{$col['name']}' required><br>";
                                }
                            ?>
                        </td>
                    <?php endforeach; ?>
                </tr>
            </table>
            <button type="submit" name="save">Добавить</button>
        </form>

        <table>
            <tr>
                <?php foreach ($columns as $col): ?>
                    <th><?= $col ?></th>
                <?php endforeach; ?>
                <th>Действия</th>
            </tr>
            <?php while ($row = $rows->fetchArray(SQLITE3_ASSOC)): ?>
            <tr>
                <?php foreach ($columns as $col): ?>
                    <td><?= htmlspecialchars($row[$col]) ?></td>
                <?php endforeach; ?>
                <td>
                    <form method="post" style="display:inline;">
                        <?php foreach ($columns as $col): ?>
                            <input type="hidden" name="<?= $col ?>" value="<?= htmlspecialchars($row[$col]) ?>">
                        <?php endforeach; ?>
                        <button type="submit" name="delete" onclick="return confirm('Удалить запись?')"></button>
                    </form>
                </td>
            </tr>
            <?php endwhile; ?>
        </table>
    <?php endif; ?>
</body>
</html>

Безопасность

  • Пароль хранится в коде в открытом виде, что не рекомендуется для продакшена.

  • Рекомендуется использовать .htaccess для защиты доступа к скрипту.

Лицензия и исходный код

Проект распространяется под лицензией MIT. Исходный код доступен на GitHub:
🔗 GitHub Repository

SQLite Admin — это удобный и легковесный инструмент для работы с базой SQLite прямо из браузера. Он прост в установке и использовании, а также предоставляет все необходимые функции для управления данными. Попробуйте его прямо сейчас!

Комментарии

Популярные сообщения из этого блога

Загрузка видео с YouTube: Законно ли это и какие есть альтернативы?

  Загрузка видео с YouTube: Законно ли это и какие есть альтернативы? В интернете часто можно встретить программы и сервисы, предлагающие скачивание видео с YouTube. Однако далеко не все пользователи задумываются о законности таких действий. В этой статье мы разберёмся, разрешено ли скачивать видео с YouTube, какие есть ограничения и как можно легально сохранить контент для личного использования. Политика YouTube: что говорят правила? YouTube прямо запрещает скачивание видео без разрешения в своих условиях использования . В разделе 5.B сказано: «Вы не должны загружать контент с YouTube, если только YouTube не предоставляет явно такой вариант через кнопку загрузки или другой инструмент.» Это значит, что любое скачивание без использования официальных инструментов YouTube, таких как YouTube Premium, нарушает пользовательское соглашение. Авторское право и правовые ограничения В большинстве стран авторское право защищает контент, размещённый на YouTube. Владельцы видео обладают...

Как создать свой первый сайт: пошаговое руководство

Создание собственного сайта — это важный шаг для бизнеса, блога или личного проекта. В этом руководстве мы рассмотрим два основных сценария: Использование онлайн-конструкторов (например, Tilda, Wix, WordPress.com) Разработка сайта на своём сервере с различным стеком технологий Мы разберём, какой вариант лучше в различных ситуациях, какие навыки необходимы, и когда стоит обратиться к специалисту. Сценарий 1: Создание сайта на онлайн-конструкторе Преимущества онлайн-конструкторов Простота и удобство: не требуются знания программирования Быстрое развертывание: можно запустить сайт за несколько часов Встроенные шаблоны и модули: адаптивный дизайн, формы, анимации, интеграции Хостинг и домен: всё включено в платформу, не нужно настраивать сервер Поддержка и безопасность: автоматические обновления и защита данных Недостатки Ограниченные возможности кастомизации Зависимость от платформы (может быть сложно перенести сайт) Платные тарифы для расширенного функционала Когда ...