Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Ошибка CGI


Автор: kentochek 25.5.2007, 13:00
При запуске на хостинге своего скрипта, возникает такая ошибка

CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.
В чем может быть проблема, помогите плиз...

P.S. на локальной машине все нормально работает

Автор: nitr 25.5.2007, 14:27
kentochek, покажите кусок скрипта с передачей заголовка... или так сказать - начало самого скрипта smile

Автор: kentochek 25.5.2007, 14:35
Цитата(nitr @ 25.5.2007,  14:27)
kentochek, покажите кусок скрипта с передачей заголовка... или так сказать - начало самого скрипта smile

#! perl -wT

use strict;
use lib qw(.);
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser); 

$|=1;
my %Form;
my @pairs=split(/&/,$ENV{'QUERY_STRING'});
my @NewPairs;

foreach (@pairs){
    my($name,$value)=split(/=/,$_);
        push(@NewPairs,$name);
    push(@NewPairs,$value);
    $value=~tr/+/ /;
    $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    $Form{$name}=$value;
}

print "Content-type: text/html\n\n";
...
Далее пошли различные обработки...

Автор: Nab 25.5.2007, 15:00
kentochek, из какой древней книжки вы берете свои рецепты?

все что Вы тут привели, дублируется два раза...

Достаточно вот этого:

Код

#!perl -wT

use strict;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser); 

my $q = CGI->new;

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

вместо своих

$Form{Имя параметра}

теперь можно использовать

$q->param(Имя параметра)



Но даже с Вашим кодом не должно вызывать ошибку....

Приводите скрипт полностью...

Автор: kentochek 25.5.2007, 15:10
#! perl -wT

use strict;
use lib qw(.);
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser); 

#####Подключаем модули которые выводят разметку страницы
use Main;                #####выводим текст на главной странице
use MainPage_Top;    #####заголовок страницы и меню
use MainPage_Bottom; #####низ страницы и закрывающие теги


$|=1;
my %Form;
my @pairs=split(/&/,$ENV{'QUERY_STRING'});
my @NewPairs;

foreach (@pairs){
    my($name,$value)=split(/=/,$_);
        push(@NewPairs,$name);
    push(@NewPairs,$value);
    $value=~tr/+/ /;
    $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    $Form{$name}=$value;
}

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

if(($NewPairs[1] eq 'Main') or (!param()))
{
  MainPage_Top->Top; 
  Main->Main_Page;  
  MainPage_Bottom->Bottom;
  print qq(</tr></table></body></html>);
}

Тело модулей (к примеру Main.pm)

package Main;

use strict;
            
sub Main_Page{

print <<HTML;
      <tr>
      <td align="center"><font class=c_name_header>Text_0</font></td>
          </tr>
          <tr>
          <td height="100%" class="body_txt" style="padding-left:5">
          <font size=2 style="padding-left:35">Text_2<br><br></font>
      <font style="padding-left:35" size=2>Text_1<br></font>
          <br></td>
          </tr>
HTML
}
1;

В остальных модулях, вывод производится аналогично, т.е. там выводится разметка самой HTML страницы...

Автор: Nab 25.5.2007, 17:05
Аааааааа, понял наверно потому что на локальной машине у вас винда а заливаете наверно на нормальный линукс....

поставьте вместо ваших абсолютно некорректных '#! perl -wT'

нормальную строку 
Код

#!/usr/bin/perl

Первая строка файла и БЕЗ пробелов!!!!

А вообщеб разбирать ваш код не пожелаю никому... :( так уже давно не пишут...  smile 
хотя если вы учитесь то норм smile но не изобретайте велосипед все одно smile

Автор: kentochek 25.5.2007, 20:31
Цитата(Nab @ 25.5.2007,  17:05)
хотя если вы учитесь то норм smile 
так уже давно не пишут...  smile 

Да, учусь пока  smile 
А как щас принято писать?

Автор: Nab 26.5.2007, 00:28
Так заработало, или нет?


Цитата(kentochek @  25.5.2007,  20:31 Найти цитируемый пост)
А как щас принято писать?

ну тут вопрос сложный smile

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

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

Для начала я рекомендую поглядеть на HTML::Template, как простой, но в тоже время вполне достаточный для большинства задач. Хотя альтернатив предостаточно, это и более мощная, даже слишком как по мне, TemplateToolkit, и мало мне знакомый Petal, и еще несколько, да и свою написать не так сложно... Когда-то в бытнось мою чайником я тоже простенькую писал smile

Автор: nitr 26.5.2007, 00:33
Цитата(Nab @  26.5.2007,  00:28 Найти цитируемый пост)
Если вы генерите весь вывод скриптом, то можно заюзать соответствующие функции CGI.pm, или аналогичного...почитайте документацию по нему... была гдето даже на русском... поищите в прикрепленных топиках на форуме...

вроде даже тут доступно smile
http://forum.vingrad.ru/forum/topic-1167.html

Автор: djkostya 27.5.2007, 22:54
По ходу
А что означает 

Код

$|=1;


?????????????????

Автор: Nab 27.5.2007, 23:06
Код

$|=1;

Отключает буферизацию для текущего STDOUT....
То есть вывод строки, на экран к примеру, произойдет сразу после символа перевода строки, или окончания текста, а не после заполнения буфера терминала.... По моим наблюдениям около 4 килобайт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)