Perl 在将标量变量保存到DB(sqlite3)时遇到问题?

Perl 在将标量变量保存到DB(sqlite3)时遇到问题?,perl,sqlite,Perl,Sqlite,#我正在将输出保存到一个数组,该数组如下所示:- 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| #然后我将此数组转换为标量变量,如下所示:- 60=20130624-09:45:02

#我正在将输出保存到一个数组,该数组如下所示:-

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|
#然后我将此数组转换为标量变量,如下所示:-

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=join(“”,@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
my$st=qq(插入演示(修复)
价值($scal));
my$r=$dbh->do($st)或die$DBI::errstr;
#我的表模式是:-
创建表演示(修复varchar);
我不断收到错误:-DBD::SQLite::dbdo失败:接近“:45”:pdb.pl第92行第1行的语法错误。
DBD::SQLite::db do失败:靠近“:45”:pdb.pl第92行第1行的语法错误。
任何帮助都将被告知

表示数组的方式有点奇怪。通常你会把它写成

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注入()的攻击。 考虑你的字符串是“代码> FoO”的情况;从演示中删除--。最终结果将是

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
用于其他SQL选项(我很少看到与这里的
undef
不同的东西)。以下参数将替换为语句中的
s。DB驱动程序为您完成所有报价。使用的
越多,必须向
do()提供的参数就越多。


$scal
周围使用记号:
插入。。。值(“$scal”)或(远!!更好)使用参数化查询(那个些带有问号的查询)。。谢谢这是个糟糕的建议,@PerlDuck!(使用该应用程序的意外否决票,不允许我撤销否决票)@ikegami没关系,事情发生了。谢谢你告诉我。