perl+sql+svg скрипт

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

добрый день,
я новичок в программировании на perl, поэтому не судите строго :)
написала cgi-скрипт на Perl, который должен обрабатывать данные полученные методом POST с html странички, передавать переменные в sql запрос, который в свою очередь обращается к oracle и возвращает по результатам обработки запроса ответ в виде SVG-графики.
Проверила уже миллион раз и запрос (работает), и синтаксис (вроде все ок), но ошибку так и не смогла найти:

Код: Выделить всё

#!/usr/local/bin/perl
use CGI;
$|=1;
print "Content-Type: image/svg-xml \n";
print "\n";

$ENV{"PATH"}="/usr/local/bin:/usr/bin:/opt/oracle/product/9.0.1/bin";
$ENV{"ORACLE_HOME"}="/opt/oracle/product/9.0.1";


my $query = new CGI;
my $county_name = $query->param('county_name');
my $developer = $query->param('developer');
my $operator = $query->param('operator');
my $wind_farm_type = $query->param('wind_farm_type');
my $owner = $query->param('owner');
my $turbine_model = $query->param('turbine_model');

print $county_name;
print $developer;
print $operator;
print $wind_farm_type;
print $owner;
print $turbine_model;


open SQLFILE, "|sqlplus -s name/password\@geog9";
print SQLFILE <<"ENDOFQUERY";

prompt <HTML>
prompt <HEAD>
prompt <TITLE>Wind Farms Search
prompt </TITLE>
prompt </HEAD>
prompt <BODY>

SET LINESIZE 2000
SET PAGESIZE 9999
SET NUMWIDTH 5
SET HEADING OFF

prompt <?xml version="1.0" standalone="no"?>
prompt <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"
prompt "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd">

prompt <svg x="0" y="0" width="100%" height="100%" viewBox="54669.796875 530297 359249.609375 525990.125">
prompt <g transform="matrix(1 0 0 -1 0 1586584.125 )">

select '<point cx="'||(XCOORD)||'" cy="'||YCOORD||'" r="0.1"
fill="GREEN"><set begin="mouseover" attributeName="r" to="0.3" dur="0.25s"/></circle>'
from s0564876.wind_farms wf, s0564876.county c, s0564876.developers d, s0564876.operators op, s0564876.farm_type ft, s0564876.owner ow, s0564876.turbine_model tm
where wf.county_id = c.county_id
and wf.developers_id = d.developers_id
and wf.operator_id = op.operator_id
and wf.owner_id = ow.owner_id
and wf.farm_type_id = ft.farm_type_id
and wf.turbine_id = tm.turbine_id
and c.COUNTY_NAME = ('$county_name')
and d.DEVELOPERS = ('$developer')
and op.OPERATOR_NAME = ('$operator')
and ft.FARM_TYPE = ('$wind_farm_type')
and ow.OWNER_NAME = ('$owner')
and tm.TURBINE_NA = ('$turbine_model')
/
prompt </g>
prompt </BODY>
prompt </HTML>
exit
ENDOFQUERY
close(SQLFILE);
При запуске скрипта из под unix он срабатывает, но не спрашивает переменные и не возвращает их (для проверки этого добавила print для каждой переменной). Сразу доходит до спецификаций SVG и говорит no row selected...
Кто подскажет, что тут не так, буду благодарна до конца своей жизни
UUU
Сообщения: 310
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

Давай по порядку:
1. вызови скрипт из командной строки и передай ему параметры: типа perl script.pl developer=dev operator=oper
и посмотри, что тебе выдаст скрипт.
Реклама запрещена. См. Профиль :-)
Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

спасибо! сейчас попробую
Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

kogda peredau parametri vrychnyu i vozvrashau s pomosh'u print "variable" to i zapros rabotaet i vibiraetsya vse kak nado
NO! ne otobrazhetsya svg graphika na stranichke. Kak tolko yadalyau peremennie perl, to nachinaet rabotat graphica.

Primer s peremennimi:

Код: Выделить всё

#!/usr/local/bin/perl

use CGI;

$|=1;
print "Content-Type: image/svg-xml\n";
print "\n";

$ENV{"PATH"}="/usr/local/bin:/usr/bin:/opt/oracle/product/9.0.1/bin";
$ENV{"ORACLE_HOME"}="/opt/oracle/product/9.0.1";

$query = new CGI;
$county_name = "Angus";
$developer = $query->param('developer');
$operator = $query->param('operator');
$wind_farm_type = $query->param('wind_farm_type');
$owner = $query->param('owner');
$turbine_model = $query->param('turbine_model');

print $county_name;
print "\n";


open SQLFILE, "|sqlplus -s s0564876/forgot\@geog9";
print SQLFILE <<"ENDOFQUERY";

SET LINESIZE 2000
SET PAGESIZE 9999
SET NUMWIDTH 5
SET HEADING OFF

prompt <?xml version="1.0" standalone="no"?>
prompt <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"
prompt "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd">

prompt <svg width="15cm" height="15cm" viewBox="100000 500000 300000 500000">
prompt <g transform="scale(1,1)">


select '<circle cx="'||(XCOORD)||'" cy="'||(YCOORD)||'" r="2000" fill="GREEN"></circle>' from s0564876.wind_farms wf, s0564876.county c where wf.county_id = c.county_id and c.county_name = '$county_name'
/
prompt </g>
prompt </svg>

exit
ENDOFQUERY
close(SQLFILE);
Primer bez peremennix:

Код: Выделить всё

#!/usr/local/bin/perl

$|=1;
print "Content-Type: image/svg-xml\n";
print "\n";

$ENV{"PATH"}="/usr/local/bin:/usr/bin:/opt/oracle/product/9.0.1/bin";
$ENV{"ORACLE_HOME"}="/opt/oracle/product/9.0.1";


open SQLFILE, "|sqlplus -s s0564876/forgot\@geog9";
print SQLFILE <<"ENDOFQUERY";

SET LINESIZE 2000
SET PAGESIZE 9999
SET NUMWIDTH 5
SET HEADING OFF

prompt <?xml version="1.0" standalone="no"?>
prompt <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"
prompt "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd">

prompt <svg width="15cm" height="15cm" viewBox="100000 500000 300000 500000">
prompt <g transform="scale(1,1)">


select '<circle cx="'||(XCOORD)||'" cy="'||(YCOORD)||'" r="2000" fill="GREEN"></circle>' from s0564876.wind_farms wf, s0564876.county c where wf.county_id = c.county_id and c.county_name = 'Angus'
/
prompt </g>
prompt </svg>

exit
ENDOFQUERY
close(SQLFILE);

mozhet ya kak-to nepravil'no peremennie deklariryu? ili eto iz-za togo cho svg-graphica ispol'zyetsya?
Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

Aga, razobralas v chem problema - problema v zagolovke MIME - grybo govorya, esli ispolzovat zagolovok "Content-Type: image/svg-xml\n", to browser ne ponimaet chto takoe peremennie Perl ( i lubie drygie html-tags)
Vopros - chto zhe delat'?
kak initsializirovat parametri Perl, esli content-type - eto image/svg-xml?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Анна, на первый раз транслит прощаю. Потом буду резать недожидаясь перетонитов © Есть замечательный сервис под названием translate.ru
Даже самый дурацкий замысел можно воплотить мастерски
Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

to Aik. спасибо!
новый вопрос - прощу прощения за настырность - но очень нужно и очень срочно. Во вторник сдавать лабораторную
---
пытаюсь декодировать url

Код: Выделить всё

if($ENV{'REQUEST_METHOD'} eq 'GET'){
$test=$ENV{'QUERY_STRING'};
}
elsif($ENV{'REQUEST_METHOD'} eq 'POST'){
sysread STDIN,$test,$ENV{'CONTENT_LENGTH'};
}

@formfields=split /&/,$query;
foreach(@formfields){
if(/^login=(.*)/){$login=urldecode($1);}
}

sub urldecode{ 
local($val)=@_; 
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;
return $val;
}
для того чтобы использовать переменную $test в sql-запросе

Код: Выделить всё

select '<circle cx="'||(XCOORD)||'" cy="'||(YCOORD)||'" r="2000" fill="GREEN"></circle>'
from s0564876.wind_farms wf, s0564876.county c, s0564876.developers d, s0564876.operators op, s0564876.farm_type ft, s0564876.owner ow, s0564876.turbine_model tm
where where wf.county_id = c.county_id
and wf.developers_id = d.developers_id
and wf.operator_id = op.operator_id
and wf.owner_id = ow.owner_id
and wf.farm_type_id = ft.farm_type_id
and wf.turbine_id = tm.turbine_id
and $test
так вот - вопрос такой - если передаю в url только одну переменную например
http://xxxxx/local-bin/username/search.pl?id=1
то все работает
а если передаю например
http://xxxxx/local-bin/username/search. ... &+or+id2=3
то начинаются проблемы с тем, что символы & и + не декодируются и sql их не понимает. Как быть?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

1) параметры надо передавать в виде par1=val1&par2=val2
2) обработку параметров можно делать так:

Код: Выделить всё

     my @pairs = ();

    # read parameters - we expect only POST and GET methods
    if (($ENV{'REQUEST_METHOD'}) and ($ENV{'REQUEST_METHOD'} eq 'POST')) {
        $buffer = '';
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
        @pairs = split(/&/, $buffer);
    }
    elsif ($ENV{'QUERY_STRING'}) {
        @pairs = split(/&/, $ENV{'QUERY_STRING'});
    }

    foreach $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $form{$name} = $value;
    }
3) в SQL у тебя должно получится что-то в виде:

Код: Выделить всё

 and (id = 1 or id=2)
А у тебя это не получится, т.к. значения переданных скрипту параметров 1 и 3, а не or od2=3, как ты ожидаешь.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Да, к параметрам в моём примере обращаться так: $form{par1} и т.д
Ежели надо передать & в значении параметра, то нужно писать %26.
Даже самый дурацкий замысел можно воплотить мастерски
Анна
Сообщения: 10
Зарегистрирован: 08 фев 2006, 02:48
Контактная информация:

спасибо огромное! попробовала применить - все компилируется и могло бы работать если бы MIME был не image/svg+xml, а text/ html
вот бывают же такие задания, что и сделать-то их не возможно. :( ((

получается следующая вещь, когда я пытаюсь присвоить значение параметра $form{par1} внутри sql-запроса

Код: Выделить всё

select * from table where
name = $form{name}
то браузер не может понять что это за переменная,

если же пишу напрямую

Код: Выделить всё

select * from table where
name = $value
из кода, то все работает (понятно, что передаю я тогда в url только одну переменную)
Нет ли какого-то способа обратиться к параметрам через $form{par1} не в самом sql-запросе а раньше?
что бы в sql запросе можно было писать

Код: Выделить всё

select * from table where
name = $value1 and surname = $value2 and type=$value3  
и тд.?
Ответить