Выполнение двух запросов в одном скрипте perl

2

Я новичок в perl-скриптах, и я нашел проблему при попытке выполнить два sqls, здесь у вас есть код, наверняка не самый лучший.

use DBI;
use DBD::mysql;
use Socket;
use strict;
use warnings;

# CONFIG VARIABLES
my $platform = 'mysql';
my $database = 'database_name';
my $host = 'hostname';
my $port = '3306';
my $user ='user';
my $pw ='password';

# DATA SOURCE NAME
my $dsn = "dbi:mysql:$database:$host:3306";

# PERL DBI CONNECT
my $dbh = DBI->connect($dsn,$user,$pw,{RaiseError=>1,PrintError=>1}) or die "Could not connect to database: $DBI::errstr";

# READ THE LASTID OF THE DATABASE
my $queryID = "SELECT event.id from snorby.event order by event.id desc limit 1";
my $lastid = $dbh->selectrow_array($queryID);

#HIGH
while ( 1 == 1 )
{
my $query = "SELECT event.id, inet_ntoa(iphdr.ip_src) as 'src', tcp_sport, inet_ntoa(iphdr.ip_dst) as 'dst', tcp_dport, signature.sig_name, event.timestamp, unhex(data.data_payload) from snorby.event join snorby.signature on signature.sig_id = event.signature join snorby.iphdr on event.cid=iphdr.cid and event.sid=iphdr.sid join snorby.data on event.cid=data.cid and event.sid=data.sid join snorby.tcphdr on event.cid=tcphdr.cid and event.sid=tcphdr.sid where event.id > $lastid and signature.sig_priority = '1' order by event.id";

my $sth = $dbh->prepare($query);
$sth->execute() or die "SQL Error: $DBI::errstr\n";

# BIND TABLE COLUMNS TO VARIABLES
my($eventid,$src,$sport,$dst,$dport,$signature,$timestamp,$payload);
$sth->bind_columns(undef, \$eventid, \$src, \$sport, \$dst, \$dport, \$signature, \$timestamp, \$payload);

# LOOP THROUGH RESULTS  
while($sth->fetch) {

my $src_temp = inet_aton($src);
my $dst_temp = inet_aton($dst);

print "IT WORKS!";

}

Итак, если я прокомментирую эту часть кода

# READ THE LASTID OF THE DATABASE
my $queryID = "SELECT event.id from snorby.event order by event.id desc limit 1";
my $lastid = $dbh->selectrow_array($queryID);

Все работает нормально, но когда я пытаюсь выполнить сначала этот, скрипт перестает отвечать именно на эту строку:

while($sth->fetch) {

Я пытался отлаживать код, искать учебники, читать много страниц и не могу понять, где проблема :(

С уважением.

**** ОБНОВЛЕНИЕ ********

Я думаю, что я нашел проблему после некоторого отладки, но не решения. На втором sql с именем $ query я передал переменную $ lastid, которую я получил на первом sql, см.:

my $query = "SELECT stuff from table join things where event.id > **$lastid** and blablabla

Если я изменяю $ lastid, для примера, 13330506, все работает, поэтому, похоже, проблема в том, как эта переменная передается. Странно, что когда я печатаю $ query с $ lastid внутри содержимого $ lastid, это число появляется... странно, по крайней мере для меня.

Теги:

1 ответ

1
Лучший ответ

Если вы прочтете документацию http://search.cpan.org/dist/DBI/DBI.pm, вы увидите, что нет функции → fetch, но существуют различные методы выборки:

@row_ary  = $sth->fetchrow_array;
$ary_ref  = $sth->fetchrow_arrayref;
$hash_ref = $sth->fetchrow_hashref;

$ary_ref  = $sth->fetchall_arrayref;
$ary_ref  = $sth->fetchall_arrayref( $slice, $max_rows );

$hash_ref = $sth->fetchall_hashref( $key_field );

Каждый из них возвращает ссылку, которую вы должны сохранить в переменной для последующего использования, например:

while ( @row = $sth->fetchrow_array ) { ... }
while (my $data = $sth->fetchrow_hashref) { ... }

Затем вы можете использовать @row или $ data внутри цикла для получения необходимых данных.

  • 2
    На самом деле, есть метод fetch . Это псевдоним для fetchrow_arrayref .
  • 0
    Обновление информации, я думаю, что я нашел проблему, но не решение: S
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню