2014-09-16 7 views
3

그건 내 코드의 일부입니다. Gmail에서받은 메시지 ID를 사용하여 SELECT를 수행합니다. 데이터베이스에 base64 형식으로 저장되고 simbols가없는 "<>"Msg_id.DBD :: Pg :: st 실행 실패 : 오류 : "***"열이 없습니다.

my $inbox = $imap->select("Inbox") or die "Select error: ", $imap->LastError, "\n"; 
my @mails = ($imap->unseen); 
foreach my $msgid (@mails) { 
    my $m_id = $imap->parse_headers($msgid, "Message-id")->{"Message-id"}->[0] . "\n"; 
    $m_id =~ s/[<\>]//g; 
    $m_id = encode_base64($m_id); 
    $m_id =~ s/\r?$//; 
    my $q1 = "select id from mails.mails_in where user_id=$param[5] and message_id=$m_id and user_remote_id=$param[6]"; 
    $sth = $dbh->prepare($q1); 
    $rv = $sth->execute(); 
    my @array; 

    while (@array = $sth->fetchrow_array()) { 
     foreach my $i (@array) { 
      print "$i\t"; 
     } 
     print "\n"; 
    } 
} 

그러나이 오류가 발생합니다.

DBD::Pg::st execute failed: ERROR: column "zdjkot..." does not exist 
LINE 1: ...mails.mails_in where user_id=15206 and message_id=ZDJkOTQ1NT... 
                  ^at ./script.pl line 65. 

기존의 msg_id를 기반으로 사용하려고했는데 그 결과는 비슷합니다. 다른 SELECT의 작업이 올바르게 수행되었습니다. 비슷한 SELECT가 PHP에서 올바르게 작동합니다.

내가 사용 : 당신은 $m_id

my $q1 = "select id from mails.mails_in where user_id=$param[5] and message_id='$m_id' and user_remote_id=$param[6]"; 

에 대한 작은 따옴표를 놓치고 펄 v5.18.2, PostgreSQL의 v8.4.14

답변

6

을하지만 ? 자리 표시자를 사용하는 것이 더 낫다

my $q1 = "select id from mails.mails_in where user_id =? and message_id =? and user_remote_id =?"; 
$sth = $dbh->prepare($q1); 
$rv = $sth->execute($param[5], $m_id, $param[6]); 

따옴표, 매개 변수 이스케이프 및 걱정할 필요가 없으므로 SQL injection attacks입니다.

+0

작동합니다. 고마워요! – user3751471

+3

사실을 분명히 강조하겠습니다. 자리 표시자를 사용하는 것이 더 나은 것은 아니며, 유일한 올바른 방법입니다 !!! – salva

+0

조언 해 주셔서 감사합니다. – user3751471