Русскоязычные документы веб-мастеру готовы к употреблению
Подробная информация сахалин и курильские острова обзорные туры здесь.
Где вы зарабатываете больше всего?
Яндекс.Директ
Google Adsens
Sape
Begun
Setlinks
Mainlinks
Blogun

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

Комментарии