Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CGI POST+GET, Приходит только одно... 
:(
    Опции темы
sergejzr
Дата 15.5.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Привет!
У меня проблема возникла. Если на сервер отходит формуляр и с POST и с GET, почему то CGI на GET внимания не обращает. Насколько я знаю раньше всё работало.... Может настройки какие сбились?

Пример:

Код

<form method="post" action="test.pl?id=9">
Login: <input name="login" value="tralala"/><br>
<input  type="submit" value="Send" />
</form>


Код

use CGI;
$query = new CGI;

print "<br>id=".$query->param("id");
print "<br>login=".$query->param("login");


Распечатает:

id=
login=tralala

Куда пропадает GET-параметр?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Nab
Дата 15.5.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Я когдато с таким тоже сталкивался.... Но насколько я помню, это не соответствует стандарту, метод должен быть один...
посему нужно использовать так:

Код

<form method="post" action="test.pl">
<input type="hidden" name="id" value="9" />
Login: <input name="login" value="tralala"/><br>
<input  type="submit" value="Send" />
</form>



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 15.5.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Полностью согласен, где-то как-раз уже обсуждали это, нашли RFC и доки...


--------------------
PM   Вверх
sergejzr
Дата 15.5.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Это конечно всё хорошо и верно, но у меня софт, котоый шесть лет так работал smile Что же мне теперь делать? smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Nab
Дата 15.5.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



1) не обновлять библиотеки
2) написать для библиотеки враппер
3) исправить все HTML
4) найти автора и заставить его переписать код на соответствие стандартам smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
arto
Дата 15.5.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



my $post = new CGI
my $get = new CGI ($ENV{'QUERY_STRING'})
PM MAIL ICQ   Вверх
Nab
Дата 16.5.2007, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Я же помню, что было решение попроще...
вот я искал кое-что для себя и наткнулся...
Цитата

MIXING POST AND URL PARAMETERS
   $color = $query->url_param('color');

It is possible for a script to receive CGI parameters in the URL as well as in the fill-out form by creating a form that POSTs to a URL containing a query string (a ``?'' mark followed by arguments). The param() method will always return the contents of the POSTed fill-out form, ignoring the URL's query string. To retrieve URL parameters, call the url_param() method. Use it in the same way as param(). The main difference is that it allows you to read the parameters, but not set them.

Under no circumstances will the contents of the URL query string interfere with similarly-named CGI parameters in POSTed forms. If you try to mix a URL query string with a form submitted with the GET method, the results will not be what you expect.


То есть получить доступ к обоим параметрам можно, другое дело что код изменить всеже прийдеться....
Ну или написать враппер, который бы просто делал микс из обоих функций...
но в CGI.pm достаточно много функций работающих с параметрами, и изменив поведение одной можем наломать еще больших дров... 
так что думайте...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Nab
Дата 17.5.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Не поверите, но буквально вчера пришлось решать ту же проблему...
Так как я пишу достаточно универсальній фраймворк, то доступ к нему может быть по разному сделан, и при реализации SOAP сервера, я столкнулся с тем, что SOAP сообщение всегда POST, а вот дополнительные параметры передаються как в заголовке так и в полном URL.

Поэтому мое решение было таким, в модуле инициализации при обнаружении заголовков text/xml и запроса POST я добавил приблизительно такой код:
Я его упростил для вашего случая...
То есть если запрос POST, то мы делаем микс из параметров модифицируя текущие параметры запроса.
Код

$q = CGI->new;
if ($q->request_method eq 'POST') {
    my $params = $q->Vars;
    foreach ($q->url_param) {
        # если такой параметр с таким именем уже существует, то мы его дописываем, или создаем новый.
        $params->($_) = (exists $params->{$_})?$params->{$_}."\0".$q->url_param($_):$q->url_param($_)
   }
}


Этот код лучше расположить в блоке BEGIN, чтобы гарантировать его своевременное выполнение... к сожалениею, если у вас скриптов много, то прийдеться это делать в каждом использующем CGI :(
У меня просто одна точка входа для всего проекта, поэтому как правило изменять приходиться только в одном месте smile


Это сообщение отредактировал(а) Nab - 17.5.2007, 21:43


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
sergejzr
Дата 17.5.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



всем спасибо!
arto, интересное решение!
Nab, у меня тоже одна точка, так что сработает!  smile 



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 31.5.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Ребята, помогите пожалуйста с дибаггингом...

В вышеописанном коде ругается на 6 строчку:
Not a subroutine reference
Код

$q = CGI->new;
if ($q->request_method eq 'POST') {
    my $params = $q->Vars;
    foreach ($q->url_param) {
        # если такой параметр с таким именем уже существует, то мы его дописываем, или создаем новый.
        $params->($_) = (exists $params->{$_})?$params->{$_}."\0".$q->url_param($_):$q->url_param($_)
   }
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
nitr
Дата 31.5.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Если я не ошибся, то
мне кажется ошибка тут $params->($_) , для чего такая конструкция? он "кричит", что это не ссылка на процедуру/функцию.


--------------------
PM   Вверх
Nab
Дата 31.5.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Ааааа, сорри, писал прям в форум... 
Конечно nitr, абсолютно прав, там нужны фигурные скобки...
Код

$q = CGI->new;
if ($q->request_method eq 'POST') {
    my $params = $q->Vars;
    foreach ($q->url_param) {
        $params->{$_} = (exists $params->{$_})?$params->{$_}."\0".$q->url_param($_):$q->url_param($_)
   }
}




--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.