Forum Webscript.Ru

Программирование => Perl => Тема начата: Skif от 12 Марта 2004, 13:58:19

Название: Ошибка при выполнении запроса к мусклу
Отправлено: Skif от 12 Марта 2004, 13:58:19
имеется следующая ситуация :
запрос вида

    $dbh = DBI->connect("DBI:mysql:host=freebsd;database=squid","$operator","$oper_pass")
               or die "cann\'t open DB $!";
    $sth = $dbh->prepare("SELECT sum(size)FROM $table_log WHERE ident=\'$role_user\'")
                or die "Cann\'t execute select from DB table $!";
    $sth->execute ();
    my $size;
    $size = $sth->fetchrow_array();
    $size = $size + 0;


Всплывает следующая ошибка при выполнении  $size = $size + 0; Точнее в предыдущей строке, но только при выполнении операции с переменнной она начинает плеваться.
Цитировать

Use of uninitialized value at /usr/local/script/traff_db/bin/lock.pl line 134.

В случае если в таблице отсутствуют записи для $role_user - тобишь результат NULL - в принципе не сильно раздражает, но все же - в логе потом черт ногу сломает
Как перехватить ошибку или почему она возникает и что можно сделать, чтобы ее не было?
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Chs от 12 Марта 2004, 14:12:47
if ($size = $sth->fetchrow_array())
{
    $size = $size + 0;
}
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Skif от 12 Марта 2004, 14:20:58
Спасибо, но ничего не изменилось

    $dbh = DBI->connect("DBI:mysql:host=freebsd;database=squid","$operator","$oper_pass")
               or die "cann\'t open DB $!";
    $sth = $dbh->prepare("SELECT sum(size)FROM $table_log WHERE ident=\'$role_user\'")
                or die "Cann\'t execute select from DB table $!";
    $sth->execute ();
    my $size;
#    $size = $sth->fetchrow_array();
#    $size = $size + 0;

    if ($size = $sth->fetchrow_array())
    {
        $size = $size + 0;
    }

    print "$size\\n";



только строка сместилась:
Цитировать

Use of uninitialized value at /usr/local/script/traff_db/bin/lock.pl line 141.
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Skif от 12 Марта 2004, 14:28:18
В принципе ошибка выскакивает как только над $size пытаешь провести какое-либо действие, например сравнение....
Название: Ошибка при выполнении запроса к мусклу
Отправлено: NeoNox от 12 Марта 2004, 14:50:31
Use of uninitialized value
           (W) An undefined value was used as if it were already defined.  It
           was interpreted as a "" or a 0, but maybe it was a mistake.  To
           suppress this warning assign an initial value to your variables.
Название: Ошибка при выполнении запроса к мусклу
Отправлено: NeoNox от 12 Марта 2004, 14:53:49
$sth->fetchrow_array() возвращяет список. ты уверен что тебе его в скаляр поместить нужно?
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Skif от 12 Марта 2004, 15:30:31
Ok, меняю

    my @size_1;
    @size_1 = $sth->fetchrow_array();
    while(@size_1){
    $size=shift @size_1;
    }

или

    $size=@size_1[0];
    if ($size < 1){
    $size=0;
    }
    $size = $size + 0;

Ошибка таже. В фишка в том, что ошибк а возникает, только в случае, если не встречается в таблице значение переменной
$role_user - тобишь если возвращается результат обработки запроса NULL:
пример имеется таблица:
Цитировать
mysql> show columns from squid_log_4
    -> ;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| time_stamp | varchar(32) |      | MUL |         |       |
| elaps      | varchar(8)  | YES  |     | NULL    |       |
| client_ip  | varchar(16) | YES  | MUL | NULL    |       |
| type_http  | varchar(24) | YES  |     | NULL    |       |
| size       | int(11)     | YES  | MUL | NULL    |       |
| method     | varchar(8)  | YES  |     | NULL    |       |
| url        | varchar(64) | YES  | MUL | NULL    |       |
| ident      | varchar(32) | YES  | MUL | NULL    |       |
| host_name  | varchar(32) | YES  | MUL | NULL    |       |
| mime       | varchar(16) | YES  |     | NULL    |       |
| chanel     | varchar(16) | YES  | MUL | NULL    |       |
+------------+-------------+------+-----+---------+-------+
11 rows in set (0.01 sec)

mysql>

по ней делается выборка:
Цитировать

mysql> select sum(size) from squid_log_4 where ident=\'svetlana\';
+-----------+
| sum(size) |
+-----------+
|  96839599 |
+-----------+
1 row in set (0.69 sec)


Но если записи пошльзователя нет:
Цитировать

mysql> select sum(size) from squid_log_4 where ident=\'boris\';
+-----------+
| sum(size) |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)


Так вот ошибка всплывает при выполнении именно последнего рода - тобишь результат подсчета - NULL.
Как мне его схватитть?
Название: Ошибка при выполнении запроса к мусклу
Отправлено: ondr от 12 Марта 2004, 15:48:46
Skif

if ( defined $var ) {
    print "Нам не(!) известно что в переменной, но известно, что она имеет определенное(!) значение";
} else {
    print "Переменная не определенна, а это значит работать нам не с чем, если все таки попытаемся, то получим вполне заслуженное предупреждение";
}

perldoc -f defined

ps: null в mysql это тоже что и undef в perl (при использовании DBI), т.е. ничего.
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Phoinix от 12 Марта 2004, 15:51:48
Skif

my $row = $sth -> rows;
if ($row > 0) {
# Результаты запроса - есть
}
else {
# Результатов запроса - нет
}
Название: Ошибка при выполнении запроса к мусклу
Отправлено: Skif от 12 Марта 2004, 15:55:16
Оно(тобишь define), огромное спасибо!
;)))