(Продолжение, начало см. МК № 46, 48, 50 (165, 167, 169))
Если вы до сих пор не понимаете, о чем идет речь — об HTML-странице или Perl-скрипте, поясню: и то, и другое находится в одном общем коде, благо синтаксис Perl’а позволяет вставлять в программу большие куски текста:
print< ... ... ... HTML_TOP
В общем, ничего сложного. Функции check_???() устанавливают значение скрытого поля edit. Далее — тривиальная проверка аргументов. От комментариев воздержусь.
&read_input; if ($data{'edit'} eq 'edit') { &save_values; print "<h3>Изменения сохранены!</h3>\n"; &show_page; } else { if ($data{'edit'} eq 'delete') { &delete_record; } else { &show_page; } }
Осталось написать четыре процедуры: &save_values, &show_page, &delete_record, &read_input. Последнюю здесь приводить не буду — чтение потока STDIN и заполнение хэша. Показ страницы производится при любом действии:
sub show_page { my $result = $dbh->prepare("SELECT a.name as cname, b.name as name, b.url as url, a.id as catid, b.id as lid FROM category a, links b WHERE b.category=a.id ORDER by a.name"); $result->execute(); print "\n"; $i = 0; while (my @ln = $result->fetchrow_array()) { $i++; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "<table width="\"100\%\""><tbody><tr><td width="20" id="id_$i" class="tdmy">",@ln[4],"</td><td width="25%" id="cat_$i" class="tdmy">",@ln[0],"</td><td width="25%" class="tdmy" id="name_$i">",@ln[1],"</td><td width="30%" class="tdmy" id="url_$i">",@ln[2],"</td><td> <input type="hidden" id="catid_$i" value="@ln[3]"></td></tr></tbody></table>\n"; }
Как работает инструкция SELECT ... FROM, пояснять не нужно. В процедуре в каждую ячейку таблицы мы вставим обработку события OnClick(), чтобы при щелчке на ячейке содержимое строки поместилось в поля формы (см. функцию settoedit()).
Теперь запишем данные в базу:
sub save_values { if ($data{'id'} == 0) { $linksqry = "INSERT INTO links (name,url,category) values ('".$data{'namelink'}."','" .$data{'url'}."',".$data{'category_id'}.")"; } else { $linksqry = "UPDATE links SET name='" .$data{'namelink'}."',url='".$data{'url'} ."',category=".$data{'category_id'} ." where id=".$data{'id'}; } $dbh->do($linksqry); # выполнить запрос }
Инструкция INSERT INTO table (field1,field2,field3) VALUES (val1,val2,val3) добавляет в таблицу новую запись и присваивает полям field1...fieldNN значения val1...valNN. При этом полям с атрибутом auto_increment() не пытайтесь присваивать значения — все равно MySQL будет их автонумеровать.
Инструкция UPDATE table SET field1=value1,... fieldNN=valueNN WHERE condition обновляет значения полей в записях(!), удовлетворяющих условию condition. То есть, одной инструкцией можно обновить сразу несколько записей. Например, WHERE id < 100 обновит записи с 1 по 99.
Итак, одной процедурой вносим изменения и добавляем запись, в зависимости от значения скрытого поля edit.
Следующей процедурой удаляем запись:
sub delete_record { if ($data{'id'}== 0) { # ничего не делаем!!! # если поле id == 0!!! } else { $delqry = "DELETE FROM links WHERE id = ".$data{'id'}; $dbh->do($delqry); } }
Тут все просто.
Инструкция DELETE FROM table WHERE condition удаляет все записи, удовлетворяющие условию condition. Вот таким образом можно удалить все записи, где поле URL содержит текст «sex»:
DELETE FROM links WHERE URL like '%sex%'
Вот и все. Не правда ли, просто?
Если нет желания возиться со всеми этими JavaScript’ами, то можно выводить в процедуре show_page в каждой строке таблицы форму — тогда, конечно, объем результирующего HTML-кода увеличится, но сам Perl-код заметно упростится.
И, наконец, полный текст скрипта (можно выкачать с ):
#!c:\perl\bin\perl use DBI; print "Content-type:text/html\n\n"; my $dbh = DBI->connect("DBI:mysql:database=mydb;host=localhost", "shurik", "hfbcf61") || die $DBI::errstr; print< <title>Edit links</title> <div id="Layer1" style="position:absolute; left:32px; top:75px; width:25%; height:120px; z-index:1; background-color: #CCCCCC; layer-background-color: #CCCCCC; border: 1px solid ; visibility: hidden"> <select name="cats" size="8" style="width:100%"> HTM_TOP my $res = $dbh->prepare("SELECT * FROM category ORDER by id"); $res->execute(); while (my @cln = $res->fetchrow_array()) { print "<option value="",@cln[0],"">",@cln[1],"</option>\n"; } print< </select><input type="hidden" name="edit" value=""> <table width="100%"> <tbody><tr><th class="thmy">id</th> <th class="thmy">Категория...... <input type="button" name="button" value="4" title="Для выбора категории" class="tdmy" style="font-family: wingdings; font-size: 12pt; color: navy; width:20"> </th> <th class="thmy">Название</th> <th class="thmy">Адрес</th> </tr><tr> <td width="20"> <input size="3" type="text" readonly="" style="width=100%" value="0"> </td> <td width="25%"> <input type="text" name="category" style="width=100%"> <input type="hidden" name="category_id" value="0"> </td> <td width="25%"> <input type="text" name="namelink" style="width=100%"> </td> <td width="30%"> <input type="text" name="url" style="width=100%"> </td> <td> <input type="button" value="<" class="thmy" style="font-family: wingdings; font-size: 12pt; color: navy; width:20" title="Сохранить"> <input type="reset" value="2" class="thmy" style="font-family: wingdings; font-size: 12pt; color: navy; width:20" title="Очистить"> <input type="button" value="N" class="thmy" style="font-family: wingdings; font-size: 12pt; color: navy; width:20" title="Удалить"> </td> </tr> </tbody></table> HTML_TOP &read_input; if ($data{'edit'} eq 'edit') { &save_values; print "<h3>Изменения сохранены!</h3>\n"; &show_page; } else { if ($data{'edit'} eq 'delete') { &delete_record; } else { &show_page; } } sub show_page { my $result = $dbh->prepare("SELECT a.name as cname, b.name as name, b.url as url, a.id as catid, b.id as lid FROM category a, links b WHERE b.category=a.id ORDER by a.name"); $result->execute(); print "\n"; $i = 0; while (my @ln = $result->fetchrow_array()) { $i++; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "<table width="\"100\%\""><tbody><tr><td width="20" id="id_$i" class="tdmy">",@ln[4],"</td><td width="25%" id="cat_$i" class="tdmy">",@ln[0],"</td><td width="25%" class="tdmy" id="name_$i">",@ln[1],"</td><td width="30%" class="tdmy" id="url_$i">",@ln[2],"</td><td> <input type="hidden" id="catid_$i" value="@ln[3]"></td></tr></tbody></table>\n"; } sub save_values { if ($data{'id'} == 0) { $linksqry = "INSERT INTO links (name,url,category) values ('".$data{'namelink'}."','".$data{'url'}."',".$data{'category_id'}.")"; } else { $linksqry = "UPDATE links SET name='" .$data{'namelink'}."',url='".$data{'url'} ."',category=".$data{'category_id'}." where id=".$data{'id'}; } $dbh->do($linksqry); } sub delete_record { if ($data{'id'}== 0) { } else { $delqry = "DELETE FROM links WHERE id = ".$data{'id'}; $dbh->do($delqry); } &show_page; } sub read_input { local ($temp,@pairs); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$temp,$ENV{'CONTENT_LENGTH'}); } else { $temp=$ENV{'QUERY_STRING'}; } if ($temp ne '') { @pairs=split(/&/,$temp); foreach $item(@pairs) { ($key,$content)=split (/=/,$item,2); $content=~tr/+/ /; $data{$key}=$content; } return 1; } else { return 0; } }
(Продолжение следует)
