【问题标题】:PHP PDO Row CountingPHP PDO 行计数
【发布时间】:2012-09-14 05:35:54
【问题描述】:

如果有任何事件绑定到带有 host_id 参数的主机,我想检查行,如果没有任何事件绑定到主机,则一切都很好,它不会打印出来,但如果主机绑定到一个在事件中,它没有列出事件,但是如果我删除了我在下面指出的代码,注释问题从这里开始,问题在这里结束,它会列出事件。我也将上面的 fetchAll 函数用于另一件事,上面没有任何这样的错误,但是在下面的部分中,它没有列出事件,我该如何解决?

谢谢

try
{
    $eq = "SELECT * FROM `events` WHERE `host_id` = :id AND `confirmed` = '1' ";
    $eq_check = $db->prepare($eq);
    $eq_check->bindParam(':id', $id, PDO::PARAM_INT);
    $eq_check->execute();

    //problem starts here
    $count3 = $eq_check->fetchAll();
    $rowCount = count($count3);

    if ($rowCount == 0) 
    {
        echo "None"; 
    }
    //problem ends here

    while($fetch = $eq_check->fetch (PDO::FETCH_ASSOC) )
    { 
        $_loader = true;

        $event_id = $fetch['event_id'];
        $event_name = $fetch['event_name'];
        $link = "https://www.mywebsite.com/e/$event_id";

        echo "<a target=\"_blank\" href=\"$link\"><li>$event_name</li></a>";
    }
} 
catch(PDOException $e)
{
    $log->logError($e." - ".basename(__FILE__));
}

谢谢

【问题讨论】:

    标签: php mysql pdo rowcount


    【解决方案1】:

    如果不执行两次,您就无法获取两次。如果您不想仅仅重复使用您的 $count3 项目,您可以触发 closeCursor() 后跟 execute() 再次获取集合。

    要重用您的 $count3 变量,请将您的 while 循环更改为:foreach($count3 as $fetch) {

    【讨论】:

      【解决方案2】:

      当你有你的代码时它没有列出事件的原因是结果集已经使用你的 fetchAll 语句获取(fetchAll 不会留下任何东西要在以后使用fetch 获取)。

      在这种情况下,您最好运行 select count(*) 来获取行数,然后实际运行完整的查询以循环遍历结果:

      PDO 中的一个例子是 here:

      <?php
      $sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
      if ($res = $conn->query($sql)) {
      
          /* Check the number of rows that match the SELECT statement */
        if ($res->fetchColumn() > 0) {
      
              /* Issue the real SELECT statement and work with the results */
               $sql = "SELECT name FROM fruit WHERE calories > 100";
             foreach ($conn->query($sql) as $row) {
                 print "Name: " .  $row['NAME'] . "\n";
               }
          }
          /* No rows matched -- do something else */
        else {
            print "No rows matched the query.";
          }
      }
      
      $res = null;
      $conn = null;
      ?>
      

      请注意,您不能直接使用 rowCount 来获取所选行的计数 - 它旨在显示已删除的行数等。

      【讨论】:

      • @Truth 您是否建议最好检索几(几万?)千行,将它们 all 放入一个数组中以获取计数,然后执行一遍又一遍地循环它们?这在服务器内存以及数据库和 apache 之间的带宽上似乎非常昂贵。
      • 好吧,rowCount 在 MySQL 中工作,(OP 说他正在使用),但是是的。由于无论如何您都想使用结果集,因此您可以查询它。如果它在那里,你会得到计数和结果,如果没有,你会得到一个空数组。即使有 10k 行,您获取它们也不是只是来获取计数,而是获取它们来处理它们,并且获取计数。为什么不重用结果?您无需查询两次,只需一次。
      • @Truth 大量涉及 MySQL 的 rowCount 的 PDO 变通方法表明它不起作用,至少不像旧的 mysql_* 函数那样始终如一。虽然对 ML 答案的编辑要好得多(在已经获取的数组上使用 foreach) - 但我不同意获取一个潜在的巨大数组只是为了获取计数然后重新获取它。
      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 2011-02-11
      • 2017-12-04
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2012-07-02
      相关资源
      最近更新 更多