Perl中准备好的SQL语句
我是Perl的新手,我正在努力克服最初的学习曲线.
我有以下SQL语句: SELECT node_id FROM pagenodes INNER JOIN pageproducts ON pagenodes.node_id = pageproducts.nodeid INNER JOIN products ON pageproducts.prodid = products.prodid WHERE products.prodid = ? LIMIT 1 正如您所看到的,在查询中设置了LIMIT 1,我正在尝试从Perl脚本执行此查询,并将结果设置为变量. 到目前为止,我有以下内容: my $sql = 'SELECT node_id FROM pagenodes INNER JOIN pageproducts ON pagenodes.node_id = pageproducts.nodeid INNER JOIN products ON pageproducts.prodid = products.prodid WHERE products.prodid = ? LIMIT 1'; my $sth = $dbh->prepare($sql); my $sth->execute(); 我的问题是,如何将$prod_id作为WHERE参数传递,以及如何将结果设置为变量.谢谢 解决方法
你已经很远了.你已经有了
the placeholders (
? ),这很棒.你需要做的就是传递参数
as an argument to execute .它会按照它们在你的查询中出现的顺序自动填充到占位符中.
use strict; use warnings; use DBI; my $dbh = DBI->connect('dsn goes here','user','password') or die $DBI::errstr; # stuff happens ... my $prod_id = 1337; # or whatever my $sql = 'SELECT node_id FROM pagenodes INNER JOIN pageproducts ON pagenodes.node_id = pageproducts.nodeid INNER JOIN products ON pageproducts.prodid = products.prodid WHERE products.prodid = ? LIMIT 1'; my $sth = $dbh->prepare($sql); $sth->execute($prod_id); # no `my` here! 在这种情况下,LIMIT无关紧要.它也可以循环工作. 请注意,您在执行行前面有一个my.这是错误的语法. my用于声明变量,但在该行中,您只调用已存在的语句句柄对象上的方法. execute方法有一个返回值,但通常不会将其赋值给变量.如果返回值为true,则执行成功.如果它是假的,那就出错了.您也可以使用或到check for errors. $sth->execute or die $dbh->errstr; 现在要从数据库中获取单个值,您可以使用use ( my $node_id ) = $sth->fetchrow_array; 这将为您提供一次node_id. 如果您只想获得一个值并且只调用一次,那么您还可以保存一些代码行和use ( my $node_id ) = $dbh->selectrow_array('SELECT node_id FROM foo WHERE prodid=? LIMIT 1',undef,$prod_id); 同样,列表上下文很重要,因为fetchrow_array和selectrow_array返回列表,而不是数组引用.如果没有左侧的(),它将分配结果的数量(因为标量上下文). 但是,如果你想在循环中为一堆值做所有这些,它看起来有点不同.在这种情况下,请在循环外部进行准备,然后在循环内执行fetchrow_array(或任何其他fetchrow_ *方法).这将使它快得多. my $sth = $dbh->prepare($sql); foreach my $prod_id ( @prod_ids ) { $sth->execute($prod_id); ( my $node_id ) = $sth->fetchrow_array; print "$node_idn"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |