Вступление
Самое ценное в мире это информация, и нечего думать, что это самое ценное в мире интернет или ином цифровом. Соответственно самое сложное - это хранить и обрабатывать информацию, поверьте мне на слово...
Сегодня существует необъятное море видов и систем баз данных, однако лишь пара заслуживает внимания: MySQL и Text-plain, первое в силу своей фундаментальности, второе в силу простоты реализации. Сейчас я намерен молвить слово за Text-plain базы данных, хотя вообще говорить что это база данных, неправильно, т.к. это не база данных, а текстовый файл который вы приспосабливаете для хранения тех или иных данных проделывая над ним различные операции.
Хороши базы данных этого типа следующим:
1. Легкость редактирования и просмотра (обычным текстовым редактором).
2. Доступность, простота создания и работы (создал текстовый файл и не чешись).
Теория
Начнём с теории хранения данных вообще, и разбора некоторых основных проблем.
Все базы данных строятся на принципе полей и таблиц, то есть любая БД есть не что иное, как таблица с определённым количеством строк (записей) и столбцов (полей), где каждая новая запись это новая строка, а каждый столбец это ячейка хранения данных. Естественно что каждый столбец обладает своим форматом, то есть может хранить только данные определённого типа (текст, цифровые значения или бинарные данные).
В случае с Text-plain БД данные хранятся в строках текстового файла и каждая строка это поле. Соответственно мы можем хранить только текст или цифровые значения в текстовом представлении, это основное ограничение Text-plain БД. Конечно можно приспособить и БД этого типа для хранения бинарных файлов, например представляя каждый байт бинарного файла в HEX виде или MIME, UUE кодирования - но вас вряд ли поймут %-)
Всё, основное представление о хранении данных сложено, переходим к делу.
Сохранение данных
Прежде чем хранить те или иные данные, мы должны определиться в каком виде
они будут к нам поступать, что это за данные как долго нам нужно их
хранить, в каком объёме и как обрабатывать.
Предположим (наиболее реальное), нам требуется получать от пользователя
данные о его регистрации в нашем каталоге линков, мы будем запрашивать и работать
с текстом, а значит Text-plain нам подходит. В данном примере будем
спрашивать самое необходимое:
1. Контактный Ё-mail.
2. Название сайта.
3. WWW адрес его сайта.
То есть, будем иметь дело с 3 текстовыми строками, значит на одну запись в нашей
базе данных будет уходить 3 строки, а сама база данных будет
иметь вид:
mail_accaunt_Berimora@mail.server
Сайт Сэра Берримора
http://www.url_addr_berimora.domain/
mail_accaunt_Genry@mail.server
Сайт Лорда Генри и его дога по кличке "Семьсот двенадцатый".
http://www.url_addr_genry.domain/
... ...
Создаём скрипт который будет делать это (назовём его urlreg.cgi):
#!/usr/bin/perl
use CGI
$co = new CGI;
$Baze_data_file='file.txt'; # Имя файла в котором лежать данные
$Email=$co->param('email');
$Name=$co->param('name');
$Url=$co->param('url');
chomp($Email);
chomp($Name);
chomp($Url);
if ($Act != 1){ # Если вызов не из формы - показать форму
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html>";
print "<form action='http://адрес_твоего_серванта.ru/cgi-bin/urlreg.cgi' method='POST'>";
print "E-mail: <input type=text name='email'><BR>";
print "Название сайта: <input type=text name='name'><BR>";
print "Адрес сайта: <input type=text name='url'><BR>";
print "<input type=submit value='Сохраниться'>";
print "</form>";
print "</html>";
}else{ # Если вызов из формы, то обработать данные
open(yo_potok, "+<$Baze_data_file"); # открыть файл на чтение и запись
@My_DataBaze=<yo_potok>; # Массив будет теперь содержать данные из файла
# Если помним, то при таком действии каждый элемент массива
# содержит по одной строке текстового файла в порядке их
# следования в файле.
# Добавляем в конец новые строки с переданными нам данными:
@My_DataBaze=(@My_DataBaze, "$Email\n", "$Name\n", "$Url\n");
# Если надо добавлять в начало, то закомментируй строку
# выше и раскомментируй строку ниже:
# @My_DataBaze=("$Email\n", "$Name\n", "$Url\n", @My_DataBaze);
# Сохраняемся в файл базы данных:
truncate ($Baze_data_file, 0); #Обнулить содержимое файла
print yo_potok $CounT; # записать данные из переменной в файл
close (yo_potok); # закрыть файл
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html><body>\n"; # тело HTML
print "Спасибо за сохранение своих данных!\n";
print "</body></html>\n"; # завершить тело HTML
}
|
Теперь мы имеем то, что будет создавать нашу базу данных, однако остаётся несколько
не очень очевидных моментов, например: что будет, если кто-то протолкнет нашему
скрипту не просто текстовую строку, а текст, с переносом строки между словами?
Правильно - наша база данных полетит, как реактивная фанера над деревней "Пихтовка"...
Побороть это зло можно либо заменяя в данных все "подозрительные" байты скажем на
обычный пробел, либо (если в последствии мы будем выводить наш текст в HTML документ)
на HTML код переноса строки (<Br>).
Делается это следующим образом:
$Email=~tr/\x00-\x1F/ /; # Замена в переменной e-mail стрёмных байт на пробел
$Email=~s/\x0A/<Br>/g; # Заменяем код переноса строк на BR
Чтение и обработка данных
Вот и пришла пора выдавать данные из нашей БД пользователям. В данном примере
я нестану колоть данные на страницы, делать линеечку выбора "<< 1 2 3 >>",
мне лениво, а для пояснения сути дела и ненужно, расскажу только о том как
прочесть данные из базы и запихать их в HTML`ку, немножко поразглагольствую
о том как удалить из нашей БД нужную запись...
Пусть будет так, и скрипт зовётся "urlshow.cgi":
#!/usr/bin/perl
$Baze_data_file='file.txt'; # Имя файла в котором лежать данные
$StartIndex=0; # Номер записи в БД с которого начинать вывод
open(yo_potok, "<$Baze_data_file"); # открыть файл на чтение
@My_DataBaze=<yo_potok>; # Массив будет теперь содержать данные из файла
close (yo_potok); # закрыть файл
# Составляем текст который будет выведен в переменную "$Body":
$Body="";
$FlagN=1;
for ($n=$StartIndex; $FlagN==1; $n=$n+1){
$n_index=$n * 3; # Где 3 - количество строк на одну запись
$Email=$My_DataBaze[$n_index];
chomp($Email);
if ($Email){ # Если поле Ё-mail не пустое, то запись есть
$Name=$My_DataBaze[$n_index+1];
$Url=$My_DataBaze[$n_index+2];
chomp($Name);
chomp($Url);
$Body="$Body<a href='$Url'>$Name</a> [Владелец: $Email]<BR>";
}else{$FlagN=0;} # Если поле Ё-mail пустое, то записи нет, это конец базы
}
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html><body>\n"; # тело HTML
print "$Body\n";
print "</body></html>\n"; # завершить тело HTML
|
При выполнении этот скрипт выдаст все сайты из базы данных в виде листа
со ссылками, причём записи будут выдаваться начиная с той которая указана
в переменной "$StartIndex", то есть если мы укажем "$StartIndex=10;", то
10 первых записей будут пропущены (это должно наталкивать на мысль о
том как сделать линеечку выбора "<< 1 2 3 >>").
Естественно можно вывод не всех записей, а скажем всего 10 штук, для этого
модифицируем скрипт:
Было:
for ($n=$StartIndex; $FlagN==1; $n=$n+1){
$n_index=$n * 3; # Где 3 - количество строк на одну запись
|
Стало:
for ($n=0; ($FlagN==1 && $n < 10); $n=$n+1){
$n_index=($n + $StartIndex) * 3; # Где 3 - количество строк на одну запись
|
Теперь кратко о том как удалить нужную запись из такой базы данных:
#!/usr/bin/perl
$Baze_data_file='file.txt'; # Имя файла в котором лежать данные
open(yo_potok, "+<$Baze_data_file"); # открыть файл на чтение и запись
@My_DataBaze=<yo_potok>; # Массив будет теперь содержать данные из файла
$KillNumber=5; # Удаляем запись номер 5
$n_index=$KillNumber * 3; # Где 3 - количество строк на одну запись
$My_DataBaze[$n_index]='';
$My_DataBaze[$n_index+1]='';
$My_DataBaze[$n_index+2]='';
truncate ($Baze_data_file, 0); #Обнулить содержимое файла
print yo_potok $CounT; # записать данные из переменной в файл
close (yo_potok); # закрыть файл
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html><body>\n"; # тело HTML
print "Запись номер: $KillNumber - уничтожена успешно.\n";
print "</body></html>\n"; # завершить тело HTML
|
Послесловие.
Спасибо за соблюдение тишины в аудитории и проявленное внимание при изучении
материала, я надеюсь в дальнейшем мои труды не падут бесплодно под натиском
лености вашей и произрастут во славу восия Руси достойными сайтами и интернет
системами.
С уважением, трогал пластик кнопок, 90hex.