Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Артем Р. Гость
|
Добавлено: Ср Окт 06 2004 18:34 Заголовок сообщения: Не сложный вопрос PERL-специалисту |
|
|
Здравствуйте, у меня дурацкая проблема, но решить не получатся - опыта не хватает. Буду признателен, если поможете.
programme.pl:
if (var eq "run") {&chekpass;}
else {&passwordform;}
sub passwordform { print
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
}
sub chekpass {
if($FORM{'pass'} eq $pass) {... &transfer...}
}
Далее в тексте sub transfer
<a href=programme.pl?page=$to>$num</a>
Вместо перехода на указанную страницу, получаю passwordform |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Чт Окт 07 2004 03:51 Заголовок сообщения: |
|
|
1. - if (var eq "run") {&chekpass;}
2. - <a href=programme.pl?page=$to>$num</a>
Если это не опечатка,то должно быть
2. - <a href=programme.pl?page=$to>$run</a>
или посмотри,какое значение в этой переменной,у тебя в строке 1 происходит сравнение со значением "run" и соотвественно,если не совпадает то вызывается: else {&passwordform;}
В перле я не специалист,но при наличии всего кода мог бы чего посоветовать. |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Чт Окт 07 2004 03:54 Заголовок сообщения: |
|
|
Или попробуй просто вставить $to = "run",звиняюсь $num здесь не при чем |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Чт Окт 07 2004 11:02 Заголовок сообщения: |
|
|
if ($var eq "run") {&chekpass;}
else {&passwordform;} _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
Артём Р. Гость
|
Добавлено: Чт Окт 07 2004 14:46 Заголовок сообщения: |
|
|
Нет, в приведённом коде нет опечаток, весь синтаксис проверен и приведён в кратком изложении. Единственное, первую строку следует читать как: if ($var eq "run") {&chekpass;}
Эту ошибку я допустил уже набирая код в форуме.
Более подробный код следует ниже, однако, если вы разобрались с первоначально приведённым, не стоит тратить время - ниже, ничего существенно важного не написано. На самом деле, я понимаю в чём проблема: при попытке передать скрипту programme.pl значение page=$to, скрипт не обрабатывает его, так как выполняется вторая строка else {&passwordform;}, котурую, в свою очередь вызывает первая, не находя значений $FORM{'var'} и $FORM{'pass'}
programme.pl:
if ($var eq "run") {&chekpass;}
else {&passwordform;}
sub passwordform {
print <<PASSFORM;
<html>
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
</html>
PASSFORM
}
sub chekpass
{
if($FORM{'pass'} eq $pass) {
&beginhtml;
&mainpart;
&transfer;
&endhtml;
}else{ print "не правильный пароль";}
}
sub beginhtml
{
print <<BEGIN;
<html>
...
BEGIN
}
sub mainpart
{
здесь идёт продолжительный список операций, который выполняется правильно - к нему претензий нет
}
sub transfer
{
print "<tr align=\"center\" valign=\"middle\">\n";
print"<td><font class=link>Другая страница :</font>\n";
$allmass = int($all / $numberonpage)+1;
print " \n";
for($i=1;$i <= $allmass;$i++)
{
$to=$i*$numberonpage-$numberonpage;
$a=$page/10+1;
if($a ne $i)
{print " <a class=link href=programme.pl?page=$to>$i</a> ";}
else
{print "<font class=link>$i</font> ";}
}
print "\n</td></tr>\n";
}
sub endhtml
{
print <<ENDHTML;
...
</html>
ENDHTML
}
_________
Где:
$all = всего *****
$numberonpage = 12 ***** ввыводится на одну страницу
$i = номер страницы ($all/$numberonpage)
$to = соответствующая $i ссылка (например: <a class=link href=programme.pl?page=24>3</a>
$page = первоначальное (до перехода на другие страницы) значение 0 (ноль) |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Пт Окт 08 2004 03:24 Заголовок сообщения: |
|
|
Теперь понял,попробуй вместо if ($var eq "run") {&chekpass;}
написать if ($var eq 'run') {&chekpass;}
В перле судя по всему рабрта со строковыми идет через одинарные кавычки или проверь значение переменной $var |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Пт Окт 08 2004 09:20 Заголовок сообщения: |
|
|
Если последний листинг достаточно полный, то непонятно кто такая $var, т.е. где оно инициализируется?? _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Пт Окт 08 2004 10:32 Заголовок сообщения: |
|
|
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
Как я понял,хотя могу и ошибаться $var - поле ввода и передается текущее значение. |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Пт Окт 08 2004 11:16 Заголовок сообщения: |
|
|
Дык может проблема как раз в том и есть как из формы в переменную $var значение передается _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Пт Окт 08 2004 11:42 Заголовок сообщения: |
|
|
может быть,только ни у тебя ни у меня возможности проверить идею нет(ну хотя сильно изгольнуться),а автор куда то пропал,так что... |
|
Вернуться к началу |
|
|
FUKS
Зарегистрирован: 14.04.2002 Сообщения: 148 Откуда: Москва
|
Добавлено: Пт Окт 08 2004 11:51 Заголовок сообщения: |
|
|
Витал писал(а): | <form action=programme.pl method=post>
<input type=hidden name="var" value="run">
...
Как я понял,хотя могу и ошибаться $var - поле ввода и передается текущее значение. |
Вообще-то это значение попадает в переменную $ENV{var} (она же $ENV{'var'})... |
|
Вернуться к началу |
|
|
Артем Р. Гость
|
Добавлено: Пт Окт 08 2004 14:33 Заголовок сообщения: |
|
|
Только без обид
Имя темы "не сложный вопрос перл-специалисту" - по-моему подразумевает, что отвечающий должен немножко разбираться как в Perl, так и в html. Гадания откуда взялась переменная $var и как ей присваивается значение считаю, как бы это... Ага! как раз вот, так, как Вы подумали.
Итак, переменная var ($var) передаётся программе автоматически из html-формы после нажатия на кнопку "Продолжить" (ничего заполнять не нужно - это можно понять прочитав input type=hidden) Заполнять нужно поле пароль ($pass), который и проверяется в случае, если скрипт получил значение $var ="run", в случае, если $var имеет другое значение (не равное "run"), или вообще скрипту не передаётся выводится html-форма кратко описанная в sub passform. Всё это становится понятно по прочтении первых двух строчек программы и sub passform.
Цитата: | Вообще-то это значение попадает в переменную $ENV{var} (она же $ENV{'var'}) |
Так точно, FUKS, операцию присвоения переменной $var значения $ENV{var} я опустил для краткости.
Ещё раз повторюсь: программа выполняется абсолютно правильно: выводится форма, спрашивается пароль, если он верен, правильно выполняется
&beginhtml;
&mainpart;
&transfer;
&endhtml;
Выводя, как можно понять, html-страницу на которой, в нижней части есть ссылки вида "1 2 3 4 5 6 7" (их туда засовывает sub trasrer), каждая из которых ведёт на следующую страницу ( так, на странице 1 отображаются блоки, к примеру картинки, с первой по двенадцатую, на второй, соответственно - с тринадцатой по двадцать четвёртую и так далее), так вот, для того, что бы перейти на вторую страницу и увидеть блоки (картинки ) под номерами 13-24, нужно нажать на цифру 2, которая, как вы уже догадались, является ссылкой вида "programme.pl?page=12" заставляющая Ваш браузер передать моей программе значение преременной page равное 12. Но моя программа команду вашего браузера проигнорирует решив, раз мне не пришло значение $var="run", да ещё и пароль не набран, а вместо этого всего подсовывают какое-то значение $page=12, пора выполнять &passform, и Вы, вместо картинок 13-24 увидите перед собой html-документ кратко описанный в sub passform (форма, где у вас спросят пароль)
Предвидя ваши рекомендации, сообщаю, что ссылка вида: programme.pl?var=run?pass=pass?page=12 - не работает, к тому же, передавать в адресную строку броузера значение пароля - не безопасно -- сами понимаете.
Вот такая кострукция, тоже почему-то работать отказалась:
Код: | (кратко)
if ($var eq "run") {&chekpass;}
elsif ($var eq "nopass") {&dowhatisayfuckingprogramm;}
else {&passwordform;}
[b]sub passwordform[/b] { print
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
}
[b]sub chekpass[/b] {
if($FORM{'pass'} eq $pass) {$var="nopass";...&transfer...}
}
[b]sub dowhatisayfuckingprogramm[/b] {...&transfer...}
Далее в тексте sub transfer
<a href=programme.pl?var=nopass?page=$to>$num</a> |
Но этот вариант ещё не достаточно дебагнут, и возможно - это ключ к решению ошибки.
Спасибо |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Пт Окт 08 2004 14:44 Заголовок сообщения: |
|
|
Цитата: | Гадания откуда взялась переменная $var и как ей присваивается значение считаю |
Иногда ошибки скрываются в самых легкопонимаемых и простых местах...
Сделал бы вывод переменной $var до сравнения и посмотрел чему она равна, чтобы у нас не было сомнений по этому поводу _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Пт Окт 08 2004 14:48 Заголовок сообщения: |
|
|
А можно вопрос?
Что будет, если я просто в броузере наберу
http://yourhost/cgi-bin/programme.pl?var=nopass&page=3 ???
Есть такой механизм - сессии называется.
Специально для таких случаев придуман _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
Артем Р. Гость
|
Добавлено: Пт Окт 08 2004 18:46 Заголовок сообщения: |
|
|
Alexandr 172, вы издеваетесь надо мной?
Прочитайте пожалуйста внимательно мой последний пост - там я всё подробно расписал. Так подробно, что перечитывая, мне даже стыдно становится.
Scaramouch
Я так и пробовал, только почему-то всё равно пассформ.
А с сессиями не знаком, я вообще-то по-образованию и призванию больше экономист (маркетолог - конкретно), чем программист. Руководство поставило задачу сделать модный интерактивный сайт, а поскольку оказалось, что в компьютерах разбираюсь лучше всех я, да ещё и в художке 6 лет учился - ответственным за проект назначили меня, вот и парюсь. Буду признателен, если Вы кратко опишите механизм работы с сессиями.
Да! И кстати!!
Цитата: | programme.pl?var=nopass&page=3 |
Я всегда набирал programme.pl?var=nopass?page=3 - может, по-этому и не работает? |
|
Вернуться к началу |
|
|
Витал
Зарегистрирован: 09.08.2004 Сообщения: 73
|
Добавлено: Пн Окт 11 2004 04:18 Заголовок сообщения: |
|
|
Я сразу сказал что в перле не специалист,хотел как лучше получилось как всегда.Кстати насчет сессий-это вариант,как они реализованы-поискай в инете.А так у тебя как я понял первый раз страница отображается нормально,верно?У тебя при первом запуске перменная не равна "run" поэтому сабпассворд создает компонетн на форме- var дальше ты щелкаешь отправить и у тебя опять же в этот файл передается значение "run" и все прекрасно,только у тебя в данный момент нет инпута var и при следующем переходе опять попадаешь на пассворд,чем это лечиться - работой с переменными через сессии или вынеси создание инпута var в общий модуль,чтоб создавался в любом случае,а равнялся какому-либо значению исходя из условий,так тоже должно заработать. |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Пн Окт 11 2004 09:36 Заголовок сообщения: |
|
|
Цитата: | Я всегда набирал programme.pl?var=nopass?page=3 |
Вот это уже ближе к пониманию причин неправильной работы скрипта.
И как раз очень просто (это к моему посту, о том что ошибка может быть простой) _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Пн Окт 11 2004 10:57 Заголовок сообщения: |
|
|
К сожалению, я Перл использую только для системного администрирования, а сайты делаю на ПХП, так что как реализованы сессии в перле, не знаю. Но можешь поискать на CPAN, там точно есть.
Но для твоей несложной задачи можно реализовать их самостоятельно.
Вкратце опишу механизм.
При поступлении логина/пароля от пользователя ты генеришь уникальный идентификатор сессии. Потом кладешь все поступившие данные и этот идентификатор в бд или в файл - как тебе больше нравится.
Потом каким-нибудь образом заставляешь клиента каждый раз передавать тебе этот идентификатор. ПХП, например, кладет этот ид в куки, а также присоединяет его ко всем ссылкам и во все формы вписывает хидден-поле с идентификатором. Ты наверняка видел URL'и, к которым приписано что-то вроде &PHPSESSID=84738c7308213941b8986f66d46d7e05 - это оно и есть.
По этому идентификатору ты и определяешь пользователя и получаешь доступ ко всем его переменным(логину, паролю и т.п.).
Естественно, эту сессию нужно хранить в течение определенного времени - в пхп по дефолту 24 минуты.
P.S. Да, формат query string именно такой, как я написал, то есть переменные разделяются &
P.P.S. Ты зря наехал на Александра - он тебе сказал очень умную вещь. Ты можешь думать про переменную что угодно, но если какое-то сравнение с ее участием не работает или работает не так, как должно, то первое, что ты должен сделать - это написать print $var; и явно посмотреть что она содержит, а потом подумать, почему она содержит не то, что тебе хочется
P.P.P.S. И совет напоследок. Если есть возможность, постарайся убедить руководство обратиться к профессионалам. Они сделают качественнее, надежнее и обеспечат нужную поддержку. Не будешь же ты осуществлять поддержку сам, у тебя на это просто не хватит времени.
Я же не занимаюсь маркетинговыми исследованиями,почему же ты занимаешься моей работой? _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Ср Ноя 17 2004 19:34 Заголовок сообщения: |
|
|
Посмотри хорошенько какую-нибудь статью про CGI. $ENV{'var'} не будет содержать то, что ты там хочешь прочитать. Если метод GET, то строка запроса полностью находится в $ENV{'QUERY_STRING'} если метод POST, ты ее читаешь из стандартного входа скрипта. Дальше разбираешь сам. Чтобы этого не было надо использовать модуль CGI. |
|
Вернуться к началу |
|
|
FUKS
Зарегистрирован: 14.04.2002 Сообщения: 148 Откуда: Москва
|
Добавлено: Чт Ноя 18 2004 16:24 Заголовок сообщения: |
|
|
Гость писал(а): | $ENV{'var'} не будет содержать то, что ты там хочешь прочитать. Если метод GET, то строка запроса полностью находится в $ENV{'QUERY_STRING'} |
Да, точно, что-то я тут напахал Код: |
sub upc { # Раскодировка
foreach (@_) {
s/\+/ /g;
s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
s/'/\\'/g;
}
}
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
$buf=$ENV{'QUERY_STRING'};
} else {
$buf=$ENV{'QUERY_STRING'};
}
%parms=qw //;
@qs=split /&/,$buf;
foreach (@qs) {
my($n,$v)=split /=/;
&upc($v);
$parms{$n}=$v
}
# Теперь %parms содержит параметры формы, в частности var лежит в $parms{var} |
|
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пт Ноя 19 2004 04:47 Заголовок сообщения: |
|
|
Все хорошо, кроме того, что ен учтено кодирование пробелов и прочих спецсимволов.
#---------------------------------------
use CGI qw (:standard);
$query = new CGI;
#@.....
#.... ANY CODE
#.....
$last_name = $query->param('last_name');
#------------------------------------------------------
Это использование стандартного модуля. Оно работает всегда и хорошо.
http://webmaster.xeno.ru/cgi_05_02.shtml
А здесь подробнее. И вообще там целый учебник... |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пт Ноя 19 2004 04:49 Заголовок сообщения: |
|
|
Сослепу не заметил декодирование в предпредыдущем посте. Но актуальность модуля CGI от этого не уменьшается. |
|
Вернуться к началу |
|
|
FUKS
Зарегистрирован: 14.04.2002 Сообщения: 148 Откуда: Москва
|
Добавлено: Пт Ноя 19 2004 16:34 Заголовок сообщения: |
|
|
Да, так конечно элегантнее, просто не люблю дополнительными модулями пользоваться, даже стандартными, когда можно сделать ручками и без них, тоже вполне стандартно. По мне так лучше пользоваться сотней кирпичей для ВСЕГО, чем изучать тыщу крупнопанельных конструкций для каждого частного случая свою 8-)
"Да ежели всех вас помнить, то забудешь сколько водка стоит"(С) |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пт Ноя 19 2004 18:49 Заголовок сообщения: |
|
|
Это уж дело вкуса, пока речь не идет о производстве кода с промышленной скоростью и в промышленных количествах. Кроме этого стандартные модули могут гораздо больше и они уже отлажены, а твой код еще нет. |
|
Вернуться к началу |
|
|
|