з Web безпосередньо. Приємно, що це не важко.
У маніпулюванні базою даних безпосередньо різниця між розмежованою і базою даних з записами фіксованої довжини стає важливою. З розмежованим текстом, ви не маєте легкого шляху для визначення місця, де один запис закінчується та інший починається. Таким чином, щоб змінити або викреслити один запис, необхідно переписати всю базу даних. Так в малих базах даних, це не є дійсно великою проблемою, але якщо ваша база даних є великою достатньо, для того, щоб це стало проблемою, можливо буде хорошою ідеєю проглянути використання сервера бази даних.
З базами даних з незмінної довжиною поля, однак, не необхідно переписати повну базу даних, щоб змінити запис. Через те, що довжина кожного запису відома, функції подібні до seek() і tell() (або їхній еквівалент у вашій улюбленій мові) можуть використатися, щоб переписати лише шматок файлу, змінюючи або вилучаючи дані.
Як і з інтерфейсом до пошукового CGI, проста HTML-форма - це все що вимагається, щоб дати споживачам можливість безпосередньо змінити вашу базу даних. Тут знову є приклад адресної книги:
<HTML><HEAD><TITLE>My Address Book</title></head>
<BODY>
<h4>Fill out the form below to add an entry to the address book</h4>
<FORM ACTION="add.cgi" METHOD="POST">
Name: <INPUT SIZE=45 NAME="name"><br>
Phone: <INPUT SIZE=45 NAME="phone"><br>
Street: <INPUT SIZE=45 NAME="street"><br>
City: <INPUT SIZE=20 NAME="city"> State: <INPUT SIZE=3 NAME="state">
Zip: <INPUT SIZE=6 NAME="zip">
<br><br>
<INPUT TYPE=SUBMIT VALUE=" Add Entry
<INPUT TYPE=RESET VALUE=" Form
</form></body></html>
Ця форма майже однакова до той, яку було виготовлено для пошуку. Різниця в тому, як дані обслуговуються програмою CGI. У цьому випадку, скрипт CGI для додавання запису є набагато простішим, ніж пошуковий скрипт. У цьому випадку, ми допускатимемо, що база даних є файл з дозволом запису.
#!/bin/perl
require cgi_head; # Ініціалізація CGI-оточення
while (-e "datalock") { sleep 1; } # зачекати, доки звільниться БД
system("touch datalock"); Зачинити БД
open (DAT, "database.txt"); # Відкрити БД для запису
while (<DAT>) { $line = $_; } # зчитати останній рядок
close DAT;
if ($line =~ /:/) {
= split (/:/, $line);
= $field[0]; # Знайти останній ID номер
;
} else { $num = 0; } Створити новий ID
open (DAT, ">>database.txt"); # Відкрити БД для додавання
# Додати запис до БД
print DAT
"$num:$FORM{'name'}:$FORM{'phone'}:$FORM{'street'}:$FORM{'city'}:$FORM{'state'}:
В$FORM{'zip'}\n";
close DAT;
system ("rm datalock");
print <<EOF;
<HTML><HEAD><TITLE>Addition Successful</title></head>
<BODY>
<h4>Your entry has been added to the address book</h4>
<A HREF="add.html">Go</a> back to the form to add another user.
</body></html>
EOF
Насправді, цей скрипт CGI просто приєднує новий запис до бази даних. Якщо хтось інший змінює базу даних в той же час, одна із змін буде втрачена або повна база даних стане зіпсованою. Щоб обійти це, ми використовуємо lock-файл, щоб сказати, чи хтось інший пише до бази даних. Це далеко не найелегантніше вирішення, і більшість систем забезпечують функцію flock(), щоб більш ефективно замкнути файл від паралельної вибірки. По-друге, номер ID запису повинен бути визначений. У цьому випадку, ми можемо допускати, що записи будуть послідовно нумеровані і, що останній вхід матиме останній номер ID. Так що ми просто читаємо останню лінію бази даних, захоплюємо номер ID від нього, і потім прирощуємо його, щоб одержати новий номер ID.
Тепер, коли будь-хто може додати записи до адресної книги, може стати необхідним, викреслити або змінити записи. Щоб зробити, це, однак, має бути деякий спосіб для користувача, щоб вказати на бажаний вхід який треба змінити або викреслити. Замість створення всієї нової форми для цього, ми можемо додати ці функціональні можливості до нашого існуючого CGІ-пошуку. Якщо пошук користувача повертає точно один результат, лінія може бути додана до сторінки результату HTML, яка пропонує на вибір змінити або викреслити цей вхід. (Це могло б бути зроблене для більш ніж одного результату досить легко, але ми працюємо з одним заради стислості). Це може бути зроблено за допомогою зміни наступних ліній в дні пошуку CGI:
print <<EOH;
</pre><br>
Thank you for using my address book.
<A HREF="addrbk.html">Go</a> back to the form to make another search.
</body></html>
EOH
на:
print "</pre><br>\nThank you for using my address book.\n";
print "<A HREF=\"addrbk.html\">Go</a> back to the form to make another search.<br>\n";
if ($#results == 0) {
print "<A HREF=\"change.cgi?a=d&n=$result[0]\">Delete</a> this entry.<br>\n";
print "<A HREF=\"change.cgi?a=c&n=$result[0]\">Modify</a> this entry.<br>\n";
}
print "</body></html>\n";
Додаткові лінії друкують зв'язки з новою програмою CGI, передаючи два значення: вказання параметра - викреслювання або модифікація потрібна, і номер ID запису, щоб викреслити або змінити.
Через те, що наша база даних розмежена, нам буде необхідно відродити повну базу даних, щоб зробити зміну, як показано:
#!/bin/perl
require cgi_head; # Ініціалізація CGI-оточення
while ( -e "datalock" ) { sleep 1; } # зачекати, доки не звільниться БД
system ("touch datalock"); # Замкнути БД.
# Завантажити БД
open (DAT, "database.txt") || die "Can't open the database: $! !.\n";
$maxn = 0; # Лічильик записів.
while (<DAT>) {
;
= split(/:/); # розбити запис на поля.
= $field[0]; # перше поле є ID
{'name'} = $field[1]; # ім'я
{'phone'} = $field[2]; # телефон
{'street'} = $field[3]; # адреса
$add[$n]{'city'} = $field[4]; # місто
{'state'} = $field[5]; # країна
{'zip'} = $field[6]; # поштовий індекс
{'line'} = $_ . "\n"; # весь