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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с массив, где грабли ? 
:(
    Опции темы
Twister
Дата 15.6.2005, 12:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Собсна,
есть некий массив @posts_arr

есть подпрограмма


Код

sub test {
my $mass = @_[0];
print @mass;
}



Вызываю

Код

test($posts_arr);



Ну и не пашет, где грабли ?
  Вверх
Vaneska
Дата 15.6.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Грабли скорее всего в огороде smile

Попробуй так:
Код

#!/usr/bin/perl -w

use strict;

sub test {    
my $mass = shift;    
print @$mass;    
}

my @posts_arr = (1, 2, 3, 4, 5, 6, 7 ,8);

test(\@posts_arr);

1;



Это сообщение отредактировал(а) Vaneska - 15.6.2005, 13:19
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
TwiSteR
Дата 15.6.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кибер красавчег
*


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

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



Vaneska

Аха сенкс, вроде работает

так а теперь как его перебрать ?

Т.е. в php я бы так перебрал

Код

foreach($tids as $mass)
    {
       $bla-bla = $$tids;
}


Пробую так, но получается все тот же массив
Код

foreach my $tid ($tids)
    {
              $bla-bla = $$tids;
}

--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 15.6.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуй!
Цитата

Код

   sub test {
         my $mass = @_[0];
         print @mass;
   }


Проблема в том, что ты пишешь на манер PHP. Просто запомни, в Perl массив всегда выглядит так: @arr, если обращаешься только к одному елементу массива, тогда так: $arr[1]=10;. Теперь посмоти на первую строку подпрогаммы test. В ней ты пытаешься присвоить скалярной переменной $mass срез массива, а не весь массив, потому как ты указал индекс, но ты его не получишь, потому как он у тебя в скалярном контексте. Так же прошу обратить внимание на то, что @mass и $mass, а абсолютно разные вещи, хотя они хранятся в одной и той же таблице имён.

Вобщем подправь свой код:
Код

sub test {
      my @mass = @_;
      print "@mass";
}

Вообще привыкай всегда пользоваться прагмой use strict.

Теперь о переборе массива:
Код

foreach my $tid ($tids)
{
              $bla-bla = $$tids;
}

Ты опять забыл, что Perl - это не PHP, ты пытаешься перебрать переменную, которая может содержать только одно значение. Для примера, подправим подпрограмму test, о которой говорили выше, для более понятного обращения к ней, назовём её sum и сделаем так, что бы она получала массив цифр, а возвращала результат их сложения.
Т.е. пишем так:
Код

sub sum {
      my @nums = @_;
      my $res = 0;
      # Перебор массива и прибавление каждого элемента массива к переменной $res.
      $res += $_ foreach ( @nums );
      return $res;
}

# теперь вызовим так нашу подпрограмму.
my $result = sum(2,3);
print $result;

Тебя может немного смутить эта сторока: $res += $_ foreach ( @nums );, на самом деле её можно было бы записать и в более длиной форме, например:
Код

foreach my $num ( @nums ) {
       $res += $num;
}

Просто второй вариант менее компактен ,потому я воспользовался не им. Но ты можешь писать так, как тебе больше нравится.

Удачи.

ЗЫ: Вообще-то я тебе просто показал как передавать массив в подпрограмму, но их всё же лучше передавать по ссылке, так как показал тебе Vaneska. Но до тех пор пока ты не разобрался с массивами, скалярами, хешами и подпрограммами, врядле ты поймёшь работу с ссылками. Хотя, может и поймёшь, но опять же, их нужно использовать там, где их нужно использовать. smile

Это сообщение отредактировал(а) korob2001 - 15.6.2005, 21:34


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


Кибер красавчег
*


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

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



korob2001

Огромное спасибо, за четкое разъяснение.

P.S> Зыж, ну что же поделать, привык я к пхп. Придется переучиваться smile
--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 15.6.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В Perl префиксы переменных выбраны не случайно, очень даже логично. Например:
Код

# Скаляр префикс $ выбран как первый символ слова $calar (scalar)
$var = 3;
# Массив префикс @ выбран как первый символ слова @rray (array)
@arr = (1, 2, 3, 4, 5);
# Хеш префикс % выбран как два кружочка, разделённых слешем %,
# кружочки означают ключь и значение, а слеш означает то, что
# они ассоциативны, т.е. связаны между собой.
%hash = ( 1 => 'one',
          2 => 'two',
          3 => 'three' ); 

В Perl массивы и хеши, могут содержать только список скаляров, но никак не список списков, потому при обращении к элементам массива или хеша, нужно использовать префикс скаляра, так как мы обращаемся к скаляру, т.е. выглядеть это будет примерно так:
Код

# Выводим в STDOUT 2-ой элемент массива, обращаемся к одному
# элементу массива, значит ставим префикс $
print "$arr[1]\n";

# Выводим весь массив в STDOUT, обращаемся ко всему массиву,
# значит ставим префикс @
print "@arr\n";

# Выводим в STDOUT 2 и 5 элементы массива, обращаемся к списку,
# т.е. делаем срез массива, значит пишем префикс @
print @arr[1, 4], "\n";

# Выводим в STDOUT 2 и 5 элементы массива, только на этот раз будем
# делать это поочереди, т.е. будем обращаться к скалярам,
# значит пишем префикс $
print "$arr[1] $arr[2]\n";

Думаю теперь тебе легче будет понять, как и когда в Perl нужно использовать тот или тной префикс.

ЗЫ: Главное не пытайся запомнить, пытайся понять, как думает Perl. Дерзай и всё получится. smile

Удачи.

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


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


Кибер красавчег
*


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

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



Цитата(korob2001 @ 15.6.2005, 21:59)
ЗЫ: Главное не пытайся запомнить, пытайся понять, как думает Perl. Дерзай и всё получится. smile

Да, спасибо ещё раз
--------------------
PM MAIL WWW ICQ   Вверх
TwiSteR
Дата 16.6.2005, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кибер красавчег
*


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

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



korob2001

Вопрос если можно.
Коректна ли будет такая запись подпрограммы и вернет ли она то что мне надо

Код

@posts_arr = collect_posts($sth);
sub collect_posts() {
    my $sth = $_[0];
    my @topics;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow())
            {
    $topics[$topic_id] = $topic_id;
        }
    return @topics;

}



и вот такая
Код

sub forum_recount() {
    my @fids = @_;
    $dbh = $_[0];
    my $sth;
    if ( !@fids ) {return};

    foreach my $fid (@fids)
    {
     print "$fid\n";


Это сообщение отредактировал(а) TwiSteR - 16.6.2005, 07:46
--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 16.6.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Первая не будет работать.
1. Вот это:
Код

$sth->fetchrow()

исправь на такую:
Код

$sth->fetchrow_array()


2. Возникнут трудности если в базе данных много значений, вот посмотри сам на эту строку:
Код

$topics[$topic_id] = $topic_id;

Зачем ты задаёшь индекс массива, такой же как и его значение??? Допустим ты выбрал из базы данных запись, где id=100000. В итоге присвоив только одно значение, такое:
Код

$topics[100000] = 100000;

Внимание!!!
В коде выше мы присвоили только одно значение, но Perl после такой бодяги выделил память для 100000 значений, другими словами, задав такой индекс, ты создал массив, который состоит из 100000 значений, хотя они все пустые, кроме последнего, но это не значит что они не отняли у тебя драгоценную память. Никогда не задавай индекс больше чем был предидущий. А так же, не понятно зачем хранить число 100000, в 100000 элементе. Данные повторяются, а это не есть гуд, опять же для памяти.

====================================
Вторая не доконца написана, но вот эта строка:
Код

$dbh = $_[0];

явно лишняя.

Вот здесь:
Код

sub forum_recount() {

убери круглые скобки, можешь конечно их оставить, но они не нужны в данном случае, только если ты работаешь с прототипами.

Удачи.

Это сообщение отредактировал(а) korob2001 - 16.6.2005, 12:10


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


Кибер красавчег
*


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

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



Аха значится
Код

$dbh = $_[0];

Необязателен, в пхп такие вещи объявляются как globals

Далее:
Код

#!/usr/bin/perl

use Mysql;
use Net::SMTP;

@posts_arr = ();
@forums_arr = ();
$dbh = Mysql->connect($sql_host,$sql_db,$sql_user,$sql_pass);


так вот в самом начале есть 2 массива @posts_arr = (); @forums_arr = (); они должны накапливать данные.
Правильно ли будет вот так в них загонять данные ?
Код

$sth = $dbh->query("SELECT ..........................");

@posts_arr += collect_posts($sth);
@forums_arr += collect_forums($sth);
sub collect_posts() {
    my $sth = $_[0];
    my @topics;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
           $topics[$n] = $topic_id;
           ++$n;
        }
        
    return @topics;

}
sub collect_forums() {
    my $sth = $_[0];
    my @forums;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
           $forums[$n] = $forum_id;
           ++$n;
        }
        return @forums;
    
}


Это сообщение отредактировал(а) TwiSteR - 16.6.2005, 13:14
--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 16.6.2005, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Аха значится
Код

$dbh = $_[0];

Необязателен, в пхп такие вещи объявляются как globals

Просто ты уже извлёк параметр вот зжесь:
Код

my @fids = @_;

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

Цитата

так вот в самом начале есть 2 массива @posts_arr = (); @forums_arr = (); они должны накапливать данные.
Правильно ли будет вот так в них загонять данные ?

нет, таким способом ты ничего не накопишь.

Ладно, давай сначала и по порядку. Ответь на эти вопросы:
Зачем ты подключаешь модули Masql и Net::SMTP ?
Чего ты хочешь добиться от программы?


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


Кибер красавчег
*


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

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



korob2001 Привет ещё раз

спасибо за поддержку

так вот

Вообще я переписываю скрипт с php на perl, только не спрашивай зачем smile : так надо smile

далее
Вот мой код
Код

#!/usr/bin/perl

use Mysql;
$sql_host = 'myhost';
$sql_user = 'user';
$sql_pass = '**pass**';
$sql_db = 'mydb';
@posts_arr = ();
@forums_arr = ();
$dbh = Mysql->connect($sql_host,$sql_db,$sql_user,$sql_pass);

$time = time();

$sth = $dbh->query("SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE queued=1 and post_date<".$time."-60*60*24*30");

@posts_arr = collect_posts($sth);
@forums_arr = collect_forums($sth);
clear_attaches($sth);


$dbh->query("DELETE FROM ibf_posts WHERE queued=1 and post_date<".$time."-60*60*24*30");

$sth = $dbh->query("SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE use_sig=1 and post_date<".$time."-60*60*24*7");

@posts_arr = collect_posts($sth);
@forums_arr = collect_forums($sth);
clear_attaches($sth);

$dbh->query("DELETE FROM ibf_posts WHERE use_sig=1 and post_date<".$time."-60*60*24*7");

$sth = $dbh->query("SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE delete_after != 0 and delete_after<".$time);

@posts_arr =+ collect_posts($sth);
@forums_arr =+ collect_forums($sth);
clear_attaches($sth);

$dbh->query("DELETE FROM ibf_posts WHERE delete_after != 0 and delete_after<".$time);

sub collect_posts() {
    my $sth = $_[0];
    my @topics;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
               $topics[$n] = $topic_id;
               ++$n;
            }

        return @topics;

}
sub collect_forums() {
    my $sth = $_[0];
    my @forums;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
               $forums[$n] = $forum_id;
               ++$n;
            }
        return @forums;

}

sub clear_attaches() {
    my $sth = $_[0];
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
    # delete attach
    if ( $attach_id and -e "/path".$attach_id )
        {
            unlink('/path'."/".$attach_id);
        }
    }

}


Мне нужно накопить эти два массива, один должен содержать id топиков, а второй id форумов
Так вот, потом эти два массива передать ещё двум функциям которые переберут их и выполнят некоторые манипуляции над таблицами.

P.S. Надеюсь понятно изложил свою проблему

--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 17.6.2005, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Юзай DBI.
Код

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

# Глобальные настройки
my $host = 'localhost';
my $base = 'mybase';
my $log = 'root';
my $pass = 'pass';

# Объявляем массивы, которые будем заполнять
my( @posts_arr, @forums_arr ) = ();

# Строим запрос
my $sql = "SELECT topic_id, forum_id FROM ibf_posts WHERE .....условие допиши сам";

# Подключаемся к базе данных
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
                             { RaiseError => 1, PrintError => 0 } );

# Подготавливаем запрос
my $sth = $dbh->prepare( $sql );

# Выполняем запрос
$sth->execute();

# Проходим по всей выборке, на каждой интерации бросам на стёк
# необходимые елементы
while ( $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
}

# Отключаемся от базы данных
$sth->finish();
$dbh->disconnect();

# Тута творим что-то с массивами, которые только что заполнили.

Если не секрет, что ты с ними будешь делать? Может их даже не стоит грузить в память, а делать то, что-то на каждой итерации цикла while???

Удачи.

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


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


Кибер красавчег
*


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

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



korob2001

Ну DBI модулем как пользоваться я знаю smile
Цитата(korob2001 @ 17.6.2005, 01:34)
Если не секрет, что ты с ними будешь делать?

Этот скрипт для форума, удаление постов на перемодерации,
Цитата(korob2001 @ 17.6.2005, 01:34)
Может их даже не стоит грузить в память, а делать то, что-то на каждой итерации цикла while???

Ты имеешь ввиду обойтись без вот этих подпрограмм ?
Код

sub collect_posts() {
    my $sth = $_[0];
    my @topics;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
               $topics[$n] = $topic_id;
               ++$n;
            }
        return @topics;
}
sub collect_forums() {
    my $sth = $_[0];
    my @forums;
    my $n = 0;
    while (my( $attach_id, $topic_id, $forum_id) = $sth->fetchrow_array())
            {
               $forums[$n] = $forum_id;
               ++$n;
            }
        return @forums;
}


и потом прокатит ли у меня так ? :
Код

#!/usr/bin/perl -w
use strict;
use DBI;
# Глобальные настройки
my $host = 'localhost';
my $base = 'mybase';
my $log = 'root';
my $pass = 'pass';
# Объявляем массивы, которые будем заполнять
my( @posts_arr, @forums_arr ) = ();
# Строим запрос
my $sql = "SELECT topic_id, forum_id FROM ibf_posts WHERE .....условие допиши сам";
# Подключаемся к базе данных
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
                             { RaiseError => 1, PrintError => 0 } );
# Подготавливаем запрос
my $sth = $dbh->prepare( $sql );
# Выполняем запрос
$sth->execute();
# Проходим по всей выборке, на каждой интерации бросам на стёк
# необходимые елементы
while ( $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
}
# Отключаемся от базы данных
$sth->finish();

#Второй загон данных в массив 
$sql = "SELECT topic_id, forum_id FROM ibf_posts WHERE .....условие допиши сам";

# Подготавливаем запрос
$sth = $dbh->prepare( $sql );
# Выполняем запрос
$sth->execute();
# Проходим по всей выборке, на каждой интерации бросам на стёк
# необходимые елементы
while ( $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
}
# Отключаемся от базы данных
$sth->finish();
$dbh->disconnect();

--------------------
PM MAIL WWW ICQ   Вверх
TwiSteR
Дата 17.6.2005, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кибер красавчег
*


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

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



korob2001

Посмотри плиз и выскажись вот по такому скрипту

Код

#!/usr/bin/perl

use DBI;
use strict;
my $sql_host = 'host';
my $sql_user = 'user';
my $sql_pass = 'pass';
my $sql_db = 'idb';
my (@posts_arr,@forums_arr) = ();
my $dbh = DBI->connect("DBI:mysql:host=$sql_host;database=$sql_db",$sql_user, $sql_pass);

my $time = time();

#****************************** DELETE queued posts ( 30 days ) *************************************

# querying data for topics and forums recount
my $sql = "SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE queued=1 and post_date<".$time."-60*60*24*30";
my $sth = $dbh->prepare($sql);
$sth->execute();
while ( my $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
           print $href->{ attach_id };
    if ( $href->{ attach_id } and -e "/path/".$href->{ attach_id } )
        {
            unlink('/path'."/".$href->{ attach_id });
        }
}

# delete queued posts
#$dbh->do("DELETE FROM ibf_posts WHERE queued=1 and post_date<".$time."-60*60*24*30");

# *************************** DELETE moderatorial posts ( 7 days ) ******************************

# querying data for topics and forums recount
$sql = "SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE use_sig=1 and post_date<".$time."-60*60*24*7";
$sth = $dbh->prepare($sql);
$sth->execute();
while ( my $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
           print $href->{ attach_id };
    if ( $href->{ attach_id } and -e "/path/".$href->{ attach_id } )
        {
            unlink('/path'."/".$href->{ attach_id });
        }
}


# delete moderatorial posts
#$dbh->do("DELETE FROM ibf_posts WHERE use_sig=1 and post_date<".$time."-60*60*24*7");

# ********************* DELETE delayed posts ( various days, depends from forums settings ) ***************

$sth = "SELECT attach_id, topic_id, forum_id FROM ibf_posts WHERE delete_after != 0 and delete_after<".$time;
$sth = $dbh->prepare($sql);
$sth->execute();
while ( my $href = $sth->fetchrow_hashref() ) {
           push( @posts_arr, $href->{  topic_id } );
           push( @forums_arr, $href->{ forum_id } );
           print $href->{ attach_id };
    if ( $href->{ attach_id } and -e "/path/".$href->{ attach_id } )
        {
            unlink('/path'."/".$href->{ attach_id });
        }
}

# delete delayed posts
#$dbh->do("DELETE FROM ibf_posts WHERE delete_after != 0 and delete_after<".$time);

# ************************** RECOUNT forums and topics after deleting posts ***********************

# update statistics
topic_recount(@posts_arr);
forum_recount(@forums_arr);
if (@forums_arr){
    stats_recount();
    undef(@posts_arr);
    undef(@forums_arr);
}                    
sub stats_recount {
 my $sth = $dbh->prepare("SELECT COUNT(tid) as tcount from ibf_topics WHERE approved=1");
 $sth->execute();
 my $topics = $sth->fetchrow();

 $sth = $dbh->prepare("SELECT COUNT(pid) as pcount from ibf_posts WHERE queued != 1");
 $sth->execute();
 my $posts  = $sth->fetchrow();

 my $posts_fin = $posts - $topics;
 print "$posts\t$topics\n";

# $dbh->query("UPDATE ibf_stats SET TOTAL_TOPICS=".$topics['tcount'].", TOTAL_REPLIES=".$posts_fin);
}

sub topic_recount {
     my @tids = @_;

if ( !@tids ) {return};
    foreach my $tid (@tids)
    {
        my $sth = $dbh->prepare("SELECT COUNT(pid) AS posts FROM ibf_posts WHERE topic_id='".$tid."' and queued != 1");
        $sth->execute();
        if ( my $posts = $sth->fetchrow() )
        {
            $posts = $posts - 1;

            $sth = $dbh->prepare("SELECT post_date, author_id, author_name FROM ibf_posts WHERE topic_id='".$tid."' and queued != 1 ORDER BY pid DESC LIMIT 1");
            $sth->execute();
            my @last_post = $sth->fetchrow_array();

        $dbh->do("UPDATE ibf_topics SET last_post='".$last_post[0]."',
                      last_poster_id='".$last_post[1]."',
                  last_poster_name='".$last_post[2]."',
                  posts='".$posts."' 
                  WHERE tid='".$tid."'");
        }
    }

}


sub forum_recount {
    my @fids = @_;
    if ( !@fids ) {return};

    foreach my $fid (@fids)
    {
#        // Get the topics..
        my $sth = $dbh->prepare("SELECT COUNT(tid) as count FROM ibf_topics WHERE approved=1 and forum_id='".$fid."'");
        $sth->execute();
        my $topics = $sth->fetchrow();

#        // Get the posts..
        $sth = $dbh->prepare("SELECT COUNT(pid) as count FROM ibf_posts WHERE queued != 1 and forum_id='".$fid."'");
        $sth->execute();
        my $posts = $sth->fetchrow();

#        // Get the forum last poster..
        $sth = $dbh->prepare("SELECT tid, title, last_poster_id, last_poster_name, last_post
                FROM ibf_topics WHERE approved=1 and forum_id='".$fid."' and club=0
                ORDER BY last_post DESC LIMIT 1");
        $sth->execute();          
        my @last_post = $sth->fetchrow_array();

#        // Get real post count by removing topic starting posts from the count
        my $real_posts = $posts - $topics;
        
#        // Reset this forums stats
        $dbh->do("UPDATE ibf_forums SET 
    last_poster_id = '".$last_post[2]."',
    last_poster_name = '". $last_post[3]."',
    last_post'        = '".$last_post[4]."',
    last_title'       = '".$last_post[1]."',
    last_id'          = '".$last_post[0]."',
    topics'           = '".$topics."',
    posts'            = '".$real_posts."'
    WHERE id='".$fid."'");
    }

}




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


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

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


 




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


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

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