Страница 22 из 30 Небольшая Помощь JavaScript Для CGI-програмиста конечно JavaScript -это иной мир,вы можете спокойно пропустить этот абзац,если вы не знаете JavaScript,так как написаное в нем к CGI не относится, а скорей к самим формам и дизайну сайта.Я скажу пару слов о том как JavaScript может оказать посильную помощь в проверке правильности заполнения форм.Все проверки конечно можно и нужно делать на сервере,но когда имеешь дело с рассеяным пользователем, то для него заполнение простой формы превратится в мучение.Поясню на примере,в форме есть какие-то обязательные поля,например имя.Если пользователь забыл его указать то скрипт скажет ему об этом в сообщении он исправит это, допустим что-нибудь еще не так ввел .... Только на передачу данных по сети может уходить масса времени.А на обработку на локальной машине-доли секуды. Вот Например как это можно применить JavaScript для предварительного контроля правильности. Допустим простейшая форма содержит имя и возраст.Имя не должно быть пустым, а возраст должен состоять из цифр. <HTML><HEAD> <SCRIPT language="JavaScript"> <!-- function IsNumber(data){ var NumStr="0123456789"; var ch; var count; for(var i=0;i<data.length;i++){ ch=data.substring(i,i+1); if(NumStr.indexOf(ch)!=-1)count++; } if(counter==data.length) return true; else return false; } function IsEmpty(data){ if(data.length==0) return true; else return false; }
function IsFormOk(f){ if(IsEmpty(f.Name.value)){ alert('Имя не должно быть пустой строкой'); return false; } if(!IsNumber(f.Age.value)){ alert('Возраст должен состоять из цифр'); return false; } return true; } //--></SCRIPT></HEAD> <BODY> <FORM action="https://www.test.ru/cgi-bin/test.cgi" onSubmit="IsFormOk(this.form)"> Your Name:<INPUT name="Name"><BR> Your age:<INPUT name="Age"><BR> <INPUT type="submit" value="Послать Данные"> </FORM> </BODY></HTML> Ну вот ,на этом можно закончить это краткое введение в HTMLые формы. Итак,У нас на входе скрипта данные формы,закодированые методом urlencode Положеные в Переменную QUERY_STRING или подаваемые на STDIN.Мы должны вопервых их получить. if($ENV{'REQUEST_METHOD'} eq 'GET') { #Анализируем метод,GET или POST $query=$ENV{'QUERY_STRING'}; } elsif($ENV{'REQUEST_METHOD'} eq 'POST'){ sysread STDIN,$query,$ENV{'CONTENT_LENGTH'}; } Вот,мы уже считали наш запрос в переменную $query.Теперь пришло самое время ее обработать. Мы знаем что поля разделены символом '&' значит используем его в качестве разделителя функции split: @formfields=split /&/,$query; Вот разделили,а теперь организуем цикл foreach по полученым полям @formfields foreach(@formfields){ if(/^Name=(.*)/){$name=urldecode($1);} if(/^Age=(.*)/){$age=urldecode($1);} } Сдесь выражение в регулярном выражении в круглых скобках (.*) после знака '=',запоминается в скалярную переменную $1 ,которая затем и декодируется нашей старой и знакомой функцией urldecode (я предупреждал,что она будет почти в каждой вашей CGI-программе) sub urldecode{ #очень полезная функция декодирования local($val)=@_; #запроса,будет почти в каждой вашей CGI-программе $val=~s/\+/ /g; $val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge; return $val; } Так мы проходим по всем полям,которые нам переданы.Это стандартный подход,он годится в качестве шаблона.У вас может возникнуть вопрос,а что делать если вам переданы данные от списка у которого задана возможность выбора нескольких элементов и данные поступают в таком виде: Sel=opt1&Sel=opt2&Sel=opt9. Тут тоже нет никаких проблем,просто запихиваем эти поступающие значения в массив. foreach(@formfields){ ..... if(/^Sel=(.*)/){push @Sel,urldecode($1);} ..... } И потом спокойно оперируем с Полученым Массивом @Sel. На этом можно так сказать заканчивается шаблонная часть скрипта и начинается содержательная, которая зависит только от вашей фантазии..... Вы можете сколько угодно анализировать полученые значения,обращатся при этом к различным файлам .Если вы к этому приложите фантазию,то кто знает что получится.... |