为什么我的count()子句会破坏我的while语句?

时间:2010-11-24 16:51:48

标签: php ajax pdo

我遇到了SQL调用的问题。最后,我正在从搜索框运行AJAX调用并将结果返回到屏幕。我将结果限制为5,但如果结果总数超过5,则提供链接以查看其他所有地方。我想通过简单地在其中添加COUNT()子句来处理问题,而COUNT()确实正确地返回完整数量的匹配,它在循环时会终止我的while语句并且仅返回第一个结果。当我删除count()时,一切正常。

CODE

<?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                                   
                }
        }
    }   
?>

3 个答案:

答案 0 :(得分:2)

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个结果,并将表中的行的完整计数作为每行中的一列。

答案 1 :(得分:1)

  

如果结果总数超过   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调用,否则该值将不正确。

答案 2 :(得分:0)

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