REFERATUA.ORG.UA — База українських рефератів




можуть використатися, щоб переписати лише шматок файлу, змінюючи або вилучаючи дані.

Як і з інтерфейсом до пошукового CGI, проста HTML-форма - це все що вимагається, щоб дати споживачам можливість безпосередньо змінити вашу базу даних. Тут знову є приклад адресної книги:

My Address Book

Fill out the form below to add an entry to the address book



Name:

Phone:

Street:

City: State:
Zip:





Ця форма майже однакова до той, яку було виготовлено для пошуку. Різниця в тому, як дані обслуговуються програмою CGI. У цьому випадку, скрипт CGI для додавання запису є набагато простішим, ніж пошуковий скрипт. У цьому випадку, ми допускатимемо, що база даних є файл з дозволом запису.

#!/bin/perl

require cgi_head; # Ініціалізація CGI-оточення

while (-e "datalock") { sleep 1; } # зачекати, доки звільниться БД
system("touch datalock"); # Зачинити БД

open (DAT, "database.txt"); # Відкрити БД для запису
while () { $line = $_; } # зчитати останній рядок
close DAT;
if ($line =~ /:/) {
@field = split (/:/, $line);
$num = $field[0]; # Знайти останній ID номер
$num++;
} 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 <Addition Successful

Your entry has been added to the address book


Go back to the form to add another user.

EOF

Насправді, цей скрипт CGI просто приєднує новий запис до бази даних. Якщо хтось інший змінює базу даних в той же час, одна із змін буде втрачена або повна база даних стане зіпсованою. Щоб обійти це, ми використовуємо lock-файл, щоб сказати, чи хтось інший пише до бази даних. Це далеко не найелегантніше вирішення, і більшість систем забезпечують функцію flock(), щоб більш ефективно замкнути файл від паралельної вибірки. По-друге, номер ID запису повинен бути визначений. У цьому випадку, ми можемо допускати, що записи будуть послідовно нумеровані і, що останній вхід матиме останній номер ID. Так що ми просто читаємо останню лінію бази даних, захоплюємо номер ID від нього, і потім прирощуємо його, щоб одержати новий номер ID.

Тепер, коли будь-хто може додати записи до адресної книги, може стати необхідним, викреслити або змінити записи. Щоб зробити, це, однак, має бути деякий спосіб для користувача, щоб вказати на бажаний вхід який треба змінити або викреслити. Замість створення всієї нової форми для цього, ми можемо додати ці функціональні можливості до нашого існуючого CGІ-пошуку. Якщо пошук користувача повертає точно один результат, лінія може бути додана до сторінки результату HTML, яка пропонує на вибір змінити або викреслити цей вхід. (Це могло б бути зроблене для більш ніж одного результату досить легко, але ми працюємо з одним заради стислості). Це може бути зроблено за допомогою зміни наступних ліній в дні пошуку CGI:

print <

Thank you for using my address book.
Go back to the form to make another search.

EOH

на:

print "
nThank you for using my address book.n";
print "Go back to the form to make another search.
n";
if ($#results == 0) {
print "Delete this entry.
n";
print "Modify this entry.
n";
}
print "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 () {
chop;
@field = split(/:/); # розбити запис на поля.
$n = $field[0]; # перше поле є ID
$add[$n]{'name'} = $field[1]; # ім'я
$add[$n]{'phone'} = $field[2]; # телефон
$add[$n]{'street'} = $field[3]; # адреса
$add[$n]{'city'} = $field[4]; # місто
$add[$n]{'state'} = $field[5]; # країна
$add[$n]{'zip'} = $field[6]; # поштовий індекс
$add[$n]{'line'} = $_ . "n"; # весь рядок
}
$maxn = $n;

close DAT;

open (DAT, ">database.txt"); # відкрити БД для запису.
if ($FORM{'a'} eq "d") { # Якщо треба знищити запис,
for ($I = 0; $I <= $maxn; $I++) { #видати всі записи,
unless ($I == $FORM{'n'}) { # крім того, який треба зтерти.
print DAT $add[$I]{'line'};
}
}
# видати повідомлення та вийти.
print <Request successful

The selected entry has been deleted.


Go back to make another search.

EOP

close DAT;
system ("rm datalock");
die;
} elsif ($FORM{'a'} eq "c") {


# Якщо користувач хоче змінити вхід, все стає трохи хитрішим.
Ми повинні спершу надрукувати зовні форму, подібні до первинної форми, щоб дозволити
користувачеві змінити значення запису.


# змінна.
print <Entry Modification

Make the desired changes in the form below.





Name:

Phone:

Street:

City:
 
Загрузка...