2017-01-01 71 views
2

#我現在的儲蓄輸出到陣列和陣列看起來像這樣: -將標量變量保存到數據庫(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| 

#然後我轉換這個數組標量是這樣的: -

$財政=加入(「」, @arr);

#現在,我想這個保存到數據庫: -

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':'INSERT ... VALUES( '$財政'));'或(遠越好! )使用參數化查詢(那些帶有問號的查詢)。 – 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)。 考慮一下你的字符串是foo'); delete from demo; --。那麼最終的結果將是

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

的第二個原因,這是不好的:你的字符串可以包含蜱($scal="foo's bar"),並且也將陷入困境所產生的INSERT語句:

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

結論:這是總是更好地使用參數化查詢

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

undef是阿迪(我在這裏很少見到與undef不同的東西)。以下參數在語句中替換爲?。數據庫驅動程序會爲你做所有的引用。更?您使用,更多的參數,你必須向do()

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

(意外downvote使用應用程序,它不會讓我撤消downvotes) – ikegami

+0

@ikegami沒關係,事情發生。並感謝您的講述。 – PerlDuck