Від автора: при розробці веб-додатків завжди виникає питання, де і в якому вигляді зберігати дані. Звичайно ж їх можна зберігати в базі даних, або в текстових файлах використовуючи спеціальні роздільники. Але що робити, якщо Ви хочете зберігати інформацію в базі даних, а додаток у Вас дуже просте. У цьому випадку нераціонально використовувати цілий сервер бази даних MySql.
В уроці ми з Вами познайомимося ще з однією базою даних, дуже швидкої і дуже простий, якій не потрібен окремий сервер для роботи.
План уроку
1. Введення
2. Підключення модуля бази даних sqlite
3. Створення бази даних і таблиць
4. Заносимо дані в базу даних
5. Висновок інформації з бази даних
Деталі підручника
Тема: PHP
Складність: Середня
Урок: Відео (.mp4)
Час: 01:38:51
Розмір архіву: 110 Mb
1. Введення.
Для початку давайте визначимося, що ж таке база даних Sqlite і які в неї переваги перед базами даних серверного типу.
Sqlite – це вбудована реляційна база даних, з відкритим вихідним кодом. Тобто вона не використовує звичну нам модель роботи бази даних клієнт-сервер і не є окремим працюючим процесом. Наприклад, база даних Mysql. Іншими словами движок Sqlite стає як би частиною нашого веб-додатки. При такому підході база даних Sqlite (з усіма таблицями) являє собою звичайний текстовий файл, який ви можете розташувати в зручному для Вас місці.
Тепер давайте розглянемо основні переваги Sqlite.
Самодостатність – базі даних Sqlite не потрібен окремий сервер для роботи. Движок Sqlite вбудовується прямо в додаток і потребує лише доступ до файлів.
Простота встановлення та налаштування нової бази дуже проста і не потребує втручання системних адміністраторів.
Встроєний – движок Sqlite повністю вбудований в PHP 5 і не потрібна установка додаткового програмного забезпечення.
Надає як процедурний, так і об’єктно-орієнтований інтерфейс для роботи.
Висока продуктивність – двигун споживає дуже мало ресурсів і не витрачається час на відправку даних до окремого виділеного сервера.
Sqlite чудово підходить для веб-додатків, коли основна маса запитів являє собою запити на читання також дуже добре підійде для невеликих проектів, які в подальшому Ви збираєтеся розвивати. Так як Sqlite працює з такими ж SQL запитами, що і бази даних серверного типу а це дає нам можливість легко перейти на іншу базу даних, не вносячи кардинальних змін у логіку веб-додатки (особливо використовуючи розширення PDO).
Отже, давайте приступимо до вивчення бази даних sqlite. Я пропоную створити невеликий простенький сайтик на її основі, тим самим ми на практиці можемо навчитися з нею працювати.
2. Підключення модуля бази даних sqlite
Для початку необхідно переконатися, що модуль бази даних sqlite, підключений у файлі php.ini. Для цього відкрийте цей файл (для тих, у кого встановлений Денвер, файл знаходиться за адресою \usr\local\php5\php.ini) та знайдіть рядок:
;extension=php_sqlite.dll
Далі просто приберіть крапку з комою на початку рядка, збережіть зміни у файлі і перезавантажте сервер Apache (або Денвер), у вас рядок повинна бути ось такого вигляду:
На реальних серверах (хостингах) цей модуль вже поключен.
3. Створення бази даних і таблиць.
Насамперед необхідно створити базу даних і необхідні таблиці в ній. Для цього давайте створимо файл config.php, в якому створимо константу DB_NAME для зберігання імені бази даних. Ось код файлу config.php:
Як я і говорив на початку, база даних sqlite – це звичайний текстовий файл (спеціально відформатований), тому вказуючи ім’я бази даних, не забувайте вказувати розширення, в моєму випадку це .db, але це не принципово, розширення можна ставити яке завгодно.
Тепер давайте створимо файл install.php, в якому і створимо базу даних з необхідним набором таблиць. Для цього відкриваємо в файлі PHP –теги і починаємо кодувати. Для початку підключимо файл конфігурації config.php:
include ‘config.php’;
Потім створимо базу даних, використовуючи функцію sqlite_open(‘ім’я бази даних’). Якщо бази даних ще не існує, то ця функція створює базу даних з іменем переданим їй параметром, відкриває її для роботи і повертає дескриптор підключення (в нашому випадку дескриптор зберігся в змінну $db). Якщо ж база даних існує функція просто відкриває базу даних і повертає дескриптор підключення. Нижче наводжу код, необхідний для створення бази даних:
$db = sqlite_open(DB_NAME);
if(!$db) {
exit(‘ERROR’.sqlite_error_string(sqlite_last_error($db)));
}
echo ‘База даних ‘.DB_NAME. ‘ створена
‘;
Як Ви бачите, я після виклику функції sqlite_open(ім’я бази даних), зробив невелику перевірку – на те не виникли при створенні бази даних помилки. Якщо виникла помилка, то відбувається вихід з скрипта з виведенням помилки тексту на екран.
Для виведення помилок бази даних sqlite на екран необхідно використовувати дві функції. Перша це функція: sqlite_last_error(дескриптор підключення до бази), яка повертає код помилки. Друга — sqlite_error_string(код помилки), яка розшифровує код помилки, і повертає безпосередньо текст помилки.
Тепер давайте перейдемо в браузер і запустимо файл install.php. На екрані з’явилася рядок — База даних mydb.db створена. Тепер подивіться в папку де розташовується наш скрипт і Ви побачите що був створений текстовий файл База mydb.db – це і є наша база даних.
Тепер необхідно створити дві таблиці: таблицю menu для зберігання пунктів меню і таблицю articles для зберігання, якихось статей нашого міні-сайту. Першим ділом створимо таблицю menu. Ось код для її створення:
// запит до бази даних
$sql = “CREATE TABLE articles
(
id_articles INTEGER PRIMARY KEY,
name_articles,
text_articles
);
“;
//виконуємо запит
$result = sqlite_query($db,$sql);
if(!$result) {
exit(‘ERROR’.sqlite_error_string(sqlite_last_error($db)));
}
else {
echo ‘Таблиця articles створена
‘;
}
Як Ви бачите, насамперед створюємо sql запит до бази даних. Він дуже схожий на запит до бази даних MySql. Але є відмінності в оголошенні типів даних, які повинні зберігається в стовпцях таблиці. У найпростішому випадку типи даних можна взагалі не вказувати, при цьому дані будуть вставлені рядки. База даних sqlite версії 2 мала всього кілька типів даних, а саме INTEGER та текстовий тип даних для зберігання великих обсягів тексту.
У більш старших версіях, починаючи з версії 2.7.0 були введені різні типи текстових полів, такі як BLOB, CHAR, CLOB, TEXT, у версії 3.0 створені спеціальні класи даних NULL, INTEGER, REAL,TEXT, BLOB, які включають в себе додаткові типи даних.
Але в будь-якому разі типи даних в базі даних sqlite – декларативні, тобто якою б не був вказаний стовпцю клас – в нього можна покласти будь-які дані, як текстові, так і числові. Виняток становить тільки поля, у яких призначений тип даних INTEGER PRIMARY KEY, — цей запис означає, що поле є первинним ключем і тип даних у ньому обов’язково повинен бути числовим. При цьому поле автоматично отримує властивість AUTOINCREMENT.
Після створення запиту до бази даних, необхідно його виконати. Для цього застосовуємо функцію sqlite_query(дескриптор підключення, запит). Ця функція аналогічна функції mysql_query() – тобто вона виконує запит до бази даних і повертає результат запиту. Першим параметром їй передаємо дескриптор підключення до бази даних, другим – безпосередньо сам запит. Потім виконуємо стандартну перевірку на наявність помилок.
Давайте перейдемо в браузер і подивимося що у нас вийшло. Після оновлення сторінки на екрані з’являється рядок – Таблиця articles створена. Значить все правильно.
Тепер створимо другу таблицю menu. Ось код для її створення:
// запит до бази даних
$sql2 = “CREATE TABLE menu
(
id_menu INTEGER PRIMARY KEY,
name_menu,
link_menu
)
“;
//виконуємо запит
$result2 = sqlite_query($db,$sql2);
if(!$result2) {
exit(‘ERROR’.sqlite_error_string(sqlite_last_error($db)));
}
else {
echo ‘Таблиця menu створена
‘;
}
Як Ви бачите тут все аналогічно таблиці articles. Тепер давайте наведу весь код файлу install.php:
‘;
// запит до бази даних
$sql = “CREATE TABLE articles
(
id_articles INTEGER PRIMARY KEY,
name_articles,
text_articles
);
“;
//виконуємо запит
$result = sqlite_query($db,$sql);
if(!$result) {
exit(‘ERROR’.sqlite_error_string(sqlite_last_error($db)));
}
else {
echo ‘Таблиця articles створена
‘;
}
// запит до бази даних
$sql2 = “CREATE TABLE menu
(
id_menu INTEGER PRIMARY KEY,
name_menu,
link_menu
)
“;
//виконуємо запит
$result2 = sqlite_query($db,$sql2);
if(!$result2) {
exit(‘ERROR’.sqlite_error_string(sqlite_last_error($db)));
}
else {
echo ‘Таблиця menu створена
‘;
}
sqlite_close($db);
echo ‘База даних закрита…’;
}
else {
exit(‘База даних вже існує’);
}
?>
Зверніть увагу, я зробив ще одну перевірку на існування файлу бази даних. Якщо його немає, то ми створюємо базу даних і необхідні таблиці, якщо ж він є, то виводимо на екран повідомлення ‘База даних вже існує’. В кінці просто закриваємо з’єднання з базою даних за допомогою функції sqlite_close(дескриптор підключення); Давайте перейдемо в браузер і подивимося що вийшло:
Як бачите, база даних створена з двома табличками.
4. Заносимо дані в базу даних.
Тепер, коли у нас є база даних необхідно наповнити її. Для цього пропоную зробити дуже просту адміністраторську панель для нашого сайту. В якій, буде всього дві форми для додавання даних. Перша для додавання пунктів меню, друга для додавання статей.
Давайте створимо файл admin.php з таким вмістом:
Admin panel
ADMIN PANEL
Додавання нової статті
Name article
Text
Як Ви бачите – звичайна html-розмітка, дві форми укладені в загальний контейнер, невелика шапка і футер. Так само зверніть увагу, що я підключаю файл стилів style.css, який необхідно створити. Ось його код:
#insert_menu {
width:300px;
float:left;
padding:10px;
}
#insert_articles{
width:300px;
float:left;
padding:10px;
border-left:1px solid #074776;
margin-bottom:20px;
}
h2 {
border-bottom:20px solid #d3d3d3;
}
#wrap{
width:950px;
margin:0px auto 0px auto;
border:1px solid #074776;
padding:10px;
}
#footer {
clear:both;
text-align:center;
border-top:20px solid #d3d3d3;
}
Тепер якщо набрати в браузері тільки що створений файл admin.php ми побачимо наступне:
Тепер давайте створимо файл functions.php, в якому ми будемо зберігати наші користувальницькі функції. Перша функція, що ми опишемо буде функція очищення даних clear($str), так як нас приходять дані з форми, а їх необхідно фільтрувати. Отже, код функції:
function clear($str) {
$str = trim($str);
$str = strip_tags($str);
//перевіряємо чи включена директива конфігурації magic_quotes_gpc
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
$str = sqlite_escape_string($str);
return $str;
}
Як Ви бачите, все просто, стандартні функції. Але тут є одне зауваження: не рекомендується вставляти дані в базу даних, у яких екрановані спецсимволи за допомогою функції addcslashes(). Тому перевіряємо, якщо у користувача включено екранування спецсимволов (директива конфігурації magic_quotes_gpc), то прибираємо екрануючі бэкслэши за допомогою функції stripslashes($str). Для екранування спецсимволов у бази даних sqlite є своя функція sqlite_escape_string(рядок), яка екранує спецсимволи в рядку для подальших запитів.
Повертаємося в файл admin.php і створимо обробник форми, ось його код (вставляємо перед тегами html):
Отже, на початку відкриваємо сесію – для системних повідомлень. Потім підключаємо файл functions.php. Далі якщо була відправлена форма, спочатку відкриваємо базу даних, очищаємо отримані дані і викликаємо функцію insert_menu ($db,$name_menu,$link_menu), яка вставляє дані в базу даних (ми її трохи пізніше опишемо). Функція приймає три параметри: перший дисриптор підключення до бази даних, другий і третій дані які потрібно вставити. Вона буде повертати TRUE, якщо дані успішно вставили в базу, і повідомлення про помилку, у разі невдалої вставки даних.
Тепер поки у нас відкритий файл admin.php давайте вставимо висновок системних повідомлень, які будуть зберігається в сесії. Цей код вставляємо після заголовка другого рівня ADMIN PANEL:
Тепер відкриваємо файл functions.php і описуємо функцію insert_menu():
function insert_menu($db,$name_menu,$link_menu) {
//SQL запит
$sql = “INSERT INTO
menu(name_menu,link_menu)
VALUES(‘$name_menu’,’$link_menu’)”;
//виконуємо запит
$result = sqlite_query($db,$sql);
if($result) {
return TRUE;
}
else {
return ‘Помилка виконання запиту ‘.sqlite_error_string(sqlite_last_error($db);
}
}
Як Ви бачите, дані в базу даних sqlite вставляються точно також як і в базу даних mysql. Дивіться, точно такий же SQL-запит, єдина відмінність – це те, що ми використовуємо функцію sqlite_query() для виконання запиту. Якщо запит успішно виконаний повертаємо TRUE, якщо ні, то повертаємо повідомлення про помилку. Давайте перейдемо в браузер і спробуємо додати дані в таблицю menu. Запускаємо файл admin.php і вводимо дані в форму. Після натискання на кнопку відправки форми, на екран виводиться напис що дані успішно додані.
Тепер залишилося реалізувати додавання статей в базу даних. Для цього створимо функцію insert_articles(), яка аналогічно функції insert_menu(), буде вставляти дані в базу, і повертати при цьому або TRUE, або повідомлення про помилку, в залежності від результату.
Ось код функції insert_articles() (вона також приймає три параметри: перший-це дескриптор підключення, другий і третій дані які необхідно вставити в базу):
function insert_articles($db,$name_articles,$text_articles) {
//SQL запит
$sql = “INSERT INTO
articles(name_articles,text_articles)
VALUES(‘$name_articles’,’$text_articles’)”;
$result = sqlite_query($db,$sql);
if($result) {
return TRUE;
}
else {
return ‘Помилка виконання запиту ‘.sqlite_error_string(sqlite_last_error($db);
}
}
Як Ви бачите тут все аналогічно. Тепер повертаємося в файл admin.php і додаємо обробник для другої форми. Для цього вставляємо наступний код, відразу після закриваючої дужки умовного оператора if, який перевіряє, чи існує у масиві POST осередок з ключем $_POST[‘submit_menu’]:
if(isset($_POST[‘submit_articles’])) {
//Очищаємо отримані дані
$name_articles = clear($_POST[‘name_articles’]);
$text_articles = clear($_POST[‘text_articles’]);
//вставляємо дані в базу даних
$msg = insert_articles($db,$name_articles,$text_articles);
if($msg === TRUE) {
$_SESSION[‘msg’] = ‘Стаття додано’;
}
else {
$_SESSION[‘msg’] = $msg;
}
}
Тобто, просто кажучи, перевіряємо натиснута кнопка відправки форми. Якщо так то очищаємо дані і викликаємо функцію insert_articles().
Тепер давайте спробуємо додати текст в базу. Після відправки форми на екран вывелось сообщене Стаття додана, значить ми все робимо правильно.
5. Висновок інформації з бази даних.
Тепер, коли дані додані в базу даних, давайте реалізуємо висновок даних на екран. Для цього створимо файл index.php ось з такою html-розміткою:
Ласкаво просимо
Visitka
І в файл style.css додамо кілька правил:
#menu {
width:200px;
float:left;
}
#text {
float:left;
width:700px;
border-left:2px solid #d3d3d3;
padding:10px;
}
#header{
height:150px;
width:100%;
border-bottom:20px solid #d3d3d3;
}
h1 {
text-align:center;
}
Як Ви бачите, нічого складного тут немає звичайний html і css. Тепер давайте перейдемо в браузер і подивимося що у нас вийшло:
Тепер повернемося до файлу index.php і перед html – розміткою відкриємо php теги. Потім відкриємо сесію, підключимо конфігураційний файл і файл functions.php, відкриємо базу даних для роботи і викличемо функцію get_menu(), яка буде повертати масив пунктів меню, що зберігаються в базі даних, і функцію get_articles(), яка буде повертати масив статтей. Ось цей код:
Тепер перейдемо в файл functions.php і опишемо функції get_menu() і get_articles(). Ось код для цих функцій:
function get_articles($db) {
// SQL – запит
$sql = “SELECT id_articles,name_articles,text_articles articles FROM”;
//виконуємо запит і повертаємо асоциативный масив даних
$result = sqlite_array_query($db,$sql,SQLITE_ASSOC);
if(!$result) {
return FALSE;
}
return $result;
}
function get_menu($db) {
// SQL – запит
$sql = “SELECT name_menu,link_menu FROM menu”;
//виконуємо запит і повертаємо асоциативный масив даних
$result = sqlite_array_query($db,$sql,SQLITE_ASSOC);
if(!$result) {
return FALSE;
}
return $result;
}
Як Ви бачите, функції приймають параметром дискриптор підключення до бази даних. Давайте поясню роботу функцій на прикладі функції get_menu(), так як функція get_articles() — аналогічна їй.
Як зазвичай формуємо SQL – запит, він точно такий же як і в базі даних Mysql. Вибираємо поля name_menu і link_menu з бази даних menu. Далі зверніть увагу на дуже цікаву функцію sqlite_array_query(дескриптор, SQL – запит, параметр як повертати дані). Такої функції немає в базі даних Mysql!!. Дивіться — ця функція виконує переданий їй SQL – запит і відразу ж повертає вже готовий реальний масив даних (у нашому випадку асоціативний так як ми передали їй константу SQLITE_ASSOC, що означає повернути дані у вигляді асоціативного масиву). Так що нам залишається лише повернути цей масив даних.
Звичайно ж, можна було скористатися функцією sqlite_query(), а потім в циклі отримати асоціативний масив за допомогою функції sqlite_fetch_array(результат виконаного запиту, параметр як повертати дані), яка виконує абсолютно ті ж дії, що і для бази даних mysql(mysql_fetch_array()).
Але, погодьтеся, використовувати функцію sqlite_array_query() набагато зручніше і швидше.
Тепер, коли у нас є дані у вигляді масивів, залишилося тільки їх вивести на екран за допомогою циклу foreach. Ось код, який потрібно вставити в файл index.php в блоки div з ідентифікаторами menu і text відповідно:
Для блоку menu
“;
foreach($menu as $item) {
echo “
“;
}
echo “
“;
}
?>
Для блоку text
“.$item2[‘name_articles’].”
“;
echo “
“.$item2[‘text_articles’].”
“;
}
}
?>
Отже, перейдемо в браузер і подивимося що вийшло:
Як Ви бачите дані успішно вивелися на екран.
Отже у цьому відео уроці ми з вами коротко розглянули базу даних Sqlite. Ми навчилися створювати базу даних, додавати в неї необхідні таблиці, вставляти дані а також навчилися виводити дані на екран. Основні базові операції з движком Sqlite ми з Вами вивчили, решта ж такі як і в базі даних Mysql (наприклад, для видалення чи оновлення даних — потрібно все також скласти SQL запит а далі просто його виконати за допомогою функції sqlite_query()).
Дивіться, як швидко ми з Вами створили цей міні сайтик, на основі бази даних Sqlite, тепер при перенесенні такого сайту на хостинг або на інший комп’ютер, достатньо лише скопіювати папку з сайтом, і на цьому все. База даних також з копіюється так як це звичайний текстовий файл.
На цьому урок закінчений. Якщо виникнуть питання пишіть, постараємося на них відповісти! А на цьому все. Вдалого Вам кодування і до нових зустрічей.