【问题标题】:Checking for an empty result (PHP, PDO, and MySQL) [duplicate]检查空结果(PHP、PDO 和 MySQL)[重复]
【发布时间】:2012-11-20 16:58:56
【问题描述】:

我在这里做错了什么?我只是从表中检索结果,然后将它们添加到数组中。在我检查空结果之前,一切都按预期工作......

这会得到匹配,将其添加到我的数组中并按预期回显结果:

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today', $today, PDO::PARAM_STR);

if(!$sth->execute()) {
    $db = null;
    exit();
}

while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $this->id_email[] = $row['id_email'];
    echo $row['id_email'];
}

$db = null;
return true;

当我尝试检查空结果时,我的代码返回“空”,但不再产生匹配结果:

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today',$today, PDO::PARAM_STR);

if(!$sth->execute()) {
    $db = null;
    exit();
}

if ($sth->fetchColumn()) {
    echo 'not empty';
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        $this->id_email[] = $row['id_email'];
        echo $row['id_email'];
    }
    $db = null;
    return true;
}
echo 'empty';
$db = null;
return false;

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您不应将 rowCount 用于 SELECT 语句,因为它不可移植。我使用isset 函数来测试选择语句是否有效:

    $today = date('Y-m-d', strtotime('now'));
    
    $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
    
    // I would usually put this all in a try/catch block, but I kept it the same for continuity
    if(!$sth->execute(array(':today'=>$today)))
    {
        $db = null;
        exit();
    }
    
    $result = $sth->fetch(PDO::FETCH_OBJ)
    
    if(!isset($result->id_email))
    {
        echo "empty";
    }
    else
    {
        echo "not empty, value is $result->id_email";
    }
    
    $db = null;
    

    当然,这仅适用于单个结果,就像您在遍历数据集时可能遇到的那样。

    我想我会权衡一下,因为我最近不得不处理这个问题。

    【讨论】:

    • 如果记录中的字段为空而其他字段有值怎么办?
    【解决方案2】:

    当您执行$sth-&gt;fetchColumn() 时,您正在丢弃结果行。这不是您检查是否有任何结果的方式。你会的

    if ($sth->rowCount() > 0) {
      ... got results ...
    } else {
       echo 'nothing';
    }
    

    相关文档在这里:PDOStatement::rowCount

    【讨论】:

    • 谢谢马克,这很有道理。但是,对于 rowCount(),它表示它不适用于所有数据库上的 SELECT - '如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。然而,这种行为并不能保证适用于所有数据库,并且不应依赖于可移植应用程序。您是否熟悉另一种方法?
    • @canoebrain:你有 2 个选择。获取所有数据并构建结果数组,然后对数组进行计数。或在执行真正的“给我数据”查询之前执行单独的select count(*)-type 查询。
    • @Jeffrey - 哎呀,实际上,不,我收回了 - 它会正确返回,因为“返回”退出了。如果我在那里没有返回,那么是的,我需要一个“其他”来使它工作。
    • “您不应该将 rowCount 用于 SELECT 语句...”见下文.. 例如,它不适用于 SQLite。
    • 你的意思是?这个问题被标记为mysql,它确实正确地进行了rowCount。
    【解决方案3】:
    $sql = $dbh->prepare("SELECT * from member WHERE member_email = '$username' AND member_password = '$password'");
    
    $sql->execute();
    
    $fetch = $sql->fetch(PDO::FETCH_ASSOC);
    
    // if not empty result
    if (is_array($fetch))  {
        $_SESSION["userMember"] = $fetch["username"];
        $_SESSION["password"] = $fetch["password"];
        echo 'yes this member is registered'; 
    }else {
        echo 'empty result!';
    }
    

    【讨论】:

    • 解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
    【解决方案4】:

    要考虑的另一种方法:

    当我构建 HTML 表或其他依赖于数据库的内容时(通常通过 AJAX 调用),我喜欢在处理任何标记之前检查 SELECT 查询是否返回了任何数据。如果没有数据,我只是返回“未找到数据......”或类似的东西。如果有数据,则继续,构建标题并循环遍历内容等。尽管我可能会将我的数据库限制为 MySQL,但我更喜欢编写可移植的代码,所以 rowCount() 不可用。相反,请检查列数。不返回任何行的查询也不会返回任何列。

    $stmt->execute();
    $cols = $stmt->columnCount(); // no columns == no result set
    if ($cols > 0) {
        // non-repetitive markup code here
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    

    【讨论】:

    • 这不会按预期工作。来自 columnCount() 的文档:PDOStatement 对象表示的结果集中的列数,即使结果集为空。如果没有结果集,PDOStatement::columnCount 返回 0。(强调我的)。这意味着 while 循环将始终运行,并且由于您没有在 while 循环中检查 ===false,因此您会遇到问题。我自己试过了,虽然查询没有返回任何结果,但列数是 11,如果有任何结果,应该有的列数。
    【解决方案5】:

    如果您可以选择使用 fetchAll() 那么,如果没有返回任何行,它将只是一个空数组。

    count($sql->fetchAll(PDO::FETCH_ASSOC))
    

    将返回返回的行数。

    【讨论】:

      【解决方案6】:

      我只找到了一种可行的方法...

      $quote = $pdomodel->executeQuery("SELECT * FROM MyTable");
      
      //if (!is_array($quote)) {  didn't work
      //if (!isset($quote)) {  didn't work
      
      if (count($quote) == 0) {   //yep the count worked.
          echo 'Record does not exist.';
          die;
      }
      

      【讨论】:

      • 哦,我也找到了另一种可行的方法。 if ($quote == null) { echo '不存在记录'; }
      • 如果查询没有返回任何行,那么这个 "if (count($quote) == 0)" 不起作用但是这个 "if ($quote == null)" 在两者中都可以正常工作案子。谢谢@hamish
      【解决方案7】:

      我在这里做错了什么?

      几乎所有东西。

      $today = date('Y-m-d'); // no need for strtotime
      
      $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
      
      $sth->bindParam(':today',$today); // no need for PDO::PARAM_STR
      
      $sth->execute(); // no need for if
      $this->id_email = $sth->fetchAll(PDO::FETCH_COLUMN); // no need for while
      
      return count($this->id_email); // no need for the everything else
      

      实际上,您总是拥有获取的数据(在本例中为 $this-&gt;id_email 变量)来判断您的查询是否返回任何内容。在my article on PDO 中阅读更多内容。

      【讨论】:

        【解决方案8】:

        感谢Marc B's help,这对我有用(注意:Marc 的 rowCount() 建议也可以工作,但我对它不能在不同的数据库上工作或我的数据库发生变化的可能性感到不舒服。 .. 另外,他的 select count(*) 建议也可以,但是,我想是因为如果数据存在的话,我最终会得到数据,所以我就这样了)。

        $today = date('Y-m-d', strtotime('now'));
        
        $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
        
        $sth->bindParam(':today', $today, PDO::PARAM_STR);
        
        if(!$sth->execute()) {
            $db = null;
            exit();
        }
        
        while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
            $this->id_email[] = $row['id_email'];
            echo $row['id_email'];
        }
        $db = null;
        
        if (count($this->id_email) > 0) {
            echo 'not empty';
            return true;
        }
        echo 'empty';
        return false;
        

        【讨论】:

          猜你喜欢
          • 2013-06-01
          • 1970-01-01
          • 2023-04-01
          • 2012-06-02
          • 2019-03-21
          • 1970-01-01
          • 2016-10-06
          • 2011-10-18
          相关资源
          最近更新 更多