我正在将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的新手,很抱歉,可能提出了明显的问题。 预先感谢。
答案 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::rowCount和client-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;
?>