Файл вместо базы данных.
И да! Мой сайт на 100% сделан на файлах!
Файл ".dat" вместо базы данных.
- "База данных MySQL" или база данных на файле?
- Главная проблема файла, как базы данных.
- Основные параметры базы данных в файле.
- О моей системе хранения данных.
Построчно(предыдущий вариант.)
-
Основные параметры базы данных в файле.
Давайте выведем концепцию - "хранения данных в файле". Информация будет о моём сайте, что используется прямо сейчас.
О чем вообще будем говорить, что это значит "хранения данных в файле"?
Что будет храниться в файле вместо базы данных?
Файл базы данных(формат файла ".dat"), где будет краткая информация о странице.
Формат хранения ассоциативный массив.
Какие еще бывают способы хранения базы данных в файле.
Контент будет храниться отдельно, в файлах
Где можно посмотреть пример вывода из файла базы данных?
На главной - выводится всегда первая ячейка массива. Смотри "ПОСЛЕДНЯЯ ОПУБЛИКОВАННАЯ СТАТЬЯ".
Все страницы - по мере добавления "https://dwweb.ru/blog.html" - новые сверху.
1). Все страницы списком: https://dwweb.ru/?spisok=all
2). Сортировать по возрастанию : https://dwweb.ru/?spisok=all&sort=up
3). Сортировать по убыванию: https://dwweb.ru/?spisok=all&sort=down
Страницы тем, всё что начинается с "tema=" : https://dwweb.ru/?tema=php
1). Также все типы сортировок, что перечислены в пункте 2, в пунктах "tema=" - аналогичная...
Страницы поиска : https://dwweb.ru/?search=Файл+вместо+базы
Какие еще бывают способы хранения базы данных в файле
Кроме выше упомянутого способа хранения данных базы в файле в ассоциативном массиве.
Первая версия была построчно - это по аналогии хранения в файлах ".csv" - только я использовал двойные двоеточия - "::" вместо запятой... поскольку предполагалось, что в данных возможна запятая.
Какой способ выбрать для файла вместо базы?
Какой из перечисленных способов лучше или хуже?
Почему я перешел с построчного, с разделителем "::".
1). Наверное.... я не совсем был готов работать с таким типом данных! Почему? Структура данных еще не уложилась в голове. Т.е. я постоянно добавлял какие-то данные, удалял.
2). В чем была проблема? Конечно, ты можешь добавить в конец строки ещё одну ячейку. Ячейкой будем называть содержание между двумя двоеточиями - ::содержание::. Потом ты забывал, где ты и что добавил. В общем общее воспоминания, что всё как-то сумбурно...
3). Любой процесс удаления, добавления - обязательно нужно проделывать в цикле. Очень неудобно...
4). Но есть и плюс... точно сейчас не помню, но на чуть-чуть, файл построчно был легче чем аналогичный в массиве. Специально посмотрел в момент перегона с построчного в ассоциативный.
Чем однозначно асс.массив лучше?
1). Простое удаление, добавление. Настолько, что уже прошло сколько времени, но помню то чувство "кайфа" - которое меня посетило, когда я это изучил!
2). Очень просто обратиться вообще к любой ячейке массива... и проделать всё, что хочешь... удалить, изменить, добавить.
3). В любую часть асс.массива можно было добавить еще одну ячейку с любым названием!
Формат, запись/получение данных.
Из выше изложенного Вы узнали, что:
Разрешение файла для сохранения данных базы ".dat".
Краткая информация о странице будет хранится в ассоциативном массиве.
Далее нам нужно разобраться... в двух процессах : сохранение и получения данных.
1). Как записать данные базы в файл?Для записи массива, а асс.массив просто так не запишешь в файл... нужна строка - нам понадобится функция serialize
Для записи в файл нам нужна функция file_put_contents.
2). Как получить данные из базы в файле?Для получения данных из файла базы данных нам нужна функция file_get_contents - мы получили строку...
Строку надо вернуть в массив с помощью : unserialize
Об "id" ячейки Прежде чем перейдем к примеру ячейки массива напоминаю, что id ячейки всегда должен быть уникальным.
Иначе... ваши новые данные запишутся поверх старых данных...смайлы
Пример ячейки массива - где записаны данные страницы.
Далее в примере 2e323a023d837cc41b6a474c84bdf50a - id ячейки массива.
Это всего лишь пример... не обязательно структура ячейки должна быть такой! См. ниже разбор примера.
Выведем через print_r :
Array
(
[2e323a023d837cc41b6a474c84bdf50a] => Array
(
[data] => 28.09.2023
[img] => php.png
[title] => База данных или файл данных
[description] => Хранение данных база или файл?
[author] => Марат
[url] => page/php/001_fayl_vmesto_bazyi_dannyih_.html
[tags] => php/php_file/database/php_book/
)
)
Создание ячейки массива для записи.
В этом пункте нам нужно разобраться... как создать новую ячейку массива(пример смотри выше пунктом)... для записи в файл.
У нас создан уникальный id из адреса страницы.
Выведем его здесь echo $page_id:
2e323a023d837cc41b6a474c84bdf50aПроцесс создания структуры массива с данными:
Нам нужна переменная(Здесь и далее:
$m_a вместо$main_array (главный массив) - чтобы, тупо... место меньше занимало... в описании):$m_aВторым элементом в строке идет уникальный ид ячейки - это переменная(т.е. таким образом переменной можно присвоить любое значение.) :
[$page_id]И третьим идет ключ внутри ячейки:, он может использоваться без кавычек в том случае, если в ключе нет пробела.
['data']У нас получилась одна часть ячейки , которой присвоим текущее время :
$m_a[$page_id]['data'] = date('d.m.Y');Условие - проверка : существует уже массив или нет Это делается в том случае, когда... массива еще не существует(т.е. ни одной записи ещё не сделано!), то необходимо создать пустой массив;
if(!$m_a) {$m_a = array();}Зачем я так подробно на этом останавливаюсь...?
В работе с массивами могут возникать непонимание процесса создания ячеек!
И у нас получился код новой ячейки массива в php:
Php: <?
if(!$m_a) {$m_a = array();}
$m_a[$page_id]['data'] = date('d.m.Y');
$m_a[$page_id]['img'] = 'php.png'; //если требуется
$m_a[$page_id]['title'] = 'База данных или файл данных';
$m_a[$page_id]['description'] = 'Хранение данных база или файл?';
$m_a[$page_id]['author'] = 'Марат';//Если это будет авторский блог , то данная ячейка не нужна!
$m_a[$page_id]['url'] = 'page/php/001_fayl_vmesto_bazyi_dannyih_.html';
$m_a[$page_id]['tags'] = 'PHP/PHP_FILE/DATABASE/PHP_BOOK/';
?>
Пример вывода ячейки: Если мы сейчас выведем вот так:
print_r ($m_a[$page_id]);То получим:
Array
(
[data] => 28.09.2023
[img] => php.png
[title] => База данных или файл данных
[description] => Хранение данных база или файл?
[author] => Марат
[url] => page/php/001_fayl_vmesto_bazyi_dannyih_.html
[tags] => php/php_file/database/php_book/
)
Код формирования "$page_id"
Несколько раз была приведена ссылка о page_id...
Но как она должна сформироваться...
если страницы еще не существует? Рассмотрим на примере данной страницы.
Когда вы отправляете название страницы(выделено красным...).
if($_POST['title']){ $m_a[$page_id]['title'] =$_POST['title'] ; }Далее о "$page_id"
Выше приведенной строки мы должны еще раз написать данное условие с созданием $page_id(чтобы вы не запутались... каждую функцию с новой строки):
if($_POST['title'])
{
$page_id =
md5(
my_strtolower (
deliteUnderlinе (
ru_to_en($_POST['title']) ) ) .html) ;
}
Разбираем...на примере данной страницы Я отправлял:
$_POST['title'] = 'File or MySQL.';Функция транслита ru_to_en
ru_to_en($_POST['title']) = File_or_MySQL_Если вдруг... функция "ru_to_en" - сработала таким образом, что слева/справа появились ненужные подчеркивания - их удаляем функцией "deliteUnderlinе "
deliteUnderlinе (
ru_to_en($_POST['title'])) = File_or_MySQL
Приводим к строчным буквам собственная функция my_strtolower
my_strtolower (
deliteUnderlinе (
ru_to_en($_POST['title']))) = file_or_mysql
Добавляем разрешение...(мне нравятся страницы по ОЛДскульному... чтобы было разрешение... ".html") + пропускаем через md5
md5(
my_strtolower (
deliteUnderlinе (
ru_to_en($_POST['title']))).'.html') = 2e323a023d837cc41b6a474c84bdf50a
Вы можете сравнить: И теперь вы можете сравнить... наш полученный "$page_id" с реально существующим данной страницы:
Я его уже выше выводил :
Выведем его и здесь echo $page_id:
2e323a023d837cc41b6a474c84bdf50a
Форма ввода + "post" для записи в файл .dat
После того, как вы разобрались с предыдущим пунктом... нам нужна форма для создания нового контента для записи в базу в файле ".dat".
Вам нужно определиться - какие данные записывать!?
Я за вас это сделать не могу! Но могу дальше рассказывать, про свою систему...
Нам нужно сделать следующий шаг! В данном пункте рассмотрим... :
Формирование выше приведенного кода с помощью post из формы. Кроме строк ['data'],['author'] и других(если вы придумаете - которые будут формироваться автоматически)
Сама форма.
И запись в файл данных.
Формирование единицы данных для записи в файл...
Как я уже сказал выше... нам нужен вот этот код.
Возьмем одну из строк...:
$m_a[$page_id]['title'] = 'База данных или файл данных';Бесплатный совет: Называйте $_POST, аналогично левой ячейки(выделено фиолетовым!)... иначе потом задолбаетесь разбираться...Правую сторону нам нужно заменить(все остальные строки аналогично) :
$m_a[$page_id][title ] =$_POST[ ;title ]Теперь форма. В форме form + post добавляем input type ="text" + required + submit - если нужно + placeholder и у нас получится:
<form method="post">
<input type="text" name="title" placeholder="Название страницы" required>
<input type ="submit" name="submit" value="отправить">
</form>После того, как вы нажали кнопку отправить - вверху страницы пишем php код:
Здесь обращаю ваше внимание... Поскольку получилось так, что условие "if($_POST['title'])" - повторяется дважды(и в Код формирования $page_id), то мы можем это условие прописать с "submit" + and
<?
if($_POST['submit'] and $_POST['title'])
{
$page_id = 'Код формирования $page_id';
$m_a[$page_id]['title'] = $_POST['title'] ;
... здесь и далее остальные строки... они все должны быть аналогичные, лишь отличается последний элемент в квадратных скобках.
if($_POST[здесь]){ $m_a[$page_id][здесь] = $_POST[здесь] ; }
}
?>
Как будем записывать данные в файл базы
В данном пункте, хочу обратить ваше внимание!
Чтозапись будет производиться "ВСЕГДА"(по умолчанию) в конец массива. Но нам нужно, чтобы свежая запись всегда была сверху.
Просто, чтобы не мучаться с реверсом при выдаче, лучше помучаться с реверсом при записи!
Собака "@" нужна для того, чтобы при не существующем массиве, не выдавало ошибку...
Получаем данные file_get_contents
Из нашего будущего файла "$dir_rotate" - путь естественно должен быть на сервере
Нам понадобится функция unserialize
Переменная "$reverse_ok" - нам понадобится ниже, - надеюсь по названию понятно почему!? Чтобы развернуть массив.
$m_a = @unserialize(file_get_contents($dir_rotate));
if(!$m_a) {$m_a = array();} else {$m_a= array_reverse($m_a); $reverse_ok=1;}
Ниже... тот массив, который мы создавали... в предыдущем пункте.
$m_a[$page_id]['data'] = date(d.m.Y);
$m_a[$page_id]['img'] = $_POST['img'] ;
$m_a[$page_id]['title'] = $_POST['title'] ;
$m_a[$page_id]['description'] = $_POST['description'] ;
$m_a[$page_id]['url'] = $_POST['url'] ;
$m_a[$page_id]['tags'] = $_POST['tags'] ;
Далее проверяем был ли перевернут массив $reverse_ok, если да, то возвращаем в нормальное направление
Нам нужна строка, поэтому превратим массив в строку - serialize
Записываем file_put_contents
if($reverse_ok){ $m_a= array_reverse($m_a);}
$write_for_main = @file_put_contents($dir_rotate, serialize($m_a));
Соберем весь код вместе: if($_POST['submit'] and $_POST['title'])
{
$page_id = 'Код формирования $page_id';
$m_a = @unserialize(file_get_contents($dir_rotate));
if(!$m_a) {$m_a = array();} else {$m_a= array_reverse($m_a); $reverse_ok=1;}
$m_a[$page_id]['data'] = date('d.m.Y');
$m_a[$page_id]['img'] = 'php.png';
$m_a[$page_id]['title'] = 'База данных или файл?';
$m_a[$page_id]['author'] = 'Марат';
$m_a[$page_id]['url'] = 'page/php/001_fayl_vmesto_bazyi_dannyih_.html';
$m_a[$page_id]['tags'] = 'PHP/PHP_FILE/DATABASE/';
if($reverse_ok){ $m_a= array_reverse($m_a);}
$write_for_main = @file_put_contents($dir_rotate, serialize($m_a));
}
Живой пример: база данных в файле.
Как работает пример записи в базу данных в файле?
Скачиваем архив здесь.
Закидываем в любую папку на сайте.
Открываем файл "do_base.php" в браузере... вы должны увидеть форму, в данном примере - только две формы... скрипт сделан для понимания процесса... вы можете добавить сколь угодно полей...:
После заполнения формы и нажатии кнопки отправить... вы получите результат в виде сообщения и первой ячейки массива базы в файле...
О моей системе хранения данных.
04.06.2018.
В связи с тем, что я так больше базу не храню, ниже идущая информация больше обновляться не будет.
На чем основан мой самописный движок? Существует два типа файлов:
Файл с разрешением ".dat" - где хранится краткая информация о "странице с контентом" построчно, одна строка - одна страница : дата,заголовок,теги, url и т.д.
Контент храниться в отдельных файлах с разрешением ".html" - одна статья - один файл.
Как
хранятся данные в файлах!?Всего для хранения данных(контента) используются два файла.
Файл основная информация о странице с контентом.
Главный файл "rotate" с разрешением ".dat" - "rotate.dat", где построчно - одна строка - одна запись о странице с контентом...
Давайте выведем данную строку, которая принадлежит данной странице:
Это пример работы с массивом строк...
Для этого нам понадобится...
Мы получили массив из файла и поместили его в переменную "$main_fale_rotate"
В цикле {for} переберем весь наш массив + понадобится count
+ explode - в файле адрес страницы хранится без домена , поэтому строку разделим по домену и получим правую строну, или вторую ячейку... массив начинается с "0". Поэтому ячейка 2 - это фактически 1.
+ break - остановимся, когда строка будет найдена и присвоим значение ячейки переменной "$line_example"
+ $domen
+ $hp_page
Код: $main_arr_example = explode("\n", file_get_contents($old_main_rotate_for_example)));
$name_file = basename(__FILE__);
for ($i=0; $i < count($main_arr_example) ; $i++)
{
if(substr_count($main_arr_example[$i], $name_file)) { $line_example = $main_arr_example[$i]; break; }
}
Результат: Совершенно не обязательно хранить данные именно так - просто с самого начала, как сложилось, так и продолжается(пока)...
2021.12.27::php.png::Файл вместо базы данных.::Файл .dat вместо базы данных.::Марат::file_or_mysql.html::PHP/PHP_FILE/DATABASE/Об этом файле нужно завести отдельный пункт:
Файл dat вместо базы данных.
Итак продолжим об основном файле dat - я его условно назвал - "rotate.dat".
Как получать данные из файла?
Для получения данных из файла нам понадобится функция file_get_contents (можно было использовать сразу получение из файла в массив, но как говорится - нет ничего постояннее чем временное.)
$example_get = file_get_contents( путь_на_сервере'rotate.dat');Итак. Мы получили в переменную строку. Теперь нам нужно разбить текст построчно в массив! Для этого нам нужна функция explode:
$example_array = explode("\n",$example_get);Далее нам понадобится цикл, в котором будем обрабатывать каждую строку - например все страницы списков обрабатывается именно так.
for ($i=0; $i < count($example_array); $i++) {
$line = explode('::',$example_array[$i]);
}
Вот в этой переменной
$example_array[$i] у нас находится одна строка цикла. Выше приводил пример(сейчас, может быть обьеденил первые три ячейки даты в одну целую дату. Это было сделано давно, просто не стал переделывать):2020::12::21::php.png::База данных или файл данных::Хранение данных база или файл?::Марат::page/php/001_fayl_vmesto_bazyi_dannyih_.html::#ALL::PHP/PHP_FILE/DATABASE/PHP_BOOK/И в переменную $line мы получаем уже разбитую строку.
Далее отдельно по строке внутри цикла:
Раскладываем данные в переменные.
после этого, как мы разбили строку внутри цикла мы получили массив
$line = explode('::',$example_array[$i]);Вот он в таком виде -выведем его с помощью print_r :
print_r $line;Получим:
Array
(
[0] => 2021.12.27
[1] => php.png
[2] => Файл вместо базы данных.
[3] => Файл .dat вместо базы данных.
[4] => Марат
[5] => file_or_mysql.html
[6] => PHP/PHP_FILE/DATABASE/
)
Придумываем переменные и присваиваем данные из строки - просто это более удобно. Чем запоминать число!
$example_data = $line[0];
$example_img = 'Путь до папки с картинками'.$line[1]; //Если собираетесь использовать картинку. Все-таки веселее чем простой список.
$example_title = $line[2];//заголовок строки.
$example_text = $line[3];//текст пояснения, описания строки.
$example_author = $line[4];//предполагалось, что контент будут добавлять другие пользователи...
$example_url = $domen . $line[5];//путь http до файла, нам нужен $domen
$example_tags = $line[6];//отдельная ячейка для сортировки по темам, например(опять обратите на адрес...) : https://dwweb.ru/?tema=DATABASE(не стоит применять ПРОПИСНЫЕ, если для этого нет причины! Не забываем, что мы говорим о 2016)
Итого!
Работает ли данная система в виде движка - Конечно! Но прошло время и многое из этого, что рассказано выше требует переосмысления!
В чем неудобность построчного хранения? Можно создавать дополнительные ячейки, в конце строки. Но, мне показалось, это неудобным и портит вид самой строки(предвзято...)
Удаление строки, редактирование строки имеют свои нюансы. Довольно легко запутаться.
Что мы будем делать!? Я по пунктам буду разбирать тему Сделать сайт пошагово. + на каждый шаг будем делать отдельное видео.
"База данных MySQL" или база данных на файле?
Что выбрать для своего сайта - базу данных или файл? ...Хранение в базе данных "MySQL" или
Хранить данные a файлах?
Спор между этим двумя позициями всегда возникает...
Вам требуется сделать сайт на 1, 2, 3, 5... 100 страниц.... нужна ли в этом случае "база MySQL"?
Яндекс, Google и др.
Используют "базы данных MySQL" - это говорят оправдано из-за огромного количества информации!
Что выбрать "MySQL" или файл?
Вам придется сделать этот выбор самостоятельно!
В каждом из этих 2 путей - есть свои плюсы и свои минусы.
Почему я выбрал "файл" вместо базы данных MySQL!?
Вообще... я не сидел и не думал... что выбрать... как-то оно так само получилось...
Мой сайт на файлах.
Весь данный сайт на файлах(и не только этот).
На главной вы можете прочитать сколько всего сейчас файлов с контентом.
И краткая информация о страницах записана в ассоциативном массиве.
Главная проблема файла, как базы данных.
Есть ли такая проблема у баз данных "MySQL" - я не знаю, потому, что никогда не работал с ними!
И я пока с ней не столкнулся...
Поскольку вес моей базы данных в реальном времени :
Количество страниц:
Т.е. ... еще спокойно я могу не париться 1000 страниц... до 1мб. А к 1000 ... я иду уже... 5 лет...
Основная проблема файла , как базы данных.
Как вы уже поняли, проблема - это вес файла(где записана база данных).
И... она актуальна только для страниц - где он файл участвует. Для страниц с контентом она никак не влияет!(естественно я рассказываю о своей структуре сайта на файлах)
Для кого актуальна эта проблема?
1). Для пользователей с медленным интернетом.2). Для пользователей на мобильных.
В нем подсчитаем сколько "$page_id"
Получим... количество "page_id"
Вес файла:
dwweb база данных в файле
Файл вместо базы данных,
использование файлов вместо баз данных
в чем отличие базы данных от обычного файла с данными?
база данных на файлах
php база данных в файле

подробнее.
подробнее.