我如何知道Perl DBI查询返回多少行?

The*_*i.9 19 mysql perl dbi

我试图基本上用Perl搜索数据库来判断是否有一个具有特定ID的项目.此搜索不返回任何行,但也可以返回一行.

我有以下代码:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0] != $exid) {
        ...
Run Code Online (Sandbox Code Playgroud)

基本上,这会尝试查看是否返回了ID,如果不是,则继续执行脚本.但是它会在这个$th->fetch()->[0]东西上抛出Null数组引用错误.我怎么才能只是检查它是否返回行或现在?

bri*_*foy 33

DBD :: mysql的驱动程序有一个的rows(),可以返回结果的计数方法:

$sth = $dbh->prepare( ... );
$sth->execute;
$rows = $sth->rows;
Run Code Online (Sandbox Code Playgroud)

这是特定于数据库驱动程序的,因此它可能在其他驱动程序中不起作用,或者在其他驱动程序中可能有所不同.

  • 我们在这里谈论一个特定的DBD.:) (3认同)
  • 啊,我现在看到它......隐藏在节点的标签中......如果这是问题的重要部分,它应该在标题或文本中:-) (2认同)

Pau*_*lin 13

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
my $found = 0;
while ($th->fetch()) 
{
   $found = 1;
}
Run Code Online (Sandbox Code Playgroud)

如果该行不存在,您的查询将不会返回任何内容,因此您无法取消引用该提取.

更新:你可能想重写那个

my $found = $th->fetch();
Run Code Online (Sandbox Code Playgroud)


run*_*rig 5

你为什么不只是“选择计数(*)......”??

my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = '$exid'");
Run Code Online (Sandbox Code Playgroud)

或者阻止Little Bobby Tables

my $q_exid = $dbh->quote($exid);
my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = $q_exid");
Run Code Online (Sandbox Code Playgroud)

或者,如果您要执行很多次:

my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?");
....save $sth (or use prepare_cached()) and then later
my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);
Run Code Online (Sandbox Code Playgroud)