Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Per/CGI кто-нибудь... Подскажите!!!

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Интернет
Предыдущая тема :: Следующая тема  
Автор Сообщение
Pavel_kz
Гость





СообщениеДобавлено: Вт Апр 13 2004 06:22    Заголовок сообщения: Per/CGI кто-нибудь... Подскажите!!! Ответить с цитатой

помогите плиз! Больше обратиться не к кому!!!
ситуация следущая: из формы на веб странице в cgi скрипт отправляются данные( одно значение) - сценарий дожен открыть файл на HDD и выбрав из масива совпадение - выдать его в браузер:

#!e:/perl/bin -w
use strict;
use CGI ':standart';
open (VREM, "<c:/Inetpub/scripts/part1.txt")|| die;
my @allrnn;
@allrnn=<VREM>;
close (VREM);
my $value;
my $rnn;
$value = param("RNN_form"); #это значение брётся из формы запроса #(метод post)
foreach $rnn(@allrnn)
{
if ($rnn =~ /$value/)
{
print "Content-type: text/html\n\n";
print $rnn;
}

}
В простом варианте пёрл проги(естественно значение ввожу с консоли) - работает без проблем, а вот как cgi -сценарий не хочет. В чём трабл???
Буду рад любому совету!!!!
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Вт Апр 13 2004 13:56    Заголовок сообщения: скорее всего, дело в Права Доступа Ответить с цитатой

Скорее всего, проблема с правами на чтение/запись,
которые даёт над собой делать Ваш файл с данными,
и с правами самого cgi-скрипта.

Поэкспериментируйте.
Разрешите всем писать в файл и читать файл.

chmod ugo+rw part1.txt

Посмортите, заработает или нет.
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Вт Апр 13 2004 14:06    Заголовок сообщения: Content-type Ответить с цитатой

Код:

foreach $rnn(@allrnn) {

                                        if ($rnn =~ /$value/) {
                                        print "Content-type: text/html\n\n";
                                        print $rnn;
                                         }#fi

                                  }#end foreach


У Вас, если в нескольких строках массива @allrnn
содержится подходящая величина, то каждый раз
в браузер, на одну и ту же страницу печатается
Content-type: text/html\n\n

Код:
                                        print "Content-type: text/html\n\n";


Строка
Content-type: text/html\n\n
должна быть напечатана только один раз.


Сделайте лучше так:
Код:

print "Content-type: text/html\n\n";

foreach $rnn(@allrnn) {

                                       if ($rnn =~ /$value/) {
                                        print "$rnn\n";
                                         }#fi

                                  }#end foreach
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Вт Апр 13 2004 18:18    Заголовок сообщения: die, $! и CGI::Carp Ответить с цитатой

Кроме того, не советую просто так умирать, открывая и закрывая файл.
Не поленитесь и напечатайте содержимое переменной $! -
в ней содержится диагноз ошибки, заставившей скрипт "умереть".

Например, можно сделать так.
Код:

open (VREM, "<c:/Inetpub/scripts/part1.txt")|| die "can not open VREM $!\n";


и так

Код:

close (VREM) || die "can not close VREM $!\n";



Наконец, выводите ошибки прямо в окно браузера.
Код:

use CGI::Carp qw(fatalsToBrowser);


Т.е. попробуйте вот так.

Код:
#!e:/perl/bin -w
use strict;
use CGI ':standart';
use CGI::Carp qw(fatalsToBrowser);


open (VREM, "<c:/Inetpub/scripts/part1.txt") || die
"can not open VREM $!\n"; 

my @allrnn;
@allrnn=<VREM>;
close (VREM) || die "can not close VREM $!\n";
 
my $value;
my $rnn;

$value = param("RNN_form"); #это значение брётся из формы запроса
#(метод post)

print "Content-type: text/html\n\n";

foreach $rnn(@allrnn) {
                                     if ($rnn =~ /$value/) { print "$rnn\n"; } #fi
                       }#end foreach
Вернуться к началу
Pavel_kz
Гость





СообщениеДобавлено: Ср Апр 14 2004 11:39    Заголовок сообщения: спасибо и тем не менее Ответить с цитатой

Спасибо за ответы - ошибку действительно стало выводить в браузер - но я её и так знал просматривая логи. оговорюсь сразу: у меня на компе ОС WINXP; WWW - сначала стоял IIS( я думал что трабл - в нём), сейчас Apache1.3.27 Active perl 5.1.... но что при том сервере что при этом ошибку выдаёт такую
Undefined subroutine &main::param called at с:\APACHE~1\apache\cgi-bin\prob.pl line 17.

так в чём может быть дело? - такое ощущение что скрипт не пониает информацию отправленную с формы или на понимат функцию param из CGI.pm
если можно не оставьте без внимания!!!
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Ср Апр 14 2004 12:40    Заголовок сообщения: попробуйте работать с CGI.pm в ООП-стиле Ответить с цитатой

Код:
...
use CGI;
my $query = new CGI;
...
my $value;
...
$value = $query->param("RNN_form");
Вернуться к началу
Pavel_kz
Гость





СообщениеДобавлено: Пт Апр 16 2004 05:26    Заголовок сообщения: Per/CGI кто-нибудь... Подскажите!!! Ответить с цитатой

Спасибо! Теперь действительно всё заработало Smile
Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" - ни в одной книге по перловке этого не встретил.
И ещё каким образом можно представить файл не в виде массива, а в виде хэша чтобы скрипт поиска соответствия работал быстрее ( файл с данными очень большой и ежемесячно будет увеличиваться), а ожет есть другие способы ускорить работу скрипта?
Заранее благодарен,
Павел
если что мой e-mail: pavel_home@shym.kz
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Вт Апр 20 2004 13:19    Заголовок сообщения: Вы не должны, но можете. Ответить с цитатой

Цитата:

Спасибо! Теперь действительно всё заработало

Это хорошо Smile

Цитата:

Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" -


Потому что Вы писали
Код:

use CGI ':standart';


а надо было

Код:

use CGI ':standard';


или

Код:

use CGI qw(:standard);


- на конце буква d, а не буква t.
Я сам только сейчас заметил эту описку в Вашем коде. Smile

Цитата:
Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" - ни в одной книге по перловке этого не встретил.


Вы не обязаны, но можете. Мне обьектный синтаксис кажется более прозрачным и внятным.
Павел, а какие книжки по перлу у Вас есть? Вы их читаете вообще-то, прежде чем задавать вопросы на форуме? Smile Там ведь всё написано!

Цитата:

И ещё каким образом можно представить файл не в виде массива, а в виде хэша чтобы скрипт поиска соответствия работал быстрее


Хм. Если значениями хэша сделать строки файла, то ключами хэша можно сделать номера строк... Но зачем?
Я не уверен, что поиск будет быстрее.

Цитата:

( файл с данными очень большой и ежемесячно будет увеличиваться), а может есть другие способы ускорить работу скрипта?


Правило 100 записей: Если записей больше 100, то работайте с базой данных, а не с двумерным файлом.

Начните хотя бы с BerkleyDB.

А лучше сразу поставьте себе MySQL и работайте с её таблицами, как все люди. Smile
И будет Вам Счастье. SmileSmile
Вернуться к началу
Дмитрий Арсентьев
Гость





СообщениеДобавлено: Вт Апр 20 2004 23:59    Заголовок сообщения: чуть подробнее Ответить с цитатой

Я недостаточно чётко обьяснил, почему вот этот вот код не заработал.
Код:
#!e:/perl/bin -w
use strict;
use CGI ':standart';
use CGI::Carp qw(fatalsToBrowser);


open (VREM, "<c:/Inetpub/scripts/part1.txt") || die
"can not open VREM $!\n"; 

my @allrnn;
@allrnn=<VREM>;
close (VREM) || die "can not close VREM $!\n";
 
my $value;
my $rnn;

$value = param("RNN_form"); #это значение брётся из формы запроса
#(метод post)

print "Content-type: text/html\n\n";

foreach $rnn(@allrnn) {
                                     if ($rnn =~ /$value/) { print "$rnn\n"; } #fi
                       }#end foreach
 


Этот код не заработал из-за строчки
Код:
use CGI ':standart';


А надо было написать
Код:
use CGI ':standard';


- на конце буква d.

И тогда всё работает без использования обьектного стиля.

А когда мы переписали работу с модулем CGI.pm в обьектном стиле,
то строка с опиской
Код:
use CGI ':standart';


была заменена синтаксически верной строкой
Код:
use CGI;


Описка была непреднамеренно исправлена.
Сам по себе обьектный стиль не несёт никаких чудес.

Разумеется, Вы можете работать с CGI.pm как в стиле standard,
так и в обьектном стиле.
Сообщение об ошибке
Код:
Undefined subroutine &main::param called at с:\APACHE~1\apache\cgi-bin\prob.pl line 17.


появлялось именно из-за того, что слово standard
было написано неверно - с буквой t на конце.
Если бы слово standard было сразу написано верно, то и к обьектному стилю прибегать бы не пришлось.

Мы оба прошляпили эту ошибку. Sad

Спасибо за диалог. Smile
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Интернет Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...