【问题标题】:How to check for an empty set when using Perl DBI->MySQL使用 Perl DBI->MySQL 时如何检查空集
【发布时间】:2012-10-12 13:36:29
【问题描述】:

有没有办法检查 DBI->execute 语句是否返回一个空集?目的是我想创建一个表,然后询问用户名,如果用户名不在表中,(检查空的 fetch() 语句),然后添加到表中。有什么建议吗?

    $sth = $dbh->prepare("SELECT * FROM table_name_here");
    $sth->execute();

    if(...$sth->fetch() was empty...)
    do something...

【问题讨论】:

    标签: mysql perl dbi


    【解决方案1】:

    试试看:

    $sth = $dbh->prepare("SELECT * FROM table_name_here");
    $sth->execute();
    
    unless ($sth->fetch()) { do something..; }
    

    【讨论】:

      【解决方案2】:

      有没有办法检查 DBI->execute 语句是否返回空集

      是的。

      $sth = $dbh->prepare("SELECT * FROM table_name_here");
      $sth->execute();
      unless( $sth->rows ) {
          #empty set
      }
      

      【讨论】:

      • 这不适用于SELECT 语句。来自'DBI'模块的documentation“对于'SELECT'语句,通常不可能知道将返回多少行,除非全部获取”
      【解决方案3】:

      我建议你初步获取记录的数量,像这样

      my ($records) = $dbh->selectrow_array('SELECT count(*) FROM table_name_here');
      

      【讨论】:

      • 这会告诉我将返回多少个不同的条目吗?因此,如果我在一个表中有 4 个条目,这将设置 $records = 4?
      • 它将告诉您表中有多少条记录,它们是否不同(尽管您很可能至少有一个唯一的列,在这种情况下它们都必须不同)。我建议你做实验。请记住,在您获取计数和获取数据本身之间记录数发生变化的可能性非常
      【解决方案4】:

      一种可能的方法:

      my $row_count = 0;
      while (my @ary = $sth->fetchrow_array() ) { ...; $row_count++; }
      unless ($row_count) { 
        ...
      }
      

      但我不禁想知道,对于这种特定情况,为什么需要使用fetchrow,而不是fetchall。事实上,我会这样重新组织它:

      my ($count) = $dbh->selectrow_array('
         SELECT COUNT(*) FROM users WHERE username = ?'
         undef, $username);
      if ($count) { ... } 
      

      【讨论】:

        猜你喜欢
        • 2016-05-26
        • 2014-02-07
        • 2016-07-25
        • 1970-01-01
        • 2011-10-06
        • 2023-04-10
        • 1970-01-01
        • 2012-09-05
        • 2012-10-01
        相关资源
        最近更新 更多