Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 кто-нибудь... Подскажите!!! |
|
|
Спасибо! Теперь действительно всё заработало
Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" - ни в одной книге по перловке этого не встретил.
И ещё каким образом можно представить файл не в виде массива, а в виде хэша чтобы скрипт поиска соответствия работал быстрее ( файл с данными очень большой и ежемесячно будет увеличиваться), а ожет есть другие способы ускорить работу скрипта?
Заранее благодарен,
Павел
если что мой e-mail: pavel_home@shym.kz |
|
Вернуться к началу |
|
|
Дмитрий Арсентьев Гость
|
Добавлено: Вт Апр 20 2004 13:19 Заголовок сообщения: Вы не должны, но можете. |
|
|
Цитата: |
Спасибо! Теперь действительно всё заработало
|
Это хорошо
Цитата: |
Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" -
|
Потому что Вы писали
Код: |
use CGI ':standart';
|
а надо было
Код: |
use CGI ':standard';
|
или
Код: |
use CGI qw(:standard);
|
- на конце буква d, а не буква t.
Я сам только сейчас заметил эту описку в Вашем коде.
Цитата: | Но нельзя ли объяснить почему я должен объявлять переменные и даже "новый CGI" - ни в одной книге по перловке этого не встретил.
|
Вы не обязаны, но можете. Мне обьектный синтаксис кажется более прозрачным и внятным.
Павел, а какие книжки по перлу у Вас есть? Вы их читаете вообще-то, прежде чем задавать вопросы на форуме? Там ведь всё написано!
Цитата: |
И ещё каким образом можно представить файл не в виде массива, а в виде хэша чтобы скрипт поиска соответствия работал быстрее
|
Хм. Если значениями хэша сделать строки файла, то ключами хэша можно сделать номера строк... Но зачем?
Я не уверен, что поиск будет быстрее.
Цитата: |
( файл с данными очень большой и ежемесячно будет увеличиваться), а может есть другие способы ускорить работу скрипта?
|
Правило 100 записей: Если записей больше 100, то работайте с базой данных, а не с двумерным файлом.
Начните хотя бы с BerkleyDB.
А лучше сразу поставьте себе MySQL и работайте с её таблицами, как все люди.
И будет Вам Счастье. |
|
Вернуться к началу |
|
|
Дмитрий Арсентьев Гость
|
Добавлено: Вт Апр 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'; |
была заменена синтаксически верной строкой
Описка была непреднамеренно исправлена.
Сам по себе обьектный стиль не несёт никаких чудес.
Разумеется, Вы можете работать с CGI.pm как в стиле standard,
так и в обьектном стиле.
Сообщение об ошибке
Код: | Undefined subroutine &main::param called at с:\APACHE~1\apache\cgi-bin\prob.pl line 17.
|
появлялось именно из-за того, что слово standard
было написано неверно - с буквой t на конце.
Если бы слово standard было сразу написано верно, то и к обьектному стилю прибегать бы не пришлось.
Мы оба прошляпили эту ошибку.
Спасибо за диалог. |
|
Вернуться к началу |
|
|
|