Для кого ця стаття

Дана стаття призначена PHP програмістів, які проявили інтерес до
розширення SQLite. Стаття презентує читачеві функціональність,
пропоновану розширенням PHP SQLite, а також розгляне переваги
SQLite в порівнянні з іншими БД. Передбачається, що читач знайомий з
основами PHP і SQL. Певний досвід роботи з MySQL або PostgreSQL ,
сприятиме кращому розумінню того, про що піде мова.

Введення

Останнім часом, ви, можливо, чули про нове розширення для PHP:
SQLite. Є багато причин, за якими SQLite може здатися кращим
досягненням з тих пір, як навчилися різати хліб. SQLite пропонує
добротний SQL інтерфейс до нерелятивістської базі даних і створює
елегантну альтернативу громіздким інтерфейсів інших баз даних без
втрати функціональності швидкості, як можна було б очікувати. Ми
розглянемо в статті це дивовижне розширення і, будемо сподіватися,
нам вдасться підтвердити ті переваги, про які, можливо, ви
чули.

Що таке SQLite?

SQLite — це вбудована бібліотека в якій реалізовано багато з
стандарту SQL-92. Її домаганням на популярність як є
власне сам движок бази, так і її інтерфейс (точніше його движок)
межах однієї бібліотеки, а також можливість зберігати всі дані в
одному файлі. Я відношу позицію функціональності SQLite десь між
MySQL і PostgreSQL. Однак, на практиці, SQLite не рідко виявляється в
2-3 рази (і навіть більше) швидше. Таке можливо завдяки
высокоупорядоченной внутрішньої архітектури та усунення необхідності
у сполуках типу > і >.

Все це, зібране в один пакет, лише трохи більше за розміром
клієнтської частини бібліотеки MySQL, є вражаючим досягненням
для повноцінної бази даних. Використовуючи високо ефективну
інфраструктуру, SQLite може працювати в крихітному обсязі виділюваної
для неї пам’яті, набагато менше, ніж у будь-яких інших системах БД. Це
робить SQLite дуже зручним інструментом з можливістю використання
практично в будь-яких завданнях покладених на базу даних.

Що мені користі від SQLite?

Крім швидкості і ефективності у SQLite є ряд інших переваг,
які роблять її ідеальним рішенням для багатьох завдань. Так як база
даних SQLite по суті своїй — звичайні файли, немає жодної
необхідності в додаткових коштах адміністрування потребують
багато часу на створення складної структури прав доступу для захисту
користувацьких баз даних. Все це вже автоматично підтримується
організацією доступу в самій файловій системі, це також
передбачає (в області обмеження простору), що не вимагається
ні яких спеціальних правил для відстеження заповнення дискового
простору користувачем. Перевага для користувачів у тому, що
є можливість створити таку кількість баз даних, яке вони собі
побажають плюс абсолютний контроль над усіма цими базами даних.

Факт, що база даних — це єдиний файл, робить її легко
переносимої. SQLite до того ж, усуває необхідність у запуску
додаткових службових процесів (daemons), які могли б
> значна кількість пам’яті та інших ресурсів, навіть в
разі помірного використання бази даних.

Розширення SQLite

В якості новітнього розширення БД SQLite пощастило бути
вільним від коду для зворотної сумісності, у протилежність
більш старим розширень, таких як MySQL, які зобов’язані
підтримувати застарілу функціональність з причин зворотного
сумісності. Це також дозволяє нового розширення використовувати
самі новітні розробки в PHP для досягнення найвищого рівня
виконання та функціональності. Розробники полегшили завдання
користувачам, створивши розширення легким для переходу до нього від інших
систем БД, залишивши інтерфейс схожим на ті, що вже були реалізовані в
PHP.

SQLite також підтримує гнучкий механізм для передачі ресурсів бази
даних процедурні інтерфейси, роблячи це однаково легким для
переходу з MySQL, де ресурс передається останнім, і PostgreSQL, де
він передається першим.

SQLite також відрізняє потужний об’єктно-орієнтований інтерфейс,
який може бути використаний для ефективного вилучення даних з
бази, позбавляючи вас від необхідності виконання вашої власної
оболонки для процедурного інтерфейсу. Як показано в прикладі нижче,
об’єктно-орієнтований інтерфейс також дозволяє вам уникнути
передачі всіх ресурсів купою.

query(«BEGIN;
CREATE TABLE foo(id INTEGER PRIMARY KEY, name CHAR(255));
INSERT INTO foo (name) VALUES(‘Ilia’);
INSERT INTO foo (name) VALUES(‘Ilia2’);
INSERT INTO foo (name) VALUES(‘Ilia3’);
COMMIT;»);
// виконуємо запит
$result = $db->query(«SELECT * FROM foo»);
// проходимо в циклі по клітинках
while ($result->hasMore()) {
// отримуємо поточну комірку
$row = $result->current();
print_r($row);
// переходимо до наступній комірці
$result->next();
}
// немає особливої необхідності, так як PHP сам розірве з’єднання
unset($db);
?>

Установка SQLite

В PHP 5.0 установка SQLite має свою особливість, так як і
розширення і бібліотека пов’язані разом, тому все, що вам
необхідно зробити — це додати -with-sqlite в рядку
конфігурування. Я б ще порекомендував встановити SQLite, але тільки
у разі якщо мова про откомпилированном бінарному файлі, що дозволить
вам відкривати базу і керувати нею без використання PHP. Це дуже
корисно для налагодження та виконання різних одночасних команд, а
також корисно для тестування коду запитів. В майбутньому, досить
часто ви зможете виявити, що пов’язана бібліотека SQLite трохи
«застаріла», тому зв’язка вашого PHP з зовнішньої бібліотекою дозволить
вам отримати вигоду з останніх виправлень і нововведень SQLite. Це
також дозволить вам в майбутньому оновлювати вашу SQLite без перекомпіляції
PHP.

Щоб зібрати розширення SQLite в якості зовнішньої бібліотеки, просто
використовуйте -with-sqlite=/path/to/lib/.

Мені також слід згадати, що розширення SQLite проходить
вичерпну серію тестів, як для об’єктно-орієнтованого, так і
для процедурного інтерфейсів. Тестуються кожна окрема функція, і
кожен метод підтримуваний SQLite. Це чудове джерело прикладів
не тільки того, як працює кожен метод і кожна функція SQLite, але
і очікуваного виводу, що дозволяє вам бачити кінцевий результат кожної
операції.

Використання SQLite

Процедурний інтерфейс до SQLite майже такий же, як у MySQL та інших
розширень БД. Здебільшого перехід до SQLite зажадає тільки
змінити mysql/pq/etc… префікс функції на sqlite.

1
[id] => 1
[1] => Ilia
[name] => Ilia
)
*/
}
// закриваємо з’єднання з базою
sqlite_close($db);
?>

Власне значні відмінності між SQLite та іншими базами даних
знаходяться в самому движку. На відміну від інших БД SQLite немає прив’язки
до типів; всі дані зберігаються як рядки закінчуються символом
NULL, що краще, ніж двійкове подання даних у стовпцях
спеціального типу. Через сумісності SQLite поки підтримує
тип специфікації в конструкціях CREATE TABLE, наприклад, такий як INT,
CHAR, FLOAT, TEXT і тому подібні, але реально їх не використовує. Всередині
бази, SQLite тільки робить розходження між рядковими і цілочисельними
даними під час сортування. Тому, якщо ви не збираєтеся
сортувати дані, ви можете обійтися без вказівки спеціального типу
полів при створенні таблиць в SQLite.

«Безтиповая природа» SQLite робить сортування і зіставлення даних у
деякому роді повільніше, так як кожен раз SQLite буде змушена
визначати тип даних і застосовувати або рядковий механізм
сортування/порівняння або числовий. SQL таблиці часто вимагають
автоматичний ключ для швидкого доступу до комірок,
маючи на увазі повернення посилання на останню додану клітинку. Для
SQLite цей синтаксис, м’яко кажучи, марний. Щоб створити таку
таблицю, вам знадобиться оголосити поле як INTEGER PRIMARY KEY, що
більш зручно, ніж вказівка спеціалізованого типу або присвоювання
додаткових властивостей, які вказують на те, що поле є
автоінкрементний.

Пов’язані запити

Як ви можете очікувати, SQLite несе в собі багато нових особливостей
поліпшують виконання і розширюють функціональність. Одна з таких
особливостей — можливість виконувати пов’язані запити, які
передбачають виконання множинних запитів через функцію
виконання одного запиту. Це знижує кількість задіяних
функцій PHP і таким чином збільшує швидкість роботи скрипта. А
також дозволяє вам легко групувати блоки запитів всередині
транзакцій, покращуючи виконання в подальшому. Така можливість може
бути значним фактором під час виконання численних звернень
на запис в базу. Однак існує кілька пікантних особливостей,
про які не слід забувати.

Якщо який-небудь запит в SQLite використовує введене
користувачем безпосередньо, вам слід вжити додаткових заходів
заходи для перевірки такого введення, щоб присікти
небажаний запит. В протилежність MySQL, де таке може
спричинити за собою лише непорозуміння при запиті до БД і видати помилку,
в SQLite це дозволить атакуючому виконати який-небудь запит на
вашому сервері з можливими трагічними наслідками. Якщо ви
додаєте запису через блок запитів і хотіли б повертати
ідентифікатор, то sqlite_last_insert_rowid() добре впорається з такою
завданням, але поверне ідентифікатор тільки останнього запису. З іншого
сторони, при спробі визначити яку кількість клітинок було змінено,
використовуючи sqlite_changes(), ми отримаємо результат, який містить загальні
число клітинок змінених усіма виконаними запитами. Якщо ваш блок
запитів містить SELECT, переконайтеся що це самий перший запит, в
інакше ваша остаточна вибірка не буде містити комірок,
повертаються цим запитом.

query(«BEGIN;
CREATE TABLE bar ( id INTEGER PRIMARY KEY, id2 );
INSERT INTO bar (id2) VALUES(1);
INSERT INTO bar (id2) VALUES(2);
COMMIT;»);
// надрукує «2 insert queries»
echo $db->changes().” insert queries”;
// надруковано: «last inserted row id: 2»
echo «last inserted row id: ».$db->last_insert_rowid();
?>

Нові функції

Крім своїх нових внутрішніх особливостей, SQLite пропонує ряд
нових функцій, які спрощують і прискорюють витяг даних з бази.

array_query(«SELECT * FROM foo», SQLITE_ASSOC);
print_r($result_array);
?>

Це дозволяє виконувати запит та отримувати дані одним викликом
функції, зводячи нанівець всю зайву роботу PHP. Сам по собі PHP скрипт
спрощується за рахунок використання всього однієї функції там, де інакше
б Вам довелося використовувати кілька функцій для отримання даних
працюють в циклі. У тих випадках, коли повертається результат тільки
одного стовпця, можна використовувати sqlite_single_query(), яка
миттєво повертає рядок або масив рядків в залежності від числа
осередків, з яких витягується інформація.

Як і у випадку з іншими особливостями, ви можете цим користуватися,
але вам не слід цим зловживати. У випадку вибірки всіх даних,
запитом в один прохід, ви повинні пам’ятати, що всі результати будуть
зберігатися в пам’яті. Якщо результат вибірки містить велику
кількість даних, ціна витрат на пам’ять безумовно зведе нанівець всі
переваги отримані шляхом зниження числа викликів функцій.
Отже, вам потрібно приберегти використання цих функцій для
випадків вибірки невеликої кількості даних.

Ітератори в SQLite

В PHP 5.0 є інший спосіб вибірки даних з використанням запитом
ітераторів.

unbuffered_query(«SELECT * FROM foo»);
foreach ($res as $row) { // отримуємо результат у циклі
// Код виведення
print_r($row);
}
?>

Отримання результатів в циклі працює точно так само, як і прохід по
масиву в циклі через foreach(), за винятком того, що в цей час
у вас немає доступу до ключів та значення являє собою масив,
містить дані в окремих клітинках. Так як ітератори це не функції,
а внутрішні вказівники у самому движку, вони вимагають набагато менше
ресурсів порівняно з функціями sqlite_fetch_*(), і не вимагають,
щоб результати кэшировались в пам’яті. Кінцевий результат буде
надзвичайно швидким, це більш простий і доступний метод вилучення
даних. Немає ні яких побічних ефектів у використанні ітераторів
об’єктів у SQLite, і коли б вам не знадобилося отримати результат в
вигляді безлічі рядків, вам потрібно обов’язково пам’ятати про такий
можливості.

Допоміжні функції

SQLite також відрізняє ряд допоміжних функцій, які можуть
стане в нагоді під час роботи з базою даних. Одна з таких функцій,
sqlite_num_fields(), може бути використана для визначення
кількість стовпців у спеціальних результати вибірки. Як варіант,
якщо ви збираєтеся отримувати дані, просто використовуйте count() з
першим результатом, яка поверне вам те ж саме число. Якщо
витягнуті як строковий, так і числовий ключі, вам знадобиться
відокремити результат, оскільки в результуючому масиві буде стільки
входжень скільки існує полів у таблиці. Це число може бути
важливо, якщо вашій скрипту необхідно отримати назви полів всередині
якийсь таблиці. У такому разі ви могли б використовувати
sqlite_field_name() в циклі, для доступу до цієї інформації, як
у наведеному нижче прикладі.

unbuffered_query(«SELECT * FROM foo LIMIT 1»);
// отримуємо кількість полів
$n_fields = $res->num_fields();
while ($i field_name($i++);
echo $field_name.””;
}
?>

Звичайно, це не ідеальний спосіб для отримання імен стовпців
таблиці, просто по тому, що він виявиться невдалим у разі, коли
таблиця не містить жодної клітинки, а також з того, що це
зажадає від вас вилучення даних, які ви не збираєтеся
використовувати. Набагато кращим рішенням буде використання функції
sqlite_fetch_column_types(), яка отримує стовпці разом з їх
типами з таблиці не залежно від того, чи є дані чи ні.

Перевага буферизації

У більшості випадків, з причин виконання або використання
пам’яті, ви не захочете використовувати запити без кешування. Це може
призвести до невеликої втрати функціональності, що може бути
необхідно в певних випадках, для яких запити без кешування
не завжди найкращий вибір.

Наприклад, припустимо, ви хотіли б з’ясувати реальну кількість
осередків, вибране Вашим запитом. У запиті без кешування, вам
доведеться робити вибірку кожної окремої клітинки, перш ніж ви зможете
її визначити. Кешированные ж запити — більш простий спосіб,
полягає у використанні функції sqlite_num_rows(), яка легко
отримати цю інформацію з результату вибірки. Запити без кешування
також обмежені в прямій вибірці даних, маючи на увазі, що ви зобов’язані
вибрати дані з усіх осередків за один прохід. У кешированных запитах
такого обмеження немає, ви можете використовувати sqlite_seek() для
зсуви на будь-яку клітинку та вибірки даних, або навіть для доступу
до клітинок у зворотному порядку, якщо це необхідно.

query(«SELECT * FROM foo»);
$n_rows = $res->num_rows(); // отримуємо число елементів вибірки
$res->seek($n_rows — 1); // переходимо до позиції наступної комірки
// вилучення даних у зворотному порядку
do {
$data = $res->current(SQLITE_ASSOC); // отримуємо дані комірки
print_r($data);
}
while ($res->hasPrev()&& $res->prev()); // і так до першої комірки
?>

Користувальницькі функції

Одна з найбільш цікавих можливостей у тому, що розширення SQLite
надає таблицю для можливості створення своїх власних
функцій використовуються в межах SQL. Це можливо завдяки тому, що
SQLite містить в одній бібліотеці пов’язаної з PHP, як інтерфейс, так
і сам движок бази. Використовуючи sqlite_create_function() ви можете
створювати функції, які в подальшому можуть бути застосовані до
результатом вибірки або використані всередині якої-небудь умови
WHERE.

create_function(‘char_compare’, ‘char_compare’, 2);

/* Виконуємо запит, де char_compare() використовується для порівняння
між name зазначеної рядком */
$res = $db->array_query(«SELECT name, char_compare(name, ‘Il2’) AS
sim_index FROM foo», SQLITE_ASSOC);
print_r($res);
?>

Можливість використання PHP, SQL дозволяє вам спростити даний
скрипт, роблячи його доступним більшої аудиторії розробників. Це
дозволяє використовувати PHP в якості движка шаблонів, який буде
вставити HTML-код в дані з бази. У багатьох випадках це може
спростити код так сильно, що не виникне необхідності в
використання додаткового движка шаблонів. Крім спрощення коду,
це також покращує виконання програми і знижує витрати скрипта на
пам’ять внаслідок того, що немає ні яких дій з даними,
відбуваються в користувацькому просторі.

Не забувайте, що в тому разі, якщо дані, з якими ви працюєте,
можуть містити двійковий код, вам слід використовувати функцію
sqlite_udf_decode_binary() для переведення їх з внутрішньої кодування,
якій вони зберігаються в SQLite, перш ніж працювати з ними. Якщо ви так
надійшли, вам знадобиться закодувати двійкові дані, використовуючи
sqlite_udf_encode_binary() для того, щоб бути впевненим, що дані
не будуть пошкоджені при наступному до них доступ.

Підіб’ємо підсумки

Тепер, подивившись як працює SQLite, і що вона може запропонувати, ви,
можливо, зверніть на неї увагу для використання в своїх поточних
або майбутніх додатках. Сподіваюся, цей короткий огляд дав вам деякий
уявлення про функціональність SQLite, і не розвіяв нічого з того,
що ви чули про неї гарного.

Як і будь-який інструмент, SQLite має свої сильні і слабкі сторони.
Будучи ідеальним рішенням для невеликих додатків та/або
призначених головним чином для зчитування даних, вона не дуже
добре підходить для великомасштабних додатків, часто виконують
запис в базу. Це обмеження — наслідок того, що архітектура
SQLite заснована на одному єдиному файлі, яка не
передбачає розподілу даних на багаторазово створювані файли,
а також використовує блокування на запис.

Про автора

Ilia Alshanetsky займається розробкою web-додатків більше 7 років,
головним чином на PHP. Останні кілька років він є активним
учасником розробки PHP та співавтором ряду розширень, в тому числі
SQLite. В даний час Ilia керує своєю власною компанією
«Advanced Internet Designs Inc.», яка спеціалізується на
розробці і підтримці FUDforum (http://fud.prohost.org/forum/),
форуму з відкритим кодом.

З ним можна зв’язатися по e-mail:

Оригінал статті знаходиться на сайті detail.phpclub.net,
© 1997-2004 PHPClubTeam

——————————————————————————–

Короткий вступ в SQLite

Переклад: Alexander Fedoroff

Оригінал статті доступний за адресою
php-mag.net/itr/online_artikel/psecom,id,447,nodeid,114.html
Автор: Wez Furlong

Що таке SQLite?

Так що таке SQLite? Це бібліотека, що підтримує більшість
специфікацій SQL92 і зберігає дані в єдиному файлі. Крім того,
бібліотека є і маленькою і швидкого (в деяких випадках швидше
MySQL і PostgreSQL), при цьому, не надто сильно збільшуючи обсяг
додатки (рахуючи в розмірі виконуваного коду та використаної пам’яті).
На відміну від інших БД SQL підтримуваних PHP, тут для управління БД
не створюється ніякого окремого процесу сервера — ваш додаток і
є сам сервер. Це означає, що одночасні запити (або
паралельні користувачі) повинні блокувати файл для безпечного
зміни БД. Даний пункт дуже важливий, оскільки безпосередньо
зачіпає сферу застосування SQLite — якщо в основному використовується
читання даних, тоді жодних проблем немає, але якщо необхідно робити
велика кількість одночасних оновлень, то додаток буде
витрачати більше часу на синхронізацію блокування файлів, ніж робити
справжню роботу.

Можливості SQLite:

* Підтримує більшу частину SQL92, включаючи тригери і транзанкции.
* Існує система відкоту, захищає цілісність даних
* Файли БД можуть спільно використовуватися між машинами з
різними запитами
* Підтримуються БД до 2 терабайт, займаючи при цьому невелику частину
пам’яті
* Відкриті вихідні коди

Чому варто використовувати SQLite, замість таких ДАНИХ, як MySQL,
PostgreSQL або Oracle? По-перше, з питань адміністрування –
ці БД частенько досить складні в установці, або вимагають
спеціальних прав доступу. Хостери, далеко не завжди надають
такі БД, або беруть за них окрему плату, що робить їх недоступними
для багатьох користувачів PHP. SQLite — це ідеальне вирішення проблеми,
т. к. не вимагає ніяких спеціальних прав доступу або конфігурації.
Зберігаючи дані в єдиному файлі, вона дозволяє в лічені секунди
«підняти» свою БД. SQLite — це вихід не тільки для людей використовують
дешеві тарифні плани, великі програми також можуть отримати свою
вигоду від її швидкості та універсальності, ми використовуємо SQLite на
php.net для пошуку Online керівництві (там генерується дуже
великий обсяг трафіку).

Установка SQLite

Досить розмов, давайте, нарешті, встановимо SQLite. На PHP 4.3.x
можна використовувати pear командний рядок, для розпакування та встановлення:

% pear install SQLite

У бетах і snapshot’ах PHP 5, SQLite включена в дистрибутив пз
промовчанням.

Утиліта pear сама завантажить пакет, скомпилирует і встановить його. Вам
можуть знадобитися права рута або адміністратора для установки даного
модуля. Користувачі Windows можуть завантажити вже скомпільовані
бінарники з snapshot’ів PHP на сайті (посилання вказана в кінці статті).
На скріншотах показано, що виводиться після обробки команди pear
install sqlite, нудний проміжок інсталяції не включений. Варто
зауважити, що дані які будуть виводитися — залежать від
операційної системи і встановленого програмного забезпечення.

Після компіляції й інсталяції, треба підредагувати php.ini для
завантаження модуля (PHP5 нічого редагувати не треба):

; завантаження SQLite (UNIX)
extension=sqlite.so
; для користувачів windows
; extension=php_sqlite.dll

Прив’язка модуля SQLite до PHP служить тільки для створення і роботи з БД
SQLite. В нього не включена консоль — з допомогою який можна було б
гратися зі своєю БД. Якщо ви любитель консолі MySQL або PostgreSQL,
то можете встановити повний дистрибутив SQLite з сайту — посилання
наприкінці статті.

Використання SQLite

Програмний інтерфейс для SQLite подібний MySQL і PostgreSQL, хоча і
трохи відрізняється. Одна з моїх цілей при написанні модуля була в
тому, щоб не робити великої відмінності між API бібліотеки C і
відкритими функціями PHP, так що згадаєте це коли задастеся
питанням, чому деякі функції відрізняються вони відрізняються тому
що бібліотека SQLite відрізняється, а не тому що я захотів назвати їх
по-іншому. 😉

Я вже згадував, що SQLite підтримує більшість специфікацій SQL92
— повний синтаксис SQL можна знайти на сайті SQLite (посилання в кінці
статті). Однак, головна відмінність між SQLite та іншими БД SQL — в
SQLite немає типів даних. Всі поля зберігаються з нульовим роздільником
рядків, замість, наприклад, бінарного представлення цілого числа. При
створення таблиці, можна використовувати будь-який з типів даних VARCHAR,
TEXT, INTEGER, FLOAT і т. д., але в цілому вони будуть проігноровані
движок SQLite — фактично їх не можна писати в конструкції CREATE
TABLE, якщо так більше подобається. Тип даних стовпця або виразу
дійсно важливий тільки при сортуванні та порівняння даних, тоді
движок визначає стовпець або вираз як тестове або числове.
Якщо тип текстовий використовується бінарне порівняння, якщо ж
числовий тип, то значення перетворюється в число з плаваючою точкою
і порівнюється як число. Досить розмов — час написати
трохи коду. На лістингу 1 показаний скрипт створює БД, таблицю,
який вставляє деякі дані і отримує їх назад.

Лістинг 1. Демонстрація основних можливостей.

‘Wez Furlong’,
[email protected]’ => ‘Marcus Boerger’,
[email protected]’ => ‘Derick Rethans’,
// вибачаюся перед іншими розробниками PHP
// за те, що їх не в списку…
);
foreach ($data as $email => $name) {
$email = sqlite_escape_string($email);
$name = sqlite_escape_string($name);
sqlite_query($db,
«INSERT INTO sample(email, name) „
.“VALUES (‘$email’, ‘$name’)»);
}
// висновок
$res = sqlite_query($db, «SELECT name, email from sample»);
if (!$res) {
// це не повинно статися 🙂
echo «No data»;
} else {
while ($row = sqlite_fetch_array($res)) {
echo «row: $row[name] -> $row[email]»;
}
}
?>

На лістингу 1 показано чотири функції SQLite — чотири найбільш часто
використовувані функції. Перша з низ sqlite_open, яка повертає
ідентифікатор з’єднання з БД. На відміну від інших БД, в SQLite
віддалено не можна отримати доступ до файлу, так що не потрібно ніяких
додаткових заходів захисту. Існують додаткові параметри, але
швидше за все вони вам не потрібні. sqlite_open відкриває
існуючу БД, або створює нову, якщо такої ще немає. Варто
пам’ятати, що ви повинні мати права на запис у каталог, де створюється
БД. Наступна функція sqlite_query, яка виконує запит і
повертає ідентифікатор результату. Sqlite_query може виконує
кілька запитів розділених крапкою з комою, що дуже корисно при
імпорт з файлу. Sqlite_query повертає false при помилці
запиту, ідентифікатор результату для SELECT, або істина для UPDATE
DELETE. При успішному виконання запиту обчислене значення
невизначено (хоча воно і не брехня).

Важливо екранувати дані, які ви вставляєте — не стільки, щоб
уникнути синтаксичних помилок, скільки щоб уникнути атак використовуючи
SQL. Використання addslashes — не самий правильний шлях для
екранування даних SQLite, замість цього необхідно використовувати
sqlite_escape_string. sqlite_escape_string виконує деякі
«магічні» дії над рядком, якщо вона виглядає як двійкові
дані — але це ми обговоримо в наступній частині статті. Остання
функція, це sqlite_fetch_array, яка витягує поточну запис з
допомогою ідентифікатора результатів. Вона працює майже так само, як і
mysql_fetch_array в MySQL.

Це було просто — мені треба більше!

Перед тим як показати інші приклади використання SQLite, ми
розглянемо ще кілька корисних функцій і можливостей.

Кожен користувач повинен мати автоматичний цілочисельний
ідентифікатор рядка у своїй таблиці — зазвичай це реалізовано якимось
полем з автоматичним збільшенням лічильника. В SQLite є ця
можливість — фактично, кожна рядок у кожній таблиці отримує свій
автоматичний ідентифікатор, чимось схожий на PostgreSQL, це
практичніше ніж явно вказувати поле з автоматичним збільшенням. На
лістинг 2 показано як потрібно створювати таке поле.

Лістинг 2: Створення поля автоматично збільшується лічильником

CREATE TABLE ideas(
— idea_id поле автоматично збільшується лічильником
idea_id INTEGER PRIMARY KEY,
— деталі ідеї
idea_body TEXT,
— як добре вона працює
success_rating INTEGER
);

Коли ви вставляєте рядок з нульовим значенням idea _id, SQLite
автоматично присвоїть полю наступне значення лічильника. Якщо ви
хочете запитати про рисках перед другою, третьою і п’ят рядками –
це стандартний спосіб написання коментарів в SQL. Якщо ж ви не
хочете використовувати автоматичне збільшення, то є два шляхи –
оголосити поле як INT PRIMARY KEY чи завжди вказувати значення для
стовпця. Всякий раз після автоматичного збільшення — можна
згенерувати останнє значення лічильника функцією
sqlite_last_insert_rowid в PHP, або функцією SQL last_insert_rowid,
використовуючи її безпосередньо у запиті. Інша функція того ж
порядку, як і sqlite_last_insert_rowid — це sqlite_changes,
повертає кількість рядків змінених останнім запитом (подібно
mysql_affected_rows).

Лістинг 3: Додавання елемента в базу БД і отримання його номери

Idea $id added; changes = $changes
“;
} else {
?>

Безпосереднє використання

Настав час для прикладів безпосереднього використання SQLite.
Люди роблять перші кроки в створенні web-сайтів, частенько бажають
створити гостьову книгу. Для досвідчених програмістів PHP це досить
тривіальна річ — але для новачків складне завдання. Ймовірно, досвідчений
програміст вирішив би її, використовуючи модуль dba, чи створив би файл
власного формату, щоб працювати з ним fopen. Обидва методи будуть
працювати скрізь, де є PHP), але складні, якщо ви хочете в подальшому
додавати якісь нові можливості до гостьової книги. Створення свого
формату файлу не настільки актуально, якщо існує можливість
подальшого розвитку програми. Використовуючи SQLite вам не потрібно
замислюватися як воно працює, або які типи даних використовувати, адже
SQLite як і PHP — є безтиповым. Давайте, нарешті деталізуємо
нашу гостьову книгу. По-перше, ми хочемо знати що-небудь про
відвідувачів, ця інформація буде включати в себе їхні імена і e-mail.
Також ми хотіли б дізнатися адресу їх web-сайту. І звичайно найважливіша
річ — це коментарі, які вони залишають для вас, і ймовірно дата
записи.

Т. к. SQLite безтиповая, то вона не має ніякого спеціального формату
для часу, дати і функцій їх обробки. Спершу, це здається
трагедією, але фактичні нічого страшного тут немає. Мені в голову
приходять два рішення — перше, це зберігати значення time_t в базі
даних. Time_t — це тип даних, що містить UNIX timestamp –
ймовірно, ви знайомі з цим типом даних, тому що функція time() PHP
повертає аналогічне цілочисельне значення. Просто створіть
ціле поле в своїй БД, і зберігайте значення time() коли
вставляє запис. Альтернативний шлях — це зберігати дату як рядок в
форматі ISO, наприклад «2003-09-21 15:13:12». Обидва варіанти сортуються
правильно при використанні ORDER BY в запиті. Перший варіант дуже
простий для роботи, порівнювати час і обчислювати проміжки, можна
використовуючи звичайну математику, а при форматуванні можна використовувати
цілу групу функцій PHP. Використання формату ISO є більш
портативним, але в теж час вам потрібно буде писати власні
функції для обробки рядків. Оскільки ми прагнемо до простоти, то будемо
використовувати UNIX timestamp. Тепер можна написати трохи прикладів –
у лістингу 4 показані функції відкриття файлу, додавання нового запису
і виводу на екран.

Лістинг 4: функції гостьової книги

dateGuest”;
while ($row = sqlite_fetch_array($q, SQLITE_ASSOC)){
echo “”;
echo “”. strftime(“%c”, $row[‘posted’]). “”;
echo “”. htmlentities($row[‘name’]). ‘
‘;
if (strlen($row[‘web’])) {
echo “”. htmlentities($row[‘web’]). “
“;
}
echo “”
. htmlentities($row[‘comment’])
. “”;
echo “”;
}
echo “”;
}
?>

Проникливий читач помітить, що додалася нова функція
gb_open(), створена для того щоб відкрити нашу БД і повернути
ідентифікатор з’єднання. Вона також перевіряє, чи була вже встановлена
БД — робиться це запрашиванием мета даних з таблиці sqlite_master.
Це спеціальна таблиця, що зберігає структуру таблиці та інші мета
дані. Функція gb_open() перевіряє існування таблиці guest, якщо
отримано від’ємний результат, то ми повинні створити цю таблицю. Вам
не обов’язково використовувати окрему функцію для цього, але ми
знову-таки йдемо по шляху спрощення — користувач хоче тільки
завантажити файл, не хвилюючись про труднощі налаштування. Є ще дві
функції gb_add() і gb_show(). Gb_add() створює новий запис у гостьовій
книзі, а gb_show() всі існуючі записи. Лістинги 5 і 6 показують
ці функції використовуються, я спеціально опустив всі HTML-теги для
зручності.

Лістинг 5: guestbook.php

Add a comment!

Name:

Email:

Home page:

Comments:

Лістинг 6: new.php

Ідея в тому, що відвідувач відкриває guestbook.php бачить список
коментарів, і форму для додавання свого запису. Форма передає
дані скрипту new.php, які створює новий запис і направляє
назад у guestbook.php. Якщо все пройшло успішно, тоді запис
з’явиться з самого верху сторінки. Переадресація дозволяє уникнути
попереджень про закінчення терміну «життя» сторінки, зменшує
кількість запитань від користувачів і дублювання записів
користувачів.

Підсумки

Якщо ви думаєте «Я не можу в це повірити, він писав тільки про
гостьовій книзі», не хвилюйтеся, я теж не можу. Моє божевілля є
пояснення, більшість речей, які ви напишіть на PHP — це будуть
просто просунуті гостьові книги. Без сумніву, деякі з вас
кажуть — «Ні»! Моє додаток XYZ — набагато більше, ніж просто
гостьова книга, в неї є можливість J, L і K! Добре, це правда.
Всі ваші додаткові можливості (які зберігають/відновлюють
дані) — не набагато більше, ніж просто гостьова книга. Як тільки ви
усвідомили це, то можете використовувати цей метод для інших додатків
PHP. Придумали що? SQLite зможе зробити це запросто. Якщо ви
написали такий же код на MySQL або PostgreSQL, то повинні подбати
про ім’я БД, дозволах, імен користувачів і паролів. Фактично,
хвилюватися про людину встановлює вашу гостьову книгу,
хвилюватися про імена користувачів і паролі. Оскільки підтримка
кінцевого користувача займає досить багато часу (та й
дорого), за цим цим не люблять займатися — тому що завжди приємно,
коли цього можна уникнути. Ціла ланцюжок такого обслуговування і
інсталяції описана на початку статті, вигідно відрізняє SQLite від
інших БД. І не варто думати, що SQLite підходить тільки для написання
гостьових книг — ви можете створювати додатки в дусі реляційних БД.
У статті 2 я навчу вас, як написати UDF (user defined functions,
функції визначаються користувачем) для використання в SQLite і
демонструють обробку числових масивів більш 64КБ.

Я сподіваюся, що стаття виявилася вам корисною, так само сподіваюся, що
друга частина статті буде настільки ж корисною!