Вступление
Самое ценное в мире это информация, и нечего думать, что это самое ценное в мире интернет или ином цифровом. Соответственно самое сложное - это хранить и обрабатывать информацию, поверьте мне на слово...
Сегодня существует необъятное море видов и систем баз данных, однако лишь пара заслуживает внимания: 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.