【问题标题】:What does 'SELECT COUNT(*)' with Perl DBI return?Perl DBI 的“SELECT COUNT(*)”返回什么?
【发布时间】:2015-10-10 21:16:50
【问题描述】:

我正在使用 Perl DBI 查询 MySQL 数据库,我的目标只是查看我的 SELECT 查询是否找到任何内容(即行 > 0)。换句话说,如果SELECT 查询根本找不到任何东西。

SELECT COUNT(*) 在我在 MySQL 中测试查询时返回一个数字,例如 1、2 或 3。

但是,我想知道这个数字是否通过 DBI 直接返回到我的 Perl 代码并分配给我的 $sth 变量。

my $sth = $dbh->prepare("SELECT COUNT(*) FROM `USERS` WHERE FIRSTNAME = ? AND LASTNAME = ?");

$sth->execute($firstName, $lastName);

if ($sth > 0){                  #Check if found any matches
    print "Found something!";

} else { 
    print "No matches!";
}

我想我的主要问题是SELECT COUNT(*) 是否返回一个数字并直接保存在我的$sth 变量中,或者我是否需要对$sth 执行其他操作来确定查询找到了多少行.

非常感谢。

【问题讨论】:

标签: mysql perl select dbi


【解决方案1】:

您误解了 DBI 的工作原理。引用the documentation

SELECT 语句的典型方法调用顺序是:

prepare,
  execute, fetch, fetch, ...
  execute, fetch, fetch, ...
  execute, fetch, fetch, ...

所以你已经有了prepareexecute,但你从来没有真正获取 SQL 引擎发现的数据。测试 $sth 的值永远不会给你任何有用的信息,因为它是对 DBI 语句句柄对象的引用,如果它曾经为零,那么就会出现严重问题

要查找具有给定名字和姓氏的用户数,您可以这样写

my $sth = $dbh->prepare('SELECT COUNT(*) FROM users WHERE firstname = ? AND lastname = ?');

$sth->execute($first_name, $last_name);

my ($count) = $sth->fetchrow_array;

print $count ? "Found something!\n" : "No matches!\n";

fetch方法有很多种,你选择哪一种取决于你期望的是一行还是多行;一列或多列;您是想一次获取所有行还是一次只获取一个行;以及是否可以使用简单的列值列表,或者您是否希望以 Perl 哈希的形式通过列名标识的值

在这种情况下,您只要求包含单个列的单行 - 计数 - 所以fetchrow_array允许将结果直接分配给标量变量$count,最后可以准备输出根据this值是否为零

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2013-08-13
    • 2013-04-28
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2014-12-08
    • 2015-07-31
    相关资源
    最近更新 更多