2010-11-24 71 views
0

我遇到了一个我有SQL调用的问题。最终,我从搜索框中运行AJAX调用并将结果返回到屏幕。我将结果限制为5,但如果结果总数超过5,请提供链接以查看其他地方的所有内容。我想通过简单地添加一个COUNT()子句来解决这个问题,虽然COUNT()确实返回了完整的匹配数,但它在循环时会杀死我的while语句,并且只返回第一个结果。当我删除count()时,一切正常。为什么我的count()子句会破坏我的while语句?

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

标题应该是你的问题的摘要 – meagar 2010-11-24 17:10:33

回答

1

如果结果的总数超过 5,提供链接可查看所有其他地方

要确定应退还已经有过任何限制条款的行数,使用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

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个结果,你能指望与行的表中的一个完整计数作为每一行中的一列。

0

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

相关问题