Учебное пособие по CGI-программированию - Скрипт социологического исследования

ОГЛАВЛЕНИЕ

А Пока Ради примера я вам напишу скрипт,который ведет социологическое исследование насчет курения и отношения к нему.Может он слишком массивен для данного пособия, но зато он наглядно показывает как достаточно простыми средствами можно проводить социологические исследования.

<HTML><!-- HTML файл с формой,можете повесить его себе на сайт! -> <HEAD>
<TITLE>Социологический опрос насчет курения</TITLE></HEAD>
<BODY> <CENTER><H1>Социологический опрос насчет курения</H1></CENTER>
<FORM action="cgi-bin/smoketest.cgi"> <TABLE> <TR><TD>Ваш возраст:</TD><TD>
<INPUT name="age"></TD></TR> <TR><TD>Вы курите(Y/N):</TD> <TD>
<INPUT type="radio" name="smoke" value="Yes" checked>Да
<INPUT type="radio" name="smoke" value="No">Нет</TD></TR>
<TR><TD>Как вы относитесь если рядом кто-то курит?</TD>
<TD><SELECT name="sm_near">
<OPTION value="0">Резко негативно
<OPTION value="1">Негативно
<OPTION value="2" selected>Мне все равно
<OPTION value="3">Позитивно
<OPTION value="4">Резко позитивно
</SELECT> </TD></TR>
<TR><TD>Сколько вы выкуриваете в день?</TD>
<TD><SELECT name="sm_day">
<OPTION value="0">Ни сколько
<OPTION value="1">1 сигарету
<OPTION value="2">2 сигареты
<OPTION value="5">около 5
<OPTION value="0.5pac">полпачки
<OPTION value="pac">пачку
<OPTION value="2pac">2 пачки
<OPTION value="more">больше
</SELECT> </TD></TR>
<TR><TD>Как давно вы начали курить?</TD>
<TD><SELECT name="sm_stage">
<OPTION value="noatall">Не начинал
<OPTION value="onetime">Бросил
<OPTION value="0.5year">Полгода
<OPTION value="1year">Год
<OPTION value="2year">2 Года
<OPTION value="5year">5 Лет
<OPTION value="more">Больше
</SELECT> </TD></TR>
<TR><TD>Считаете ли вы это опасным для своего здоровья?</TD>
<TD><SELECT name="sm_danger">
<OPTION value="0">Очень Опасно
<OPTION value="1">Думаю,что да
<OPTION value="2" selected>Не знаю
<OPTION value="3">Может самую малость
<OPTION value="4">Нет,Безопасно.
</SELECT> </TD></TR>
<TR><TD>Хотите ли вы бросить?</TD>
<TD><SELECT name="sm_nosmoke">
<OPTION value="0">Уже бросаю
<OPTION value="1">Думаю бросить
<OPTION value="2" selected>Иногда
<OPTION value="3">Очень Редко
<OPTION value="4">Никогда.
</SELECT> </TD></TR>
<TR><TD><INPUT type="submit" value="Послать Данные"></TD>
<TD><INPUT type="reset" value="Очистить Форму">
</TD></TR> </TABLE> </FORM> </BODY></HTML>
А вот скрипт для его обработки:
#!/usr/bin/perl #smoketest.cgi $datafile="smoke.dat"; 
sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;
return $val;
}
sub print_err{
print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Error!!</TITLE></HEAD>";
print "<BODY><CENTER><H1>@_</H1>";
print "</BODY></HTML>";
exit;
}
if($ENV{'REQUEST_METHOD'} eq 'GET'){
$query=$ENV{'QUERY_STRING'};
}
elsif(
$ENV{'REQUEST_METHOD'
}
eq 'POST') {ysread STDIN,$query,$ENV{'CONTENT_LENGTH'};
}
if($query ne ''){
@formfields=split /&/,$query;
foreach(@formfields){
if(/^age=(.*)/){$age=urldecode($1);
}
if(/^smoke=(.*)/){
$smoke=urldecode($1);
}
if(/^sm_near=(.*)/){
$sm_near=urldecode($1);
}
if(/^sm_day=(.*)/){
$sm_day=urldecode($1);
}
if(/^sm_stage=(.*)/){
$sm_stage=urldecode($1);
}
if(^sm_danger=(.*)/){
$sm_danger=urldecode($1);
}
if(/^sm_nosmoke=(.*)/){
$sm_nosmoke=urldecode($1);
}
}
if((!$age)||($age=~/\D/)){
print "Content-Type: text/html\n\n";
print "<HTML><BODY><H2>Возраст введен неправильно,должен состоять из цифр.</H2>";
print "<FORM><INPUT type=\"button\" value=\"Вернуться назад к Анкете\"";
print "onClick=\"history.back();\"></FORM>";
print "</BODY></HTML>";
}
$anket_str=join '\t',($age,$smoke,$sm_near,$sm_day,$sm_stage,$sm_danger,$sm_nosmoke);
open DATA,">>$datafile" || print_err("Cannot open $datafile $!");
print DATA "$anket_str\n";
close DATA;
}
open DATA,"$datafile" || print_err("Cannot open $datafile $!");
@AllData=<DATA>;
close DATA;
$total=$#AllData;
foreach(@AllData){
($age,$smoke,$sm_near,$sm_day,$sm_stage,$sm_danger,$sm_nosmoke)=split /\t/,$_;
$smok_total++ if ($smoke eq 'Yes');
$nosmok_total++ if ($smoke eq 'No');
if($age<16){$age16_total++;
if($smoke eq 'Yes'){$age16_sm++;
}else{
$age16_nosm++;
}
}
if(($age>16)&&($age<=18)){$age16_18_total++;
if($smoke eq 'Yes'){$age16_18_sm++;}
else{$age16_18_nosm++;} }
if(($age>18)&&($age<=20)){$age18_20_total++;
if($smoke eq 'Yes'){$age18_20_sm++;}
else{$age18_20_nosm++;}
}
if($age>20){$age20_total++; if($smoke eq 'Yes'){$age20_sm++;}
else{$age20_nosm++;} }
if($sm_near eq '0'){$near0++;}
if($sm_near eq '1'){$near1++;}
if($sm_near eq '2'){$near2++;}
if($sm_near eq '3'){$near3++;}
if($sm_near eq '4'){$near4++;}
if($sm_day eq '0'){$day0++;}
if($sm_day eq '1'){$day1++;}
if($sm_day eq '2'){$day2++;}
if($sm_day eq '5'){$day5++;}
if($sm_day eq '0.5pac'){$dayhalfpac++;}
if($sm_day eq 'pac'){$daypac++;}
if($sm_day eq '2pac'){$day2pac++;}
if($sm_day eq 'more'){$daymore++;}
if($sm_stage eq 'noatall'){$stagenoatall++;}
if($sm_stage eq 'onetime'){$statgeonetime++;}
if($sm_stage eq '0.5year'){$stagehalfyear++;}
if($sm_stage eq '1year'){$stage1year++;}
if($sm_stage eq '2year'){$stage2year++;}
if($sm_stage eq '5year'){$stage5year++;}
if($sm_stage eq 'more'){$stagemore++;}
if($sm_danger eq '0'){$danger0++;}
if($sm_danger eq '1'){$danger1++;}
if($sm_danger eq '2'){$danger2++;}
if($sm_danger eq '3'){$danger3++;}
if($sm_danger eq '4'){$danger4++;}
if($sm_nosmoke eq '0'){$stopsmoke0++;}
if($sm_nosmoke eq '1'){$stopsmoke1++;}
if($sm_nosmoke eq '2'){$stopsmoke2++;}
if($sm_nosmoke eq '3'){$stopsmoke3++;}
if($sm_nosmoke eq '4'){$stopsmoke4++;} }
#########
print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Результаты обработки данных</TITLE></HEAD>";
print "<BODY bgcolor=\"yellow\">";
unless($total){print "<H1>Еще нет данных</H1></BODY></HTML>";
exit;
}
print "<CENTER><H1>Результаты обработки данных</H1></CENTER>";
print "<BR>\n"; print "Обработано анкет: $total<BR>\n";
print "Общие данные Всего:<BR>\n";
print "Курящие:$smok_total (".(($smok_total/$total)*100) ."%)<BR>\n";
print "Некурящие:$nosmok_total (".(($nosmok_total/$total)*100)."%)<BR>\n";
print "<TABLE>\n";
print "<TR><TD colspan=4>Возрастные группы:(<16,16..18,18..20,>20)</TD></TR>\n";
print "<TR><TD>Возраст</TD><TD>Курящие</TD><TD>Некурящие</TD>
<TD>Всего</TD></TR>\n";
print "<TR><TD>&lt;16:</TD><TD>$age16_sm</TD><TD>$age16_nosm</TD>
<TD>$age16_total</TD></TR>\n";
print "<TR><TD>16..18:</TD><TD>$age16_18_sm</TD><TD>$age16_18_nosm</TD>
<TD>$age16_18_total</TD></TR>\n";
print "<TR><TD>18..20:</TD><TD>$age18_20_sm</TD><TD>$age18_20_nosm</TD>
<TD>$age18_20_total</TD></TR>\n";
print "<TR><TD>&gt;20:</TD><TD>$age20_sm</TD><TD>$age20_nosm</TD>
<TD>$age20_total</TD></TR>";
print "</TABLE>\n";
print "<TABLE>\n";
print "<TR><TD colspan=2>Отношение когда кто-то курит рядом:(%)</TD></TR>\n";
print "<TR><TD>Резко негативно</TD><TD>".(($near0/$total)*100)."</TD></TR>\n";
print "<TR><TD>Негативно </TD><TD>".(($near1/$total)*100)."</TD></TR>\n";
print "<TR><TD>Мне все равно </TD><TD>".(($near2/$total)*100)."</TD></TR>\n";
print "<TR><TD>Позитивно </TD><TD>".(($near3/$total)*100)."</TD></TR>\n";
print "<TR><TD>Резко позитивно</TD><TD>".(($near4/$total)*100)."</TD></TR>\n";
print "</TABLE>\n"; print "<TABLE>\n";
print "<TR><TD colspan=2>В среднем выкуривают:(%)</TD></TR>\n";
print "<TR><TD>не курят: </TD><TD>".(($day0/$total)*100)."</TD></TR>\n";
print "<TR><TD>1 сигарету:</TD><TD>".(($day1/$total)*100)."</TD></TR>\n";
print "<TR><TD>2 сигареты:</TD><TD>".(($day2/$total)*100)."</TD></TR>\n";
print "<TR><TD>5 сигарет: </TD><TD>".(($day5/$total)*100)."</TD></TR>\n";
print "<TR><TD>полпачки: </TD><TD>".(($dayhalfpac/$total)*100)."</TD></TR>\n";
print "<TR><TD>пачку: </TD><TD>".(($daypac/$total)*100)."</TD></TR>\n";
print "<TR><TD>2 пачки: </TD><TD>".(($day2pac/$total)*100)."</TD></TR>\n";
print "<TR><TD>больше: </TD><TD>".(($daymore/$total)*100)."</TD></TR>\n";
print "</TABLE>\n";
print "<TABLE>\n";
print "<TR><TD colspan=2>Стаж курения:(%)</TD></TR>\n";
print "<TR><TD>Не начинал</TD><TD>".(($stagenoatall /$total)*100)."</TD></TR>\n";
print "<TR><TD>Бросил </TD><TD>".(($statgeonetime/$total)*100)."</TD></TR>\n";
print "<TR><TD>Полгода </TD><TD>".(($stagehalfyear/$total)*100)."</TD></TR>\n";
print "<TR><TD>Год </TD><TD>".(($stage1year /$total)*100)."</TD></TR>\n";
print "<TR><TD>2 Года </TD><TD>".(($stage2year /$total)*100)."</TD></TR>\n";
print "<TR><TD>5 Лет </TD><TD>".(($stage5year /$total)*100)."</TD></TR>\n";
print "<TR><TD>Больше </TD><TD>".(($stagemore /$total)*100)."</TD></TR>\n";
print "</TABLE>\n"; print "<TABLE>\n";
print "<TR><TD colspan=2>Курение опасно:(%)</TD></TR>\n";
print "<TR><TD>Очень Опасно </TD><TD>".(($danger0/$total)*100)."</TD></TR>\n";
print "<TR><TD>Думаю,что да </TD><TD>".(($danger1/$total)*100)."</TD></TR>\n";
print "<TR><TD>Не знаю </TD><TD>".(($danger2/$total)*100)."</TD></TR>\n";
print "<TR><TD>Может самую малость</TD><TD>".(($danger3/$total)*100)."</TD></TR>\n";
print "<TR><TD>Нет,Безопасно. </TD><TD>".(($danger4/$total)*100)."</TD></TR>\n";
print "</TABLE>\n"; print "<TABLE>\n";
print "<TR><TD colspan=2>Хотели ли вы бросить:(%)</TD></TR>\n";
print "<TR><TD>Уже бросаю </TD><TD>".(($stopsmoke0/$total)*100)."</TD></TR>\n";
print "<TR><TD>Думаю бросить</TD><TD>".(($stopsmoke1/$total)*100)."</TD></TR>\n";
print "<TR><TD>Иногда </TD><TD>".(($stopsmoke2/$total)*100)."</TD></TR>\n";
print "<TR><TD>Очень Редко </TD><TD>".(($stopsmoke3/$total)*100)."</TD></TR>\n";
print "<TR><TD>Никогда. </TD><TD>".(($stopsmoke4/$total)*100)."</TD></TR>\n";
print "</TABLE>\n"; print "</BODY></HTML>";