Количество строк PDO - эквивалент num_rows - PullRequest
0 голосов
/ 21 января 2019

Я перемещаю код PHP с MySQL на сервер MS SQL. Это выполнит мой запрос:

  $r = $db_conn->prepare($sql);
  $r->execute();

Прежде чем начать обработку, мне нужно посчитать, сколько строк было возвращено.

старый код:

$r->num_rows;

новый код:

$rows  = $r->fetchAll(PDO::FETCH_ASSOC);
$rcount = count($rows);

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

try {
    $row = $r->fetch(PDO::FETCH_ASSOC);
} catch (Exception $ex) {   
    return 0;
}   

После подсчета мне нужно повторно войти в 1-ю строку в моем наборе записей. Как я могу это сделать без необходимости повторного запроса базы данных?

Я новичок в PHP, извините за глупый и, вероятно, очевидный вопрос. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Один из возможных подходов, если вы используете PHP Driver для SQL Server , это использовать PDOStatement :: rowCount и клиентский курсор . С этим типом курсора число строк доступно после выполнения запроса, но этот тип курсора следует использовать для небольших (средних) наборов результатов.

<?php
# Connection
$server    = 'server\instance,port';
$database  = 'master';
$uid       = 'uid';
$pwd       = 'pwd';

# PDO Connection
try {
    # SQL authentication
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    # Windows authentication
    #$conn = new PDO("sqlsrv:server=$server;Database=$database");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

# Client-side cursor
try {
    $options = array(
        PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, 
        PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED
    );
    $stmt = $conn->prepare("SELECT * FROM master.sys.server_principals", $options);
    $stmt->execute();
    echo 'Row count: '.$stmt->rowCount().'<br>';
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC) ){
        echo 'Login name: '.$row['name'].'<br>';
    }    
} catch( PDOException $e ) {
    die( "Error executing query".$e->getMessage() );
}

# End
$stmt = null;
$conn = null;
?>
0 голосов
/ 21 января 2019

В PDO нет способа сбросить указатель.Вы можете выполнить запрос еще раз, но, учитывая, что вы уже получили все данные с помощью вызова fetchAll, это бесполезно.Вместо этого, чтобы получить доступ к данным, просто выполните цикл по массиву $rows, например

foreach ($rows as $row) {
    // do something
}

. Обратите внимание, что если вы ожидаете исключение для fetch, вполне вероятно, что вы можете получить его и для fetchAll,поэтому вы должны заключить вызов в fetchAll в блок try / catch:

try {
    $rows = $r->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $ex) {   
    return 0;
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...