Sql DBI准备语句-绑定十六进制通配符字符串
我是Perl新手,DBI的一个错误难住了我。我试图查询由十六进制值定义的一系列字符:Sql DBI准备语句-绑定十六进制通配符字符串,sql,arrays,perl,prepared-statement,dbi,Sql,Arrays,Perl,Prepared Statement,Dbi,我是Perl新手,DBI的一个错误难住了我。我试图查询由十六进制值定义的一系列字符: my @compare = ( '\'%\'+x\'0A\'+\'%\'', '\'%\'+x\'92\'+\'%\'', '\'%\'+x\'96\'+\'%\'', '\'%\'+x\'A0\'+\'%\'' ); my $fetch_bad_rows = $dbh->prepare( qq{ S
my @compare = ( '\'%\'+x\'0A\'+\'%\'',
'\'%\'+x\'92\'+\'%\'',
'\'%\'+x\'96\'+\'%\'',
'\'%\'+x\'A0\'+\'%\'' );
my $fetch_bad_rows = $dbh->prepare( qq{
SELECT B.* FROM ... AS B
WHERE B. ... LIKE ?
OR B. ... LIKE ?
OR B. ... LIKE ?
OR B. ... LIKE ?
});
$fetch_bad_rows->execute(@compare)
my $counter;
for( $counter = 0; $fetch_bad_rows->fetch; $counter++ ) {};
print LOG sprintf("Found %d bad rows\n", $counter);
以这种方式执行语句将找到0行。但是,如果我对查询中的字符串进行硬编码,则会得到437条记录:
my $fetch_bad_rows = $dbh->prepare( qq{
SELECT B.* FROM ... AS B
WHERE B. ... LIKE '%'+x'0A'+'%'
OR B. ... LIKE '%'+x'92'+'%'
OR B. ... LIKE '%'+x'96'+'%'
OR B. ... LIKE '%'+x'A0'+'%'
});
$fetch_bad_rows->execute
我一直无法找出传入绑定值的错误之处
有人有什么想法吗?提前感谢。准备中的
?
将确保所有内容都已转义。因此,如果您传入包含“
的内容,它将转义引号:
'\'%\'+x\'0A\'+\'%\''
可以更容易地写为:
q{'%'+x'0A'+'%'}
将变成:
... LIKE '\'%\'+x\'0A\'+\'%\''
因此它找不到任何东西。它在这里进行的转义是保护您免受SQL注入的影响。在查询本身中执行任何连接,只传入更改的部分。例如:
my $sql = "SELECT x FROM y WHERE z LIKE '%' + x? + '%'";
my $sth = $dbh->prepare($sql);
$sth->execute("0A");
谢谢你的回复。我根据提供的信息做了一些进一步的挖掘,并找到了一种让它工作的方法:
my @compare = ( '0A','92','96','A0' );
my $fetch_bad_rows = $dbh->prepare( qq{
SELECT B.* FROM ... AS B
WHERE B. ... LIKE '%' + UNHEX(?) + '%'
OR B. ... LIKE '%' + UNHEX(?) + '%'
OR B. ... LIKE '%' + UNHEX(?) + '%'
OR B. ... LIKE '%' + UNHEX(?) + '%'
});
$fetch_bad_rows->execute(@compare)
我无法使用“x”,因为prepare调用将其视为表引用,并抱怨没有找到表“x”。不过,UNHEX例程正是我所需要的,因为它需要字符串输入
再次感谢大家我们谈论的是哪个数据库?大家好,谢谢回复。我尝试了您的方法,但prepare调用失败,它说“在任何指定的表中都找不到列'x'”