PDO行数-等效num_rows

时间:2019-01-21 04:22:58

标签: php sql-server pdo

我正在将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;
}   

完成计数后,我需要指向记录集中的第一行,该如何执行而不必再次重新查询数据库?

我是PHP的新手,很抱歉,可能提出了明显的问题。 预先感谢。

2 个答案:

答案 0 :(得分:0)

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;
}   

答案 1 :(得分:0)

如果使用PHP Driver for SQL Server,一种可能的方法是使用PDOStatement::rowCountclient-side cursor。使用这种类型的游标,行数在执行查询后可用,但是这种类型的游标应用于小型(中型)结果集。

<?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;
?>