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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение количества записей на странице. 
:(
    Опции темы
Rezzonans
Дата 28.9.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ, такая проблема. Написал гостевушку, работает вроде бы нормально. Не знаю как ограничить количество сообщений на странице. smile То есть ввести в файл htm.cfg какую-нибудь переменную $max_rec с каким-нибудь значением. Как только колличество сообщений на странице превышает величину $max_rec, где-нибудь на страничке появляются ссылочки 1,2.. итд. Вот исходный код

файл gsscript.pl
Код

#!perl -w

use CGI::Carp qw(fatalsToBrowser);

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

print "<meta http-equiv='pragma' content='no-cache'>";

print "<meta http-equiv='cache-control' content='no-cache'>";

print "<meta http-equiv='Content-Type' content='text/html\; charset=windows-1251'>";

if ($ENV{'REQUEST_METHOD'} eq 'POST') {

    read(STDIN,$fd,$ENV{'CONTENT_LENGTH'});

    }

  else {

$fd = $ENV{'QUERY_STRING'};

}

$fd =~ s/%(..)/pack("C",hex($1))/eg;

$fd =~ tr/+/ /;

@pair = split(/&/,$fd);

foreach $pairs (@pair){

($name,$value) = split(/=/,$pairs);

$form_data{$name} = $value;

}

if($ip = $ENV{'HTTP_X_FORWARDED_FOR'}){

$pl = $ENV{'HTTP_X_FORWARDED_FOR'};

}else{

$ip = $ENV{'REMOTE_ADDR'};

}

 #


 require "htm.cfg";

 #

if($form_data{'el'}){

($s,$m,$h,$mday,$mon,$year) = localtime(time);

$year = $year+1900;

if($h < 10){

$h = "0"."$h";

}

if($mon < 10){

$mon = "0"."$mon";

}

$form_data{'el'} =~ s/</&lt;/g;

$form_data{'el'} =~ s/>/&gt;/g;

$form_data{'el'} =~ s/ /&nbsp;/g;

$form_data{'el'} =~ s/\n/<br>/g;

 if($form_data{'name'}eq ""){

  $form_data{'name'} = "Àíîíèì";

  }



   $stephan = "$form_data{'el'}:$ip:$form_data{'email'}:$form_data{'name'}:$h:$m:$mon:$year:$mday\n";

 open(DB,">>$base_url");

 print DB "$stephan";

 close(DB);

 require "htm.cfg";

 print "$style_spec";

   print <<PIZDEC;

 <font class = fontss>Через 3 секунды вас перебросит <a href = '$url_long'>обратно</a></font>

PIZDEC

     #

  print "$style_off";

 exit;

}

print "$style_on";

print "$middle";

open(BASE,"<$base_url");

@q = <BASE>;

close(BASE);
              $recs=0;
foreach $qw (@q){

 ($message,$ip_adr,$email,$name,$h,$m,$mon,$year,$mday) = split(/\:/,$qw);


   if($email eq ''){

    print <<OPOSING;

    <table width = 100%><tr><td bgcolor = $sh_top class = tabl>:: $name || $h\:$m \| $mday\/ $mon \/ $year ::</tr></td><tr><td bgcolor = $sh_down class = tabl>$message</font></table><br>

OPOSING

#

}else{

  print <<OPOSING;

    <table width = 100%><tr><td bgcolor = $sh_top class = tabl>:: <a href = 'mailto:$email'>$name</a> || $h\:$m \| $mon \/ $year ::</tr></td><tr><td bgcolor = $sh_down class = tabl>$message</font></table><br>

OPOSING

}

 }

 print "$style_off";

 # F I N I S H!



файл htm.cfg

Код

#####################################Настройки########################################
$bg_color = "CCCCFF";             #цвет фона страницы
$fon_color = "BBBBEE";            #цвет текстовых строк и поля сообщения
$titul = "Моя гостевая книшшка!"; #заголовок страницы
$strelka = "#000000";             #Цвет стрелок скроллбара
$scroll = "#848AA5";              #Цвет скроллбара
$shrift = "#000000";              #Цвет шрифта
$fonts = "Times New Roman";       #Стиль шрифта 
$font_size = "20px";              #Размер шрифта в пикселях
$border_color = "#000000";        #Цвет бордеров
$sh_top = "#AAAADD";              #Цвет верхней части таблицы
$sh_down = "#BBBBEE";             #Цвет нижней части таблицы
$url = "/cgi-bin/gsscript.pl";    #Относительный путь к гостевой
$base_url = "base.txt";           #Нахождение файла с сообщениями
$url_long = "http://localhost/cgi-bin/gsscript.pl"; #Полный путь к гостевой
######################################################################################



$style_on = qq~
<html>
    
<HEAD><TITLE>$titul</TITLE></head>

<style = text/css>
.cld{
background-color:$fon_color;font-family:$fonts;font-size:$font_size;BORDER-RIGHT: $border_color 1px solid;  BORDER-LEFT: $border_color 1px solid;BORDER-TOP: $border_color 1px solid; BORDER-BOTTOM: $border_color 1px solid;color:$shrift 
};

.main{
SCROLLBAR-ARROW-COLOR: $strelka; SCROLLBAR-BASE-COLOR: $scroll; topmargin: 0  
};

.fontss{
font-family:$fonts;font-size:$font_size;color:$shrift
}

.tabl{
BORDER-RIGHT: $border_color 1px solid;  BORDER-LEFT: $border_color 1px solid;BORDER-TOP: $border_color 1px solid; BORDER-BOTTOM: $border_color 1px solid;font-family:$fonts;font-size:$font_size;color:$shrift
}


</style>


<body bgcolor = '$bg_color' class = main>  
~;
#
$style_off = qq~
<hr><a href = 'mailto:rezzonans\@yandex.ru' class = 'fontss'>&copy Elf's Web Studio</a></body></html>
~;
#
$middle = qq~
<form action = '$url' method = 'POST'>
<table class = fontss><tr><td>Имя<td><td><input type = 'text' name = 'name' size = 20 class = cld></tr></td></td></td><tr><td>
E-mail<td><td><input type = 'text' name = 'email' size = 20 class = cld></tr></td></td></td></table>
<textarea COLS=70 ROWS=10  name = 'el' class = cld></textarea><br>
<input type = 'submit' value = 'Отправить'  class = cld>
</form>
<br><br>
~;
#


$style_spec = qq~
<html>

<HEAD><TITLE>$titul</TITLE></head>

<style = text/css>

.main{
SCROLLBAR-ARROW-COLOR: $strelka; SCROLLBAR-BASE-COLOR: $scroll; topmargin: 0  
};

.fontss{
font-family:$fonts;font-size:$font_size;color:$shrift
}

.tabl{
BORDER-RIGHT: $border_color 1px solid;  BORDER-LEFT: $border_color 1px solid;BORDER-TOP: $border_color 1px solid; BORDER-BOTTOM: $border_color 1px solid;font-family:$fonts;font-size:$font_size;color:$shrift
}


</style>

<body bgcolor = '$bg_color' onLoad = 'timer()' class = main>  


<script language = "JavaScript">
 <!--
 function timer() {
  setTimeout(\"parent.location.href = '$url'\", 3000);
}
     //--></script>

~;
#

--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 29.9.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Да млин smile , такое чувство, что ты специально код запутывал. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Guest
Дата 29.9.2005, 15:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Так что, идей ни каких? smile
  Вверх
Guest
Дата 29.9.2005, 15:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Покажите на каком-нибудь простом примере. Я разберусь там
  Вверх
korob2001
Дата 29.9.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



 Замечания по коду ( только не обижайся, это не для того, что бы тебя обидеть ):

1. Всегда используй прагму strict, я больше чем уверен, что там половина переменных вообще не нужны.

2. Пользуйся стандартным модулем CGI.pm, например для декодирования полей.

3. Почему нет проверки полей, например: регулярными выражениями?

4. Где ключь -T? Конечно он не обязателен, но желательно использовать его в каждой CGI программе. Что это за зверь, читай здесь:
http://forum.vingrad.ru/index.php?showtopic=44245

5. Не имей привычки читать файл в массив, рано или поздно ты убъёшь оперативную память.

Остальные замечания смотри в коментариях, их очень много.

Вот тебе твой же код, только немного в другом формате и с встроенной, простейшей разбивкой по страницам( всё прокоментировано ). Согласись, его теперь намного проще понять.  smile
Код

#!/usr/bin/perl -w
use CGI::Carp qw(fatalsToBrowser);

# Выводим заголовок, ВНИМАНИЕ МЕТА-ТЕГИ Я ПЕРЕНЁС В КОНФИГ,
# ТАК КАК ОНИ ДОЛЖНЫ БЫТЬ В ГОЛОВЕ ДОКУМЕНТА, ЛЮБОЙ HTML
# ДОКУМЕНТ ДОЛЖЕН НАЧИНАТЬСЯ С ТЕГА <html>, а не с <meta>
print "Content-type:text/html\n\n";


# Получаем и декодируем параметры
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN,$fd,$ENV{'CONTENT_LENGTH'});
} else {
    $fd = $ENV{'QUERY_STRING'};
}

$fd =~ s/%(..)/pack("C",hex($1))/eg;
$fd =~ tr/+/ /;
@pair = split(/&/,$fd);

foreach $pairs (@pair) {
        ($name,$value) = split(/=/,$pairs);
         $form_data{$name} = $value;
}

# Узнаём IP клиента, немного подправил
$ip = $ENV{ HTTP_X_FORWARDED_FOR } || $ENV{ REMOTE_ADDR };

# Подгружаем конфигурационный файл
require "htm.cfg";

#################################################
# Несколько переменных для разбивки на страницы #
#################################################
my $start_mess = $form_data{'ms'} || 1;
$start_mess = 1 unless $start_mess =~ /^[0-9]+$/;
my $stop_mess  = $start_mess + $mstopage;

# Если были получены параметры
if( $form_data{'el'} ) {
   # Получаем текущую дату и время
  ($s,$m,$h,$mday,$mon,$year) = localtime(time);
   $year = $year+1900;
   $h = "0"."$h" if $h < 10;
   $mon = "0"."$mon" if ($mon < 10);

   # Обрабатываем параметры
   $form_data{'el'} =~ s/</&lt;/g;
   $form_data{'el'} =~ s/>/&gt;/g;
   $form_data{'el'} =~ s/ /&nbsp;/g;
   $form_data{'el'} =~ s/\n/<br>/g;

   # Если имя не указано, то устанавливаем значение по умолчанию
   $form_data{'name'} = "Аноним" if( $form_data{'name'} eq "" );

   # Формируем строку для записи в файл
   $stephan = "$form_data{'el'}:$ip:$form_data{'email'}:$form_data{'name'}:$h:$m:$mon:$year:$mday\n";

   # Открываем файл для записи или умираем с музыкой
   open(DB,">>$base_url") or die "Can't open base file: $!\n";
       print DB "$stephan";
   close(DB);

   # Подгружаем конфигурационный файл, правда не понятно, зачем?
   # Ведь мы его уже подгузили ранее. Пока закоментировал, а там
   # видно будет.
   # require "htm.cfg";

   print $style_spec;
   print qq(
         <font class='fontss'>
            Через 3 секунды вас перебросит <a href='$url_long'>обратно</a>
         </font>
   );
   print $style_off;
   exit 0; # Успешно завершаем выполнение программы
}

print "$style_on";
print "$middle";

# Открываем файл для чтения и вывода сообщений, НО ТОЛЬКО ТОГДА, КОГДА
# ОН СУЩЕСТВУЕТ, ИНАЧЕ ПОЛУЧИМ ОШИБКУ.
if ( -e $base_url ) {
     open(BASE,"<$base_url") or die "Can't open dase file: $!\n";  # Открываем или умираем
        @q = <BASE>;
     close(BASE);
}

$recs=0;

# Циклически выводим все сообщения. Добавил reverse, так как это более логично,
# если более новые сообщения будут вверху.

#################################################
# Некоторые переменные для разбивки на страницы #
#################################################
my @pages = ();
my $pag_count = 0;
my $cnt_pg = 1;
my $count  = 0;
my $mess_count = 0;

foreach $qw (reverse @q){
        #####################################################
        # Разбиваем на страницы                             #
        #####################################################
        ++$mess_count;
        ++$count;

        if ( $count == $start_mess ) {
             $pag_count++;
             push( @pages, "<b>$pag_count</b>" );
             $cnt_pg += $mstopage;
             $mess_count = 0;
        } elsif ( $mess_count == $mstopage ) {
             $pag_count++;
             push(@pages, "<a href='$ENV{SCRIPT_NAME}?ms=$cnt_pg'>$pag_count</a>");
             $cnt_pg += $mstopage;
             $mess_count = 0;
        }

        next if ( ( $count < $start_mess ) || ( $count >= $stop_mess ) );





        my($message,$ip_adr,$email,$name,$h,$m,$mon,$year,$mday) = split(/\:/,$qw);
        if( $email eq '' ) {
            print qq(
                  <table width='100%' border='1'>
                    <tr><td bgcolor = $sh_top class = tabl>
                      :: $name || $h\:$m \| $mday\/ $mon \/ $year ::
                    </tr></td>
                    <tr><td bgcolor = $sh_down class=tabl>
                      <font>$message</font>
                    </td></tr>
                  </table><br>
             ); # Здесь были добавлены теги </td></tr>
        }else{
            print qq(
                  <table width = 100%>
                    <tr><td bgcolor = $sh_top class = tabl>::
                       <a href = 'mailto:$email'>$name</a>
                          || $h\:$m \| $mon \/ $year ::
                    </tr></td>
                    <tr><td bgcolor = $sh_down class = tabl>
                        <font>$message</font>
                    </td></tr></table><br>
             ); # Здесь были добавлены теги </td></tr>

        }
}

#####################################
# Выводим ссылки, на страницы       #
#####################################
print join(" | ", @pages);

# Нижняя часть страницы
print "$style_off";


Конфигурационный файл, в нём тоже было много ошибок. Так же читай кометрарии.
Код

#####################################Настройки########################################
$bg_color     = "CCCCFF";                # цвет фона страницы
$fon_color    = "BBBBEE";                # цвет текстовых строк и поля сообщения
$titul        = "Моя гостевая книшшка!"; # заголовок страницы
$strelka      = "#000000";               # Цвет стрелок скроллбара
$scroll       = "#848AA5";               # Цвет скроллбара
$shrift       = "#000000";               # Цвет шрифта
$fonts        = "Times New Roman";       # Стиль шрифта
$font_size    = "20px";                  # Размер шрифта в пикселях
$border_color = "#000000";               # Цвет бордеров
$sh_top       = "#AAAADD";               # Цвет верхней части таблицы
$sh_down      = "#BBBBEE";               # Цвет нижней части таблицы
$url          = $ENV{SCRIPT_NAME};       # Относительный путь к гостевой
$base_url     = "base.txt";              # Нахождение файла с сообщениями
$url_long     = "http://localhost/cgi-bin/guest.pl"; #Полный путь к гостевой
$mstopage     = 5;                       # Кол-во сообщений на страницу

################################################################################
# Выводим начало страницы и стили CSS (здесь нужно определиться в              #
# каком регистре ты пишешь HTML тэги и стили, а то получается каша. Подправил. #
################################################################################
$style_on = qq~
<html>
  <head>
    <!--// Стили пишем в заголовок //-->
    <style type="text/css">

       .cld {
              background-color:      $fon_color;
              font-family:           $fonts;
              font-size:             $font_size;
              border-right:          $border_color 1px solid;
              border-left:           $border_color 1px solid;
              border-top:            $border_color 1px solid;
              border-bottom:         $border_color 1px solid;
              color:                 $shrift
       };

       .main {
              scrollbar-arrow-color: $strelka;
              scrollbar-base-color:  $scroll;
              topmargin:             0
       };

       .fontss {
              font-family:           $fonts;
              font-size:             $font_size;
              color:                 $shrift
       }

       .tabl{
              border-right:          $border_color 1px solid;
              border-left:           $border_color 1px solid;
              border-top:            $border_color 1px solid;
              border-bottom:         $border_color 1px solid;
              font-family:           $fonts;
              font-size:             $font_size;
              color:                 $shrift
       }
    </style>
    <title>$titul</title>
    <meta http-equiv='pragma' content='no-cache'>
    <meta http-equiv='cache-control' content='no-cache'>
    <meta http-equiv='Content-Type' content='text/html\; charset=windows-1251'>
  </head>
  <body bgcolor = '$bg_color' class='main'>
~;


##########################
#  Нижняя часть страницы #
##########################
$style_off = qq~
    <hr><a href = 'mailto:rezzonans\@yandex.ru' class='fontss'>&copy Elf's Web Studio</a>
  </body>
 </html>
~;

################################################################################
# Форма. Вот здесь action абсолютно не нужет, если он не указан, параметры     #
# получает тот же скрит, что и отправляет их, как раз то, что нам нужно.       #
################################################################################
$middle = qq~
   <form method='POST'>
     <table class='fontss' border='0'>
       <tr>
         <!--// В следующей строке было 2 открывающих тега <td>, подправил //-->
         <td>Имя</td>
         <!--// Вследующей строке сначала закрывается тег </td> //-->
         <td><input type='text' name='name' size='20' class='cld'></td>
       </tr>
         <!--// Объясни, для чего нужны следующие теги? Если не знаешь, удали
            </td></td></td>
         //-->
       <tr>
         <!--// В следующей строке было 2 открывающих тега <td>, подправил //-->
         <td>E-mail</td>
         <!--// Вследующей строке сначала закрывается тег </td> //-->
         <td><input type='text' name='email' size='20' class='cld'></td>
       </tr>
         <!--// Объясни, для чего нужны следующие теги? Если не знаешь, удали
            </td></td></td>
         //-->
     </table>
     <!--// Почему textarea расположен вне таблицы? //-->
     <textarea COLS='70' ROWS='10'  name='el' class='cld'></textarea><br>
     <input type='submit' value='Отправить'  class='cld'>
   </form>
   <br><br>
~;

################################################################################
# Верхняя часть страницы со стилями, которые предназначены для формирования    #
# страницы, после успешного добавления сообщения в гостевую книгу.             #
################################################################################
$style_spec = qq~
 <html>
  <!--//
      Опять же определись с регистром тегов и стилей, а так же пиши
      стили CSS и сценарии JavaScript в голову документа, для большего
      понимания, представь себе, что это мозг документа, он должен быть
      в голове. Это обеспечит загрузку стилей и сценариев в раньше
      самого документа.
  //-->
  <head>
   <style type='text/css'>
       .main {
           scrollbar-arrow-color: $strelka;
           scrollbar-base-color:  $scroll;
           topmargin:             0;
       }

       .fontss {
           font-family:           $fonts;
           font-size:             $font_size;
           color:                 $shrift;
       }

       .tabl {
           border-right:          $border_color 1px solid;
           border-left:           $border_color 1px solid;
           border-top:            $border_color 1px solid;
           border-bottom:         $border_color 1px solid;
           font-family:           $fonts;
           font-size:             $font_size;
           color:                 $shrift;
       }
   </style>
   <title>$titul</title>
   <meta http-equiv='pragma' content='no-cache'>
   <meta http-equiv='cache-control' content='no-cache'>
   <meta http-equiv='Content-Type' content='text/html\; charset=windows-1251'>
   <!--// Cценарии JavaScript так же пишем в голову документа //-->
   <script language="JavaScript" defer type="text/javascript">
    <!--//
      function timer() {
         setTimeout("parent.location.href='$url'", 3000);
      }
    //-->
   </script>
  </head>
  <body bgcolor='$bg_color' onLoad='timer()' class='main'>
~;

Только твой код очень опасен, просто находка для санитаров леса. ;))))
Ладно разберайся. Если будет что-то не понятно, пиши. 

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 13:17


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rezzonans
Дата 29.9.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо большое, ща посмотрю smile ! Вопрос такой, use strict - это что за фигня? я так понимаю он какие-то ограничения накладывает, только вот вопрос какие? Проверку полей я ещё сделать не успел, скорее всего сделаю её на javascript. Просто модуль CGI я не очень люблю. Почему-то с ним у меня никогда не получается хороших прог.

PS И ещё вопрос, чем это я оперативу убью? Массивом с сообщениямиsmile)))))))?
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 30.9.2005, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Вопрос такой, use strict - это что за фигня?

strict - это прагма компилятора, если она указывается, то Perl ужесточается, например:
Запрещается использование не объявленных переменных, так же подпрограмм и использование символических ссылок. Но так как подпрограмм у тебя нет и ссылок тоже, то тебя должна интересовать только такая форма записи:
Код

#!/usr/bin/perl
use strict 'refs';

Попробуй вписать её и ты будешь сильно удивлён насколько много у тебя ошибок. ;)))))
Цитата

Проверку полей я ещё сделать не успел, скорее всего сделаю её на javascript.

А вот проверку делать на JavaScript я тебе не советую. Почему? Читай следующюю тему, я уже устал повторять одно и то же. ;))))
http://forum.vingrad.ru/index.php?showtopic=65199&st=15
Цитата

Просто модуль CGI я не очень люблю. Почему-то с ним у меня никогда не получается хороших прог.

Ну это дело времени, не отчаивайся и покоряй и тогда поймёшь все его прелести, это совсем другой стиль программирования на Perl. Пример можешь посмотреть здесь (кстати, я там приводил, рабочий, пример гостевой книги на чистом CGI, можешь попробовать его запустить, может понравится ( All rights fucked up - пользуйся на здоровье ;))) ):
http://forum.vingrad.ru/index.php?showtopic=43044
Цитата

PS И ещё вопрос, чем это я оперативу убью? Массивом с сообщениями.

Угу, ты ведь фактически помещаешь весь файл в оперативную память. Представь как будет не хорошо когда твой файл будет очень сильно заполнен + твой сайт очень популярный и твою гостевуху часто посещают твои товарисчи, которых очень много. Вот тут и приходит на помощь построчное чтение файла, без использования каких либо массивов. Потому лучше сразу сделать чтение таким и никогда не загонишь в тупик опертивную память, каким бы огромным не был бы твой файл.

Это сообщение отредактировал(а) korob2001 - 30.9.2005, 02:36


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Guest
Дата 30.9.2005, 12:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Короб, мужик, ты меня выручаешь в который раз! smile Спасибо! Один вопрос остался: когда гостевушку запускаешь, если вводить сообщение без нажатия enter, то таблица приобретает неимоверную ширину, я так понимаю это из-за символов &nbsp. Как от этого избавиться? Когда-то я уже с этой проблемой сталкивался, и тогда решил её шерез css. Но получилось не красиво - ширина таблицы становилась строго фиксированной, и слова при этом разрывались и на половине переносились на другую строку. Короче фигня полная, но в принципе можно работать. Правда фиг его знает с каким браузером столкнёшься, об этом тоже подумать стоит. Так вот всётаки интересно, как эту проблему через perl решить?
  Вверх
korob2001
Дата 30.9.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Добавь просто ещё одно регулярное выражение, перед тем, которое меняет в твоём коде, все пробелы на &nbsp;
Вот посмотри пример и читай коментарии:
Код

#!/usr/bin/perl -w
use strict;

# Там где стоят единицы, это пробелы
###########111###########1##11######111111111111111##############1######1111##
my $str = "   Hi!!!\nThis is  a test               message.\nBye, bye...    ";
my $max_space = 3;  # Максимально допустимое число пробелов (подряд)

# Ну это ты знаешь, потому повторяться не буду
$str =~ s/</&lt;/g;
$str =~ s/>/&gt;/g;
$str =~ s/\n/<br>/g;

# Удаляем все пробелы вначале строки
$str =~ s/^\s+//;

# Удаляем все пробелы в конце строки
$str =~ s/\s+$//;

# Если встретим кол-во пробелов от $max_space и больше, меняем их все на три &nbsp; , но не более того
$str =~ s/\s{$max_space,}/"&nbsp;" x $max_space/ego;

# Если же есть пробелы от 1 до 2 включительно, то каждый из них меняем на
# то же число &nbsp;
$str =~ s/\s+/&nbsp;/g;

Заметь что там где было 2 пробела, так и вставилось 2 &nbsp;, там где был один пробел вставился 1 &nbsp;, а там где было 3 и более пробелов, они заменились только на 3 &nbsp;, если нужно сделать больше, то просто увеличь значение переменной $max_space.
Вообще не понятно, зачем ты меняешь пробелы на &nbsp;????
По нормальному нужно было бы обработать пробелы так:
Код

for ( $str ) {
   s/^\s+//;
   s/\s+$//;
   s/\s+/ /g;
}

Т.е. последним выражением, мы просто заменяем любое кол-во пробелов на 1 пробел, что вполне логично для текста в гостевой книге. Ну ладно, не буду тебя нагружать, сам решай как жить дальше.

Это сообщение отредактировал(а) korob2001 - 30.9.2005, 13:05


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rezzonans
Дата 1.10.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Короб, привет, спасибо за материал, почти всё усвоил smile. Ещё один вопрос. Если данная гостевушка будет подвергаться "массированным" атакам со стороны недображелателей. К примеру я засодил туда листов 40 текста - в результате получил полную кашу... Так вот, как думаешь, если ввести ещё одну переменную, к примеру $max_size, которая будет соответствовать длине сообщения. Пусть $max_size = 3000, т.е 3000 сиволов. Если не ошибаюсь, то в перле есть такая функция - length, которая считает колличество символов в сообщении, т.е:

Код


if(length($form_data{'el'} > $max_size){

#каким-то образом обрезать сообщение

}



Не подскажешь, каким образом? $form_data{'el'} =~ s/\s{$max_size}//g; пробовал вот так - не подходит. И кстати, вот ещё что, тока заметил, ты не знаешь символ двоеточия? Ну в смысле как бы специальный сивол типа &lt или &nbsp? Иначе, если они проходят в теле сообщения.. - во дурдом! Вот походу почему каша получалась smile smile smile

Это сообщение отредактировал(а) Rezzonans - 1.10.2005, 16:28
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 1.10.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Не понял, ты хочешь обрезать стороку или просто выдать юзеру сообщение о том, что нельзя вводить сообщение больше $max_size?????
Если первое, то можно и не делать проверки с условным операторо if, просто обрезай стороку и загоняй её в файл:
Код

#!/usr/bin/perl
use strict;

# Максимальное кол-во символов
my $max_size = 17;


my $str = "This is a message long";
$str = substr($str, 0, $max_size);

print $str;

Если же нужно выдать клиенту сообщение о том, что нельзя отправлять сообщение больше $max_size символов, тогда нужна проверка, как ты и показал:
Код

if (length( $str ) > $max_size ) {
     # Выдаём клиенту сообщение об ошибке
} else {
     # Записываем сообщение в базу или в файл
}


Это сообщение отредактировал(а) korob2001 - 1.10.2005, 17:58


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rezzonans
Дата 1.10.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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


 




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


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

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