Multithreading Perl DBD::SQLite::db do失败:语法错误
我正在开发一个Perl脚本,以使用线程和DBD::SQLite来查询PasteBin API,以存储信息供以后使用 在运行脚本时,出现以下错误:Multithreading Perl DBD::SQLite::db do失败:语法错误,multithreading,sqlite,perl,Multithreading,Sqlite,Perl,我正在开发一个Perl脚本,以使用线程和DBD::SQLite来查询PasteBin API,以存储信息供以后使用 在运行脚本时,出现以下错误: DBD::SQLite::db do失败:接近“day”:getpaste.pl第113行出现语法错误。 线程3异常终止:DBD::SQLite::db do失败:接近“day”:getpaste.pl第113行出现语法错误。 使用我的代码进行调试下面是我在线程3中看到的内容: enum _Days { Monday, Tuesday, W
DBD::SQLite::db do失败:接近“day”:getpaste.pl第113行出现语法错误。
线程3异常终止:DBD::SQLite::db do失败:接近“day”:getpaste.pl第113行出现语法错误。
使用我的代码进行调试下面是我在线程3
中看到的内容:
enum _Days {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
class HeadingItem implements ListItem {
String _weekday;
final int time;
final DocumentReference reference;
set day(String weekday) {
var value = _Days.values[int.parse(weekday) - 1].toString();
var idx = value.indexOf(".") + 1;
var result = value.substring(idx, value.length);
_weekday = result;
}
String get day {
return _weekday;
}
HeadingItem.fromMap(Map<String, dynamic> map, {this.reference})
: assert(map['day'] != null),
assert(map['time'] != null),
day = map['day'], // 'day' isn't a field in the enclosing class <--- this is the error that im stuck on...
time = map['time'];
HeadingItem.fromSnapshot(DocumentSnapshot snapshot) : this.fromMap(snapshot.data, reference: snapshot.reference);
}
本例中的第113行是my$executeRowUpdate=$dbConnection->do($updateRow)代码>了解Perl它真的在抱怨我的上面的UPDATE语句
这件事我哪里做错了?在与sql相关的任何东西进行交互时,我都是新手。您需要记录生成的$updateRow
,然后查看它,看看有什么问题。没有这一点谁也不知道
池上在上面的评论中提到的其他问题可能值得关注其各自方面的新问题。正如您所发现的,这并不适用于有错误的代码。但是考虑到所有的注射问题,也许是时候尝试一下了
如果你解决了这些问题,也许你的错误也会消失。或者不是,但值得一试。为什么不打印$updateRow,看看它在数据库中实际执行的是什么?我看到1)一个shell注入错误,2)一个SQL注入错误,3)一个实验性功能的使用和一个坏的设计,4)一个if
条件永远不会为真($executeRowUpdate<0
),5)使用2-argopen
,6)O(N^2)代码,可使其成为O(N),7)不必要地使用全局变量,8)不必要地将空列表分配给空数组,以及9)在列表上下文中使用
可以消除的while循环。你应该有这个代码!是代码审查的尝试。不应将损坏的代码发送到那里。
sub threadCheckKey {
my ($url, $key) = @_;
my $fullURL = $url.$key;
my @flaggedRegex = ();
my $date = strftime "%D", localtime;
my @data = ();
my $thread = threads->create(sub {
my $dbConnection = openDB();
open(GET_DATA, "curl -s " . $fullURL . " -k 2>&1 |") or die("$!");
open(WRITE_FILE, ">", $key . ".txt") or die("$!");
while(my $line = <GET_DATA>) {
print WRITE_FILE $line;
foreach my $regex(@regexs) {
if($line =~ m/$regex/) {
if(!($regex ~~ @flaggedRegex)) {
push(@flaggedRegex, $regex);
}
}
}
}
close(WRITE_FILE);
close(GET_DATA);
open(READ_FILE, $key . ".txt") or die("$!");
while(my $line = <READ_FILE>) {
push(@data, $line);
}
close(READ_FILE);
my $updateRow = qq(UPDATE $tables[0] set data = \'@data\', date = \'$date\', regex = \'@flaggedRegex\' where pastekey = \'$key\');
my $executeRowUpdate = $dbConnection->do($updateRow);
if($executeRowUpdate < 0) {
print $DBI::errstr;
}