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

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. Владельцы видео обладают...

Форма обратной связи и веб-заглушка на PHP для продажи домена. PHP Email Script для Cishost.

  PHP Email Script для Cishost Описание Этот скрипт предназначен для работы на хостинге Cishost и позволяет отправлять письма через SMTP. Настройки SMTP вынесены в отдельный файл smtp-config.php для безопасности и удобства управления. Требования Версия PHP : Минимальная версия PHP 7.4 или выше. Хостинг : Скрипт протестирован на Cishost , но может быть адаптирован для других провайдеров. Поддержка SMTP : Убедитесь, что ваш хостинг позволяет отправку писем через SMTP. Установка Загрузите все файлы на ваш хостинг (например, через FTP или файловый менеджер Cishost). Перед первым использованием создайте копию файла smtp-config.php.example и переименуйте её в smtp-config.php . В файле smtp-config.php укажите свои SMTP-учетные данные. Убедитесь, что ваш хостинг поддерживает отправку писем через SMTP. Настройка SMTP Откройте файл smtp-config.php и внесите в него параметры вашего почтового сервера: return [ 'smtp_username' => 'your_smtp_user', /...