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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод запроса клиенту и получение результата 
:(
    Опции темы
Lub
Дата 1.7.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, модуль CGI только начинаю осваивать, поэтому прошу сильно не пинать. Задача, как мне казалось, тривиальная, но вот решение найти не могу.
Суть:
При заполнении формы по submit запускается скрипт work.pl с параметрами из формы. Он работает и на определенном шаге нужно:
1. Тормознуть выполнение скрипта до получения данных от клиента (вот тут самая большая проблема для меня.)
Пока скрипт work.pl "тормозит":
    2. вывести клиенту форму 2 для заполнения 
    3. получить данные из этой формы
    4. передать эти данные скрипту work.pl  //вторая загвоздка
5. продолжить работу work
 smile 
И еще ссылочек, что почитать по данному вопросу.
PM MAIL   Вверх
tolkien
Дата 1.7.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да что там осваивать? функцию param? 

Найдите в интернете книгу PERL:CGI программирование и почитайте ее сначала.
PM MAIL   Вверх
Lub
Дата 1.7.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сорри, я не задаю вопросов, как считать в скрипт параметры формы или как вывести новую форму. 
Меня интересует, как прервать работу основного скрипта и вернуться к его выполнению РОВНО с той точки, на которой прервались, не выполняя его повторно. 
PM MAIL   Вверх
tolkien
Дата 1.7.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну и задачка. Тут где то уже задавали вопросы про модули Continue. Наверное это то что вам нужно.
PM MAIL   Вверх
ginnie
Дата 1.7.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 4
Всего: 49



Уважаемый Lub, протокол CGI не позволяет работать так, как Вам нужно. Вам необходимо изменить логику работы приложения в соответствии с идеологией CGI и HTTP.
Например, можно сделать так: в форму 2 вывести скрытыми данные, заполненные в форме 1. После отправки формы 2 обрабатывать все данные вместе.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 1.7.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 27





--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Lub
Дата 1.7.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я тут пытаюсь пробраться скозь fork(), exec и wait (waitpid)... Напрасно? 


PM MAIL   Вверх
Itsys
Дата 1.7.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



Цитата(Lub @  1.7.2008,  11:54 Найти цитируемый пост)
Я тут пытаюсь пробраться скозь fork(), exec и wait (waitpid)... Напрасно? 

Зачем городить огород ради простейшей вещи?

Ну примерно так:
script.pl
Код

....

if (!$params{action}){
   // выводим форму
   print <<"(END)";
   ...
   <form action="script.pl">
   <input type="hidden" name="action" value="1">
   ....
   </form>
   ...
(END)
}
else{
   //форма отправлена обрабатываем входные параметры
}


Это сообщение отредактировал(а) Itsys - 1.7.2008, 12:09
PM MAIL WWW Skype   Вверх
tolkien
Дата 1.7.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как fork и exec  могут помочь  сохранить скрит?

) то что fork делает копию процесса. Вовсе не означает что вы можете его сохранить в файл и после загрузить  с помощью exec. 

Lub
я угадал ход ваших мыслей? 
PM MAIL   Вверх
Lub
Дата 1.7.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



<form action="script.pl">
запускает скрипт с самого начала, что меня категорически не устраивает. Или я что-то пропустила?

Наверное, я не точно выразилась. При запуске из командной строки скрипт work.pl при наступлении определенного события выдает запрос пользователю, тривиальный: Изменить или оставить как есть? (yes-no). В зависимости от ответа две различные ветки.  Пытаюсь приделать веб-морду ;-) к этому монстру. Т.е. мне тупо нужно передать ввод пользователя при запросе в середине скрипта.

Это сообщение отредактировал(а) Lub - 1.7.2008, 13:03
PM MAIL   Вверх
ginnie
Дата 1.7.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 4
Всего: 49



Уважаемая Lub, чем Вас не устраивает использование ветвлений, предложенное Itsys? 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Lub
Дата 1.7.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(tolkien @  1.7.2008,  12:44 Найти цитируемый пост)
то что fork делает копию процесса. Вовсе не означает что вы можете его сохранить в файл и после загрузить  с помощью exec. 

Нет, сохронять процесс в файл мне в голову не пришло. При помощи exec  запустить сторонний скрипт на исполнение для вывода формы и получения параметра, после чего waitpid будет свидетельствовать о том, что скрипт (дочерний процесс) успешно отработал (завершен) , т.е. получен параметр, после чего продолжить работу основного скрипта.
P.S. "Я не волшебник, я только учусь..." ("Золушка")
PM MAIL   Вверх
Itsys
Дата 1.7.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



Lub, В CGI ветвеление идет на уровне алгоритма

т.к. весь процесс можно пердставить следущим образом:

1. Клиент (браузер) отсылает запрос серверу на получение определенной страницы (work.pl)
2. Скрипт определеяет, что во входных параметрах CGI отсутсвует параметр action, выполняет определенные действия и выводит форму для ввода данных, в которой есть скрытое поле (action)
3. Пользователь заполняет форму и нажимает кнопку отправить
4. Клиент (браузер) отсылает запрос серверу на получение определенной страницы (work.pl) с установленным параметром action=1
5. Скрипт определяет, что параметр action передан и переходит на выполнение  следующей последовательности операторов

и т.д.

опеределение ветви происходит в операторе if:
Код

if(!$action){
//последовательность операторов при первоначальной загрузке скрипта
}
elsif ($action == 1){
//последовательность операторов поле отправки первой формы
}
elsif ($action == 2){
//последовательность операторов поле отправки втрой формы
}
//и т.д.


PM MAIL WWW Skype   Вверх
nitr
Дата 1.7.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Lub, он имел ввиду как пример:
Код

<form action="script.pl,?action=1">
...
...
<form action="script.pl?action=2">
...
...


И в самом скрипте или как вас устроит, сделать обработку этого "параметра" action. Мы говорим, что вы подошли с какой-то для нас непонятной стороны к разработке smile
Достаточно прочесть книгу и! Разобрать все примеры! Тогда в голове сложится вся ситуация, весь алгоритм - это самый простой, как и ваша задача.

P.S.: Или всё же вы не полностью передали вашу проблему, тут недавно (пару топико назад) уже было такое. Человек понял, что если бы он сразу описал более подробнее проблему - то получил сразу ответ smile А так после наших намеков ;) и доп.вопросов.


--------------------
PM   Вверх
gcc
Дата 2.7.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

Репутация: 2
Всего: 17



Код

use CGI::Carp qw(fatalsToBrowser);
use DBI;
require "dev.pl";
use CGI;
use DBD::mysql;
use Math::Round qw(nearest);
use Image::Magick;

#use strict;
use warnings;
use CGI::Cookie;
use Storable;
use vars '$dbh', '%user_vars';
use POSIX;
use Digest::MD5 qw(md5_hex);
use Encode qw(encode_utf8);

if ($action=~/reg$/i){
reg3();
}


$pageone=param(pageone);

if $pageone{
regrel();
}


sub reg4 {
<form name="pageone" method="post" enctype="multipart/form-data">
  <div align="center"><center><table border="0" cellspacing="0" cellspacing=1>
    <tr>
      <td align="right">Логин:</td>
      <td colspan="2"><input type="hiden" name="logi0" size="15">(с 2 до 15 символов, латинские символы)</td>
    </tr>
    <tr>
      <td align="right">pass:</td>
      <td colspan="2"><input type="hiden" name="passs" size="15">(с 2 до 15 символов, латинские символы)</td>
    </tr>
    <tr>
      <td align="right">pass:</td>
      <td colspan="2"><input type="hiden" name="passs2" size="15">(с 2 до 15 символов, латинские символы)</td>
    </tr>
    <tr>
      <td align="right">имя:</td>
      <td colspan="2"><input type="hiden" name="login0" size="15">(с 2 до 15 символов, латинские символы)</td>
    </tr>
    <tr>
      <td align="right">pers:</td>
      <td colspan="2"><input name="photo" type="file">  </td>
<br>
    </tr>

      <td></td>
      <td align="center"><input type="submit" value="Добавить"></td>
      <td align="center"><input type="reset" value="Очистить"></td>
    </tr>
}


sub rerrel{


$photo=param(photo);

if ($photo) {


  # путь к директории для закачки директория
  # должна иметь право на запись для
  # пользователя, под которым работает веб-сервер
  $downpath = "/usr/local/www/q21/perl/photo/";

  #my $in=param('picture');

  # выделяем имя файла из параметра
    ($name)=$photo =~ m#([^\\/:]+)$#;

$a="jpg";

$file = $downpath.$avatar.$tv.".".$a;

  #$open(OUT,">$file") || die "$!";
  #binmode(OUT);
  # читаем входной поток и пишем в файл




#$file = $path_image.$tv[1].".".$tv[0];
  open (IMG, ">$file"); binmode IMG;  print IMG while (<$photo>); close (IMG); chmod 0644, $file;



#
#  my $ix="150";
#  my $iy="150";
#
#
#
#  $photo = Image::Magick->new;
#   $photo->Read("$file"); # $file - понятно что это только что загруженный файл
#
#
#
# my ($ox, $oy, $oc, $ic, $nx, $ny, $geo);
#   ($ox,$oy)=$photo->Get('columns','height');
#   if (($ox > $ix)||($oy > $iy)) {
#    $oc = $ox/$oy; $ic = $ix/$iy;
#    if ($oc < $ic) {$ny = $iy; $nx=int(($ox/$oy)*$iy);}
#    elsif ($oc > $ic) {$nx = $ix; $ny=int(($oy/$ox)*$ix);}
#    else {$nx = $ix; $ny = $iy;}}
#   else {$nx=$ox;$ny=$oy;}
#
# #Изменяем размер и сохраняем изображение:
#
#   $geo = 'geometry';
#   $photo->Resize(geometry=>$geo, width=>$nx, height=>$ny);
#   $file = $path_image."i".$tv[1].".".$tv[0];
#   $photo -> Write("$photo");

}


маленький пример, если есть из param значение то что мы передали pageone (name="pageone"), то то выводится функция rerrel


примерно так работало,
 но если файл передавать то нужно писать в форме в какой скрипт мы передает....

Это сообщение отредактировал(а) gcc - 2.7.2008, 11:52
PM WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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