2017-01-01 1 views
2

# 나는 배열에 출력을 저장하고 있고 배열은 다음과 같다 : - 스칼라 변수를 DB (sqlite3)에 저장하는 데 문제가 있습니까?

60=20130624-09:45:02.046|21=1|38=565|52=20130624-09:45:02.046|35=D|10=085|40=1|9=205|100=MBTX|49=11342|553=2453|34=388|1=30532|43=Y|55=4323|54=1|56=MBT|11=584|59=0|114=Y|8=FIX.4.4| 

#

을 그리고 난 같은 스칼라 변수에이 배열을 변환 : -

$ SCAL = 가입 ('', @arr);

# 그리고는 지금은 DB에이를 저장하는 것을 시도하고있다 : - 당신은 당신의 배열을 표시

my $st = qq(INSERT INTO demo (fix) 
     VALUES ($scal)); 
my $r = $dbh->do($st) or die $DBI::errstr; 

#And my table schema is:- 

CREATE TABLE demo (fix varchar); 

And I keep getting errors :- DBD::SQLite::db do failed: near ":45": syntax error at pdb.pl line 92, <STDIN> line 1. 
DBD::SQLite::db do failed: near ":45": syntax error at pdb.pl line 92, <STDIN> line 1. 

Any help will be appreicated 
+1

를 사용하여 주위에'$의 scal' 틱 : ? 더 당신은 당신이 do()에 제공해야합니다, 더 많은 매개 변수를 사용)는 매개 변수가있는 쿼리 (물음표가있는 쿼리)를 사용합니다. – PerlDuck

+0

그것은 일했다.. 감사합니다!! – Sonal

+1

그건 끔찍한 조언이야, @PerlDuck! – ikegami

답변

3

방법이 조금 이상한 것입니다. 보통

my @arr = ('60=20130624-09:45:02.046', 
      '21=1', 
      '38=565', 
      ...); 

으로 작성하거나 실제 내용이 무엇이든간에 작성하십시오. 하지만 어쨌든 문자열 $scal으로 플랫 화하기 때문에 여기에는 문제가 없습니다.

my $st = qq(INSERT INTO demo (fix) VALUES ('$scal')); 
my $r = $dbh->do($st) or die $DBI::errstr; 

하지만 SQL 주입 (http://imgs.xkcd.com/comics/exploits_of_a_mom.png)에 취약하기 때문에이 나쁜 : 당신의 DB에이 문자열을 삽입 할

한 가지 방법은 주위 틱 (')를 넣어하는 것입니다. 문자열이 foo'); delete from demo; -- 인 경우를 생각해보십시오. 최종 결과는

INSERT INTO demo (fix) VALUES ('foo'); delete from demo; --') 

이 나쁜 이유 두 번째 이유가 될 것입니다 :

INSERT INTO demo (fix) VALUES ('foo's bar'); 

결론 : 그것의 틱 ($scal="foo's bar")를 포함하고도 엉망 결과 INSERT 문을 것이라고 할 수 귀하의 문자열 항상 더 나은 매개 변수화 된 쿼리 사용하려면 :

my $st = 'INSERT INTO demo (fix) VALUES (?)'; 
my $r = $dbh->do($st, undef, $scal) or die $DBI::errstr; 

undef은 ADDI입니다 SQL 옵션 (여기서는 undef과 다른 것을 거의 보지 못했습니다). 다음 매개 변수는 문에서 ?에 대해 대체됩니다. DB 드라이버가 모든 인용문을 처리합니다. 멀리! 더 나은 (또는`,`INSERT ... VALUES ('$의 SCAL')) :

my $st = 'INSERT INTO sample_tbl (col1, col2, col3) VALUES (?, ?, ?)'; 
my $r = $dbh->do($st, undef, 'foo', 42, $scal) or die $DBI::errstr; 
+0

(내가 downvotes를 취소 할 수없는 앱을 사용하는 우연한 downvote) – ikegami

+0

@ikegami 절대로 신경 쓰지 마라. 그리고 말해 주셔서 감사합니다. – PerlDuck

관련 문제