6

我似乎无法弄清楚为什么sqlsrv_fetch_assoc当结果集中有 2 行时只返回 1 行sqlsrv_num_rows。我尝试对参数进行硬编码,但仍然得到相同的结果。

SSMS 结果集

标识说明
------ -------------
2 管理员
3 用户

PHP

$col = 'abcd';
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?";
$params = array( $col );
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );

$query = sqlsrv_query( $conn, $stmt, $params, $options );
if( $query === false ) {
    print( print_r( sqlsrv_errors() ) );
}

while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
    ...
}

当我尝试查看结果集时

$row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );

print_r($row);

我收到

大批
(
    [id] => 2
    [描述] => 管理员
)

sqlsrv_num_rows

echo sqlsrv_num_rows( $query );
//Returns 2
4

6 回答 6

7

当我尝试查看结果集时

      $row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC);
      打印_r($行);`

既然你单独列出了这个,我希望你没有这样做(显示所有代码):

$col = 'abcd';
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?";
$params = array( $col );
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );

$query = sqlsrv_query( $conn, $stmt, $params, $options );
if( $query === false ) {
    print( print_r( sqlsrv_errors() ) );
}

while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
    ...
    $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
    print_r($row);
}

因为很明显,每次循环迭代都会消耗 sqlsrv_fetch_array两次,一次用于条件检查,一次循环内。

从 while 循环中删除所有绒毛,只拥有这个 - 绝对没有别的,甚至没有 ... 或评论。

while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
    print_r($row);
}
于 2013-04-22T19:39:19.933 回答
3

sqlsrv_fetch_array:将下一个可用数据行作为关联数组、数值数组或两者(默认)返​​回。

由我强调。

返回值:成功时返回一个数组,如果没有更多行要返回,则返回 NULL,如果发生错误,则返回 FALSE。

您需要执行一个 while 循环来获取所有记录,如下所示:

while ($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
    //process $row
}
于 2013-04-22T19:27:26.143 回答
0

我的印象是fetch_array一次只检索一行(一行是下一行)......尝试类似......

while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );){ 

//do something awesome 

}
于 2013-04-22T19:27:17.530 回答
0

一个简单的方法是使用 sqlsrv_fetch_array 并使用多维数组来存储每一行​​数据。但是这样做时请确保使用 $i++ 而不是 $i += 1 如果我们使用 $i +=1 则只保存单行。

   $i = 0;
   while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
        $result[$i][0] = $row['id'];
        $result[$i][1] = $row['description'];

        $i++;    //works 
       // $i += 1; //does not work with this !
    }
var_dump($result);
于 2019-05-29T14:48:07.470 回答
0

这段代码终于为我服务了感谢“Ashish”。我不明白为什么它没有被赞成。

$Result = array();
$sql  = "EXEC CRM_TestSP;";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
    die( print_r( sqlsrv_errors(), true) );
}

$i = 0;
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
    $Result[$i]["Description"] = $row['Description'];
    $i++;
}

sqlsrv_free_stmt($stmt);
return $Result;

它返回一个像这样的数组:

array(2) { [0]=> array(1) { ["Description"]=> string(4) "Text 1" } [1]=> array(1) { ["Description"]=> string(4) "Text2" } } 1

这正是我正在寻找的。

于 2020-05-20T14:07:51.890 回答
0
$sql  = "SELECT id, description FROM dbo.tbl";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
    die( print_r( sqlsrv_errors(), true) );
}
$data = array();
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
    $data[] = array(
                "description" => $row['description']
                );  
}

return $data;
于 2021-08-11T06:30:30.443 回答