Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DBI准备语句-绑定十六进制通配符字符串_Sql_Arrays_Perl_Prepared Statement_Dbi - Fatal编程技术网

Sql 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

我是Perl新手,DBI的一个错误难住了我。我试图查询由十六进制值定义的一系列字符:

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'”