【问题标题】:Why does my count() clause break my while statement?为什么我的 count() 子句会破坏我的 while 语句?
【发布时间】:2010-11-24 16:51:48
【问题描述】:

我的 SQL 调用有问题。最终,我正在从搜索框中运行 AJAX 调用并将结果返回到屏幕。我将显示的结果限制为 5 个,但如果结果总数超过 5 个,请提供在其他地方查看所有结果的链接。我认为只需在其中添加一个COUNT() 子句就可以解决这个问题,虽然COUNT() 确实正确返回了全部匹配数,但它会在循环时杀死我的while 语句并且只返回第一个结果。当我删除 count() 时,一切正常。

代码

<?php

if(isset($_POST['word']) && $_POST['word'] != "") 
    {
        $q=$_POST['word'];

            try {
                $db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
                $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $db->beginTransaction();

                $stmt = $db->prepare("SELECT COUNT(ID) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5");

                $stmt->execute(array('%'.$q.'%', '%'.$q.'%'));

                $foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();

                $db->commit();
            }

            catch (PDOException $e)
            {
                echo "There was a system DB error. <br>".$e->getMessage();          
            }               


        if(isset($foundrows) && $foundrows == 0) {
            echo "<div class='display_box' align='left'>
                No matching results found</div>";
        } else {        

                while($row = $stmt->fetch()) {

                    $counter = $row['counter'];

                    $id = $row['ID'];
                    $fname = $row['fname'];
                    $lname = $row['lname'];

            ?>
                    <a href="#" style="text-decoration:none; color:#000;">
                    <div class="display_box" align="left">

                    <?php echo $fname; ?>&nbsp;<?php echo $lname; ?><br/>
                    </div></a>

<?php     
                }

                if(isset($counter) && $counter > 5) {
?>                  
                    <a href="#" style="text-decoration:none; color:#000;">
                    <div class="display_box" align="left">
                    <?php echo (5-$counter)." additional matches found."; ?>
                    </div></a>
<?php                                   
                }
        }
    }   
?>

【问题讨论】:

  • 标题应该是您问题的摘要
  • @meagar - 我认为“what da puh”就足够了;)。谢谢!

标签: php ajax pdo


【解决方案1】:

COUNT() 是对表的聚合操作,只返回一行,这就是为什么在包含查询时没有得到预期的 5 个结果。

获得所需内容的一种方法是在查询中使用SUBSELECT 子句:

SELECT (SELECT COUNT(ID) FROM tablename) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5

这将返回您期望的 5 个结果,表中行的完整计数作为每一行中的一列。

【讨论】:

    【解决方案2】:

    如果结果总数超过 5、提供其他地方查看的链接

    要确定如果没有 LIMIT 子句将返回的行数,请使用 SQL_CALC_FOUND_ROWS

    SELECT SQL_CALC_FOUND_ROWS ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5
    

    然后,如果没有限制,您对 SELECT FOUND_ROWS() 的调用将返回该号码。注意:SELECT SQL_CALC_FOUND_ROWSSELECT FOUND_ROWS() 语句之间不应发生其他 SQL 调用,否则该值将不正确。

    【讨论】:

      【解决方案3】:

      这与 PDO 或 PHP 无关。如果您指定一个聚合函数(如 COUNT()MAX()、...),它需要对行进行分组,因为您不能计算单行(当然)。如果您不指定 GROUP BY,它将折叠整个结果集。

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        相关资源
        最近更新 更多