2013-09-25 5 views
2

나는 펄 스크립트에 초보자이며, 두 개의 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) { 

코드를 디버그하고 튜토리얼을 찾고 많은 페이지를 읽고 문제가있는 곳을 파악할 수 없었습니다. (

감사합니다.

** * * UPDATE * ** * ****

내가 좀 더 디버그가 아닌 솔루션 후 문제가 발견 생각합니다. 두 번째 SQL 이름 $ 쿼리에 내가 첫 번째 SQL에서 얻을 변수 $ lastid을 통과, 참조 :

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

내가 예를 들어,에 대한 $의 lastid을 변경하면, 13,330,506은 모든 작동하므로 보인다 이 변수가 어떻게 전달되는지에 대한 문제가있을 수 있습니다. 이상한 것은 $ lastid의 내용 안에 $ lastid가있는 $ 쿼리를 인쇄 할 때 그 숫자가 정확하다는 것입니다. 적어도 저에게는 이상한 것이 있습니다.

@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); 

각각 당신이 나중에 사용하기 위해 변수에 저장해야합니다 참조를 반환합니다> 기능을 가져,하지만 다양한 가져 오기 방법이 있습니다 - 당신이 문서를 읽으면

답변

1

당신이 볼 수 http://search.cpan.org/dist/DBI/DBI.pm 은 더 없다 예를 들면 다음과 같습니다.

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

그런 다음 루프 내에서 @row 또는 $ data를 사용하여 필요한 데이터를 검색 할 수 있습니다.

+2

사실,'fetch' 메소드가 있습니다. 'fetchrow_arrayref'의 별명입니다. – cjm

+0

업데이트 정보, 문제가 아니라 해결책을 찾은 것 같아요. S – user2772936

+0

해결책은 쉽게 찾을 수 있었으므로 바보입니다. 나는 데이터베이스의 마지막 ID보다 큰 ID를 요구했다. facepalm : 시간 낭비를해서 죄송합니다. – user2772936

관련 문제