Perl:Mysql (Ошибка при выполнении запроса перл к mysql)

Модератор: Модераторы разделов

Аватара пользователя
krz
Сообщения: 50

Perl:Mysql

Сообщение krz »

Доброго времени суток!!!
Perl должен складывать данные в mysql базу
вроде всё поставил все модули перлу (которые он просил). Но он никак не хочет отрабатывать - ругается на строке $sth->execute();
ошибка вот такая:
Can't call method "execute" on an undefined value at /home/user/insert_base.pl line 25

Код: Выделить всё

 #!/usr/bin/perl
use DBI;
my $dbh = DBI->connect ("DBI:mysql:BASEsql:192.168.0.12","mylogin","mypass") || die "Could not connect to database: ". DBI-> errstr;

$ip=$ARGV[0];
$input_traff=$ARGV[1];
$utc_time=$ARGV[3];
$ip_in=$ip.".real.DataTo";

my $sql_stmnt = "INSERT INTO logs SET rule_name='$ip_in', bytes='$input_traff', hostname='collect', that_time='utc_time';";

#my $sht = $dbh->prepare($sql_stmnt);
$sht = $dbh->prepare($sql_stmnt);
$sth->execute();
$sth->finish;
$dbh->disconnect;


два дня гуглился уже, но проблемму локализовать не получилось :(
help.......................
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Perl:Mysql

Сообщение madskull »

(krz @ Jun 22 2006, в 15:40) писал(а):$sht = $dbh->prepare($sql_stmnt);
$sth->execute();

переменные разные...
используй
#!/usr/bin/perl -w
и
use strict;
для отлова таких ситуаций
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
krz
Сообщения: 50

Re: Perl:Mysql

Сообщение krz »

переменные разные...
используй
#!/usr/bin/perl -w
и
use strict;
для отлова таких ситуаций


помогло отловить пару синтаксических ошибок и заставило обьявить
my ($ip, $utc_time, $input_traff, $ip_in, $sth,);
И снова
Can't call method "execute" on an undefined value at /home/user/insert_base.pl line
Объясните plz что значит разные переменные
Спасибо сказали:
iAm
Сообщения: 220
ОС: Gentoo

Re: Perl:Mysql

Сообщение iAm »

(krz @ Jun 23 2006, в 01:42) писал(а):Объясните plz что значит разные переменные


a = 2, b = 3 => a != b;

У Вас в данном случае вместо a - sht, вместо b - sth.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Perl:Mysql

Сообщение Crazy »

А зачем для вставки применять метод prepare?
обычно используют метод do

Desipere in loco
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Perl:Mysql

Сообщение madskull »

Crazy писал(а):
27.06.2006 17:27
А зачем для вставки применять метод prepare?
обычно используют метод do

Обычно используют то, что удобнее.
Вот пример из man DBI:

Код: Выделить всё

         $sth = $dbh->prepare("INSERT INTO table(foo,bar,baz) VALUES (?,?,?)");

         while(<CSV>) {
           chomp;
           my ($foo,$bar,$baz) = split /,/;
               $sth->execute( $foo, $bar, $baz );
         }
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Perl:Mysql

Сообщение Crazy »

prepare используется тогда, когда нужен возврат данных из БД.
В данном примере выполнение запроса INSERT вернет 0 или 1.
При этом prepare использует больше ресурсов и занемает больше времени чем do.

Строчки
$sht = $dbh->prepare($sql_stmnt);
$sth->execute();
$sth->finish;
заменяется на
$dbh->do($sql_stmnt) or die "невозможно выполнить запрос :$!\n";

Desipere in loco
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Perl:Mysql

Сообщение madskull »

если залезть в DBI.pm, то можно увидеть:

Код: Выделить всё

   sub do {
        my($dbh, $statement, $attr, @params) = @_;
        my $sth = $dbh->prepare($statement, $attr) or return undef;
        $sth->execute(@params) or return undef;
        my $rows = $sth->rows;
        ($rows == 0) ? "0E0" : $rows;
    }


что в лоб, что по лбу.
ArchLinux / IceWM
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: Perl:Mysql

Сообщение vadiml »

prepare используется тогда, когда нужен возврат данных из БД.
В данном примере выполнение запроса INSERT вернет 0 или 1.
При этом prepare использует больше ресурсов и занемает больше времени чем do.


неверно

при prepare разбор запроса производится только 1 раз, а дальше только подставляются цифры, а для do разбор запроса сервером делается на КАЖДОМ запросе.

поэтому для разового действия - лучше do, для внесения таблицы - prepare

ps я когда переносил таблицы по несколько тысяч записей из dbf в Oracle, получал разницу в быстродействии более чем на порядок (конвертор писал на перле для удобства преобразования данных, т.к. они довольно сильно структурно различались)
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали: