Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 - в принципе не сильно раздражает, но все же - в логе потом черт ногу сломает
Как перехватить ошибку или почему она возникает и что можно сделать, чтобы ее не было?
-
if ($size = $sth->fetchrow_array())
{
$size = $size + 0;
}
-
Спасибо, но ничего не изменилось
$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.
-
В принципе ошибка выскакивает как только над $size пытаешь провести какое-либо действие, например сравнение....
-
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.
-
$sth->fetchrow_array() возвращяет список. ты уверен что тебе его в скаляр поместить нужно?
-
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.
Как мне его схватитть?
-
Skif
if ( defined $var ) {
print "Нам не(!) известно что в переменной, но известно, что она имеет определенное(!) значение";
} else {
print "Переменная не определенна, а это значит работать нам не с чем, если все таки попытаемся, то получим вполне заслуженное предупреждение";
}
perldoc -f defined
ps: null в mysql это тоже что и undef в perl (при использовании DBI), т.е. ничего.
-
Skif
my $row = $sth -> rows;
if ($row > 0) {
# Результаты запроса - есть
}
else {
# Результатов запроса - нет
}
-
Оно(тобишь define), огромное спасибо!
;)))