Почему мое предложение count () нарушает мое предложение while? - PullRequest
0 голосов
/ 24 ноября 2010

У меня проблема с вызовом 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 ]

2 голосов
/ 24 ноября 2010

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 голос
/ 24 ноября 2010

, если общее количество результатов превышает 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_ROWS и SELECT FOUND_ROWS() не должно выполняться никаких других вызовов SQL, иначе значение будет неправильным.

0 голосов
/ 24 ноября 2010

Это не имеет ничего общего с PDO или PHP. Если вы указываете агрегатную функцию (например, COUNT () , MAX () , ...), она должна сгруппировать строки, потому что вы не можете сосчитать одну строку (конечно ). Если вы не укажете GROUP BY , будет свернут весь набор результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...