当前位置:  开发笔记 > 编程语言 > 正文

是否有数组的SQL参数绑定?

如何解决《是否有数组的SQL参数绑定?》经验,为你挑选了4个好方法。

是否有一种标准的方法来绑定SQL查询中的数组(标量)?我想绑定到一个IN子句,如下所示:

SELECT * FROM junk WHERE junk.id IN (?);

我碰巧使用了Perl::DBI哪些强制参数到标量,所以我最终得到了无用的查询,例如:

SELECT * FROM junk WHERE junk.id IN ('ARRAY(0xdeadbeef)');

澄清:我将查询放在自己的.sql文件中,因此字符串已经形成.如果答案提到动态创建查询字符串,我可能会进行搜索并替换.

编辑:这个问题有点像参数化SQL IN子句?.我原本以为它应该被关闭,但似乎它正在累积一些特定的Perl特定信息.



1> Ovid..:

如果您不喜欢那里的地图,可以使用'x'运算符:

my $params = join ', ' => ('?') x @foo;
my $sql    = "SELECT * FROM table WHERE id IN ($params)";
my $sth    = $dbh->prepare( $sql );
$sth->execute( @foo );

围绕'?'需要括号 因为它强制'x'在列表上下文中.

阅读"perldoc perlop"并搜索"Binary"x"'以获取更多信息(它位于"乘法运算符"部分).



2> Ask Bjørn Ha..:

您指定"这是具有一个参数的查询的SQL" - 当您需要许多参数时,这将不起作用.当然,这是一个痛苦的处理.已经提出的另外两个变化:

1)使用DBI-> quote而不是占位符.

my $sql = "select foo from bar where baz in ("
           . join(",", map { $dbh->quote($_) } @bazs)
           . ")";
my $data = $dbh->selectall_arrayref($sql);

2)使用ORM为您执行此类低级别的操作.例如,DBIx :: Class或Rose :: DB :: Object.



3> JDrago..:

我做的事情如下:

my $dbh = DBI->connect( ... );
my @vals= ( 1,2,3,4,5 );
my $sql = 'SELECT * FROM table WHERE id IN (' . join( ',', map { '?' } @vals ) . ')';
my $sth = $dbh->prepare( $sql );
$sth->execute( @vals );


@Dems,JDrago的例子已经在使用绑定变量,所以他不需要做其他的anthing来阻止SQL注入.
“地图{'?” } @ vals`更简单地是`('?')x @ vals`

4> draegtun..:

另一种构建SQL的方法是使用类似SQL :: Abstract ....

use SQL::Abstract;
my $sql    = SQL::Abstract->new;
my $values = [ 1..3 ];
my $query  = $sql->select( 'table', '*', { id => { -in => $values } } );

say $query;   # => SELECT * FROM table WHERE ( id IN ( ?, ?, ? ) )

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有