PDO pgsql выборка с курсором абсолютной позиции не удается - PullRequest
1 голос
/ 21 сентября 2011

Я пытаюсь реализовать функцию подкачки, используя возможность PDO создавать курсоры.

В настоящее время мой код выглядит примерно так (очень сложно, я знаю, что):

$pdo = new PDO();
$pdo->setAttribute(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL);
// prepared select-query omitted
$pdoStatement = $pdo->execute();

$start_index = MAX_THINGS_PER_PAGE * $current_page - MAX_THINGS_PER_PAGE;
$stop_index = MAX_THINGS_PER_PAGE * $current_page;
$row_count = $this->statement->rowCount(); // works for the PgSQL driver
$index = $start_index;
while (($row_count > 0) && ($index < $stop_index))
{
    // try-catch block omitted
    $values[] = $this->statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $index);

    --$row_count;
    ++$index;
}

Однако, по-видимому, независимо от значения $ start_index, запрос извлекает только первые 10 (это значение MAX_THINGS_PER_PAGE) строк результирующего набора.Всегда.

Возможно, я делаю что-то не так, но искусство использования курсоров для нумерации страниц выглядит несколько загадочно и недокументировано ...

1 Ответ

0 голосов
/ 01 ноября 2011

Я только что столкнулся с этой проблемой сегодня.PDOStatement :: rowCount () не работает для SELECT в некоторых базах данных.From PDOStatement :: rowCount :

Если последний SQL-оператор, выполненный связанным PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором.Однако такое поведение не гарантируется для всех баз данных и не должно использоваться для переносимых приложений.

Мне потребовалось немало времени, чтобы осознать это, так как я думал, что это проблема с использованием курсоров..

Этот подход я выбрал: замените использование PDOStatement :: rowCount () следующим:

<?php
$row_count = count($stmt->fetchAll());
?>

Это неэффективно с точки зрения памяти, но это то, что многиебазы данных все равно рассчитывают общее количество строк.

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