2010-11-24 8 views
0

私はSQL呼び出しに問題があります。最終的に、私は検索ボックスからAJAX呼び出しを実行し、その結果を画面に戻しています。私は結果を5に制限しますが、結果の合計数が5を超える場合は、リンクを提供して他の場所を表示してください。私はこれにCOUNT()句を追加するだけで問題が解決されると思っていましたが、COUNT()は完全な一致数を正しく返していますが、ループバックして最初の結果のみを返すときにwhile文がkillされます。 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

+0

@meagar - 私は「どんなことが十分であったか」と思っていました。ありがとう! – JM4

答えて

1

、使用し、他の場所

は何の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

COUNT()はあなたのクエリから期待するとして、それを含めたときに5件の結果を取得していない理由である1行のみを返すテーブルの上に集約演算です。あなたが欲しいものを手に入れることができます

一つの方法は、クエリで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を指定しないと、結果セット全体が折りたたまれます。結果の総数が 5を超えた場合

関連する問題