查询名称中的perl DBI逗号

查询名称中的perl DBI逗号,perl,sqlite,dbi,Perl,Sqlite,Dbi,我正在使用perl与一个sqlite数据库进行对话,但遇到了一个错误。我认为这是因为$druges变量中存储的一些化学名称中有逗号,它们还有许多其他的“奇怪字符” 任何帮助都将不胜感激,谢谢 **error message:** - read in 57to find CIDs for - Opened database successfully - retrieving results for cyclo(L-Val-L-Pro) - retrieving results for

我正在使用perl与一个sqlite数据库进行对话,但遇到了一个错误。我认为这是因为$druges变量中存储的一些化学名称中有逗号,它们还有许多其他的“奇怪字符”

任何帮助都将不胜感激,谢谢

**error message:** 
- read in   57to find CIDs for
- Opened database successfully
- retrieving results for    cyclo(L-Val-L-Pro)
- retrieving results for    Sinapic_acid
- retrieving results for    NHQ
- DBD::SQLite::db prepare failed: near ",": syntax error at get_drugName2IDinfo.sqlite.pl line 33.
- DBD::SQLite::db prepare failed: near ",": syntax error at get_drugName2IDinfo.sqlite.pl line 33.
第33行:

药物名称示例:

部分脚本:


您可以始终尝试使用$drug=~s/[:punct:///g;在执行查询之前,是否尝试删除标点符号


如果你不想这样,也许可以用空格代替它们$药物=~s/,//g

您是否尝试过使用占位符而不是自己引用字符串

my $sth = $dbh->prepare( 'SELECT * from chem_aliases WHERE alias LIKE ?' );
my $rv = $sth->execute( $drug . '%' ) or die $DBI::errstr;

您应该使用参数,如中所示。危险!看,这是正确的答案。将“%”附加到$drug缓冲区,并使用“?”占位符syntax.Oops。谢谢@LenJaffe!我已经用你的更正更新了我的答案。
(2R,3R,4S,6R)-2-((5-hydroxy-2,2-dimethyl-3,4-dihydro-2H-benzo[h]chromen-6-yl)oxy)-6-(hydroxymethyl)tetrahydro-2H-pyran-3,4,5-triol
my %HoDrugs;
while (my $line=<IN>){
    chomp $line;
    $HoDrugs{$line}=1;
}
close(IN);
print "read in\t".scalar(keys %HoDrugs)."to find CIDs for\n";
##
my $driver   = "SQLite"; 
my $database = "/Users/alisonwaller/Documents/Typas/ext_data/STITCHv3.1/STITCHv3.1.sqlite.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) 
                  or die $DBI::errstr;

print "Opened database successfully\n";
###
my $outfile="$in_drugNms.sq.plsCIDs.tab";
open (OUT,">",$outfile);
foreach my $drug (keys %HoDrugs){

    my $stmt = qq(SELECT * from chem_aliases WHERE alias LIKE '$drug%');
    my $sth = $dbh->prepare( $stmt );
    my $rv = $sth->execute() or die $DBI::errstr;
    if($rv < 0){
            print $DBI::errstr;
    }
    while(my @row = $sth->fetchrow_array()) {
            print "retrieving results for\t$drug\n";                
            print OUT join("\t",$drug,$row[0],$row[1],$row[2]) . "\n";
    }
}
    print "Operation done successfully\n";
    $dbh->disconnect();
my $sth = $dbh->prepare( 'SELECT * from chem_aliases WHERE alias LIKE ?' );
my $rv = $sth->execute( $drug . '%' ) or die $DBI::errstr;