Автор Тема: Потеря переменной после отработки цикла while  (Прочитано 15123 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Доброго дня всем.
Сразу хочу сказать, что в перле я новичек). Делаю следующее:
sub all_traf
    {
        $sth = $dbh -> prepare("SELECT sum(fsize)/1024/1024 AS Summa FROM $table;");
        $sth -> execute();
        while (my $summa = $sth->fetchrow_array())
            {
            }
              $q->table({-border=>1,
                        -width=>300,
                        -align=>CENTER,
                        -bgcolor=>\'#666666\'},
                        $q->caption(\'Summa vsego trafica\'),
                        $q->Tr([$q->td({-width=>\'50%\'},[\'All trafic\',$summa])]));

        $sth->finish;
        $dbh->disconnect();
    }
и далее вызываю эту подпрограмму в теле осн. программы. В итоге отработки данного модуля я хочу получить таблицу из одной строки и двух ячеек
                All trafic     $summa
таблица выводится, а значение переменной $summa - нет. Вижу только пустую ячейку... Получается очень странное дело - переменная $summa видна только в теле цикла.
Помогите разобраться. :(

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Читайте об области видимости переменных. А пока сделайте так
sub all_traf
{
my $summa;
$sth = $dbh -> prepare("SELECT sum(fsize)/1024/1024 AS Summa FROM $table");
$sth -> execute();
while ($summa = $sth->fetchrow_array())
{
}
$q->table({-border=>1,
-width=>300,
-align=>CENTER,
-bgcolor=>\'#666666\'},
$q->caption(\'Summa vsego trafica\'),
$q->Tr([$q->td({-width=>\'50%\'},[\'All trafic\',$summa])]));

$sth->finish;
$dbh->disconnect();
}
« Последнее редактирование: 26 Мая 2004, 17:12:34 от vladsu »
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Уважаемый vladsu
последовал вашему совету - результат прежний. :( После выполнения цикла переменная $summa не видна.
Может быть возможно обойтись без цикла для задания скалярной переменной $summa значения полученного после отработки запроса? все равно запрос возвращает единственное значение....

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Я плохо знаю ДБАй, но можно попробовать написать

$summa = ( $sth->fetchrow_array )[0];
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
хм.. результат то тот же. в цикля я могу с переменной делать все что угодна, вне его - нет...

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Оказывается здесь цикл и не нужен. достаточно просто поставить условие

if ($summa = $sth->fetchrow_array())
{
печатаем таблицу
}

сенкс за ответы. :)

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Вы уверенны что Вы эту строку

$summa = ( $sth->fetchrow_array )[0];

написали в место

while ($summa = $sth->fetchrow_array())
{
}
?
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
vladsu
Он уверен.
После этого цикла сумма всегда будет 0.
while ($summa = $sth->fetchrow_array()[0])
{
}
2B OR NOT 2B = FF

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Chs
А можно поподробнее про ноль после цикла. Интуитивно я понимаю почему, но объяснить не могу...?

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
В условии цикла присваивание.
Соответственно пока условие истинно крутится цикл, а выход из него когда условие не выполняется, но значение-то все равно присваеевается переменной при проверке условия.
Так понятно?
2B OR NOT 2B = FF

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Цитировать
Chs:
Он уверен.
После этого цикла сумма всегда будет 0.
while ($summa = $sth->fetchrow_array()[0])
{
}

Вы что-то путаете, я не предлагал использовать цикл
я предложил использовать

sub all_traf {

    $sth = $dbh -> prepare("SELECT sum(fsize)/1024/1024 AS Summa FROM $table");
    $sth -> execute();

    my $summa = ($sth->fetchrow_array)[0];

    $q->table({-border=>1,
               -width=>300,
               -align=>CENTER,
               -bgcolor=>\'#666666\'},
    $q->caption(\'Summa vsego trafica\'),
    $q->Tr([$q->td({-width=>\'50%\'},[\'All trafic\',$summa])]));

    $sth->finish;
    $dbh->disconnect();
}
« Последнее редактирование: 26 Мая 2004, 17:12:15 от vladsu »
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Chs
Семен Семеныч..... Ну конечно.
биг сенкс :)
vladsu
Кстати с вашим вторым советом
my $summa = ($sth->fetchrow_array)[0];
не работает.
выдает что-то типа
$summa = Array(0x........)

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Цитировать
Вы что-то путаете, я не предлагал использовать цикл

http://forums.webscript.ru/showthread.php?s=&postid=109038#post109038
Да???:)
2B OR NOT 2B = FF

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
А мне показалось, что Ваш пост
Цитировать
Chs:
Он уверен.
После этого цикла сумма всегда будет 0.
while ($summa = $sth->fetchrow_array()[0])
{
}

был ответом на мой вопрос
Цитировать
vladsu:
Вы уверенны что Вы эту строку

$summa = ( $sth->fetchrow_array )[0];

написали в место

while ($summa = $sth->fetchrow_array())
{
}
?



Цитировать
koliama:
vladsu
Кстати с вашим вторым советом...

Странно, а у меня это

my $sth = $dbh -> prepare("SELECT sum($fild_name)/1024/1024 AS Summa FROM $table");
   $sth -> execute();

my $summa = ($sth->fetchrow_array)[0];

print $summa;

$sth->finish;
$dbh->disconnect();

работает, как надо.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн koliama

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 35
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
vladsu

?? а у меня нет....

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28