나는 펄 스크립트에 초보자이며, 두 개의 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);
각각 당신이 나중에 사용하기 위해 변수에 저장해야합니다 참조를 반환합니다> 기능을 가져,하지만 다양한 가져 오기 방법이 있습니다 - 당신이 문서를 읽으면
사실,'fetch' 메소드가 있습니다. 'fetchrow_arrayref'의 별명입니다. – cjm
업데이트 정보, 문제가 아니라 해결책을 찾은 것 같아요. S – user2772936
해결책은 쉽게 찾을 수 있었으므로 바보입니다. 나는 데이터베이스의 마지막 ID보다 큰 ID를 요구했다. facepalm : 시간 낭비를해서 죄송합니다. – user2772936