Skip to content

Instantly share code, notes, and snippets.

@proweb
Last active January 9, 2026 21:23
Show Gist options
  • Select an option

  • Save proweb/36f47d7c105420d05672572c34278f10 to your computer and use it in GitHub Desktop.

Select an option

Save proweb/36f47d7c105420d05672572c34278f10 to your computer and use it in GitHub Desktop.

SQLite 3 PHP example.

Особенности работы с SQLite

пример с оптимальными настройками

try {
    // Подключение
    $pdo = new PDO('sqlite:/var/www/data/app.db');
    
    // Основные атрибуты
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10);
    
    // Настройки SQLite
    $pdo->exec('PRAGMA foreign_keys = ON;');
    $pdo->exec('PRAGMA journal_mode = WAL;');
    $pdo->exec('PRAGMA synchronous = NORMAL;');
    $pdo->exec('PRAGMA cache_size = 20000;');
    $pdo->exec('PRAGMA temp_store = MEMORY;');

} catch (PDOException $e) {
    error_log('PDO Error: ' . $e->getMessage());
    die('Ошибка базы данных');
}

ATTR_ERRMODE = ERRMODE_EXCEPTION → Ловить ошибки сразу, а не искать их по всему коду.

ATTR_EMULATE_PREPARES = false → Использовать нативные подготовленные запросы для безопасности.

PRAGMA foreign_keys = ON → Включить проверку внешних ключей (по умолчанию отключено!).

PRAGMA journal_mode = WAL → Снизить число блокировок при параллельной записи.

ATTR_TIMEOUT → Избежать бесконечного ожидания при блокировках.

cache_size и temp_store → Ускорить работу за счёт кэширования в памяти.

<?php
$dbfile = __DIR__ . 'storage/database.db';
// Создаём/открываем базу данных
$database = new SQLite3($dbfile);
if (!$database) {
die("Ошибка: " . SQLite3::lastErrorMsg());
}
// Если база cуществует делаем соединение
$pdo = new PDO("sqlite:{$dbfile}");
// настрока коннекта
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Создаём таблицу
$pdo->exec("CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
email TEXT NOT NULL
)");
// Добавляем запись (безопасный способ с подготовленными запросами)
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->execute(['john_doe', 'john@example.com']);
// Получаем данные
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row['id'] . ", Имя: " . $row['username'] . ", Email: " . $row['email'] . "<br>";
}
<?php
// init db
include __DIR__ . 'db.php';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment