sqlsrv数组不返回所有行

时间:2013-04-22 19:22:49

标签: php sql-server sqlsrv

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

SSMS结果集

id     description
------ -------------
2      Administrator
3      User

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

我收到了

Array
(
    [id] => 2
    [description] => Administrator
)

sqlsrv_num_rows

echo sqlsrv_num_rows( $query );
//Returns 2

6 个答案:

答案 0 :(得分:6)

  

当我尝试查看结果集

时      

$ row = sqlsrv_fetch_array($ query,SQLSRV_FETCH_ASSOC);
   的print_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);
}

答案 1 :(得分:3)

  

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

我的重点。

  

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

你需要做一个while循环来获取所有记录,如下所示:

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

答案 2 :(得分:0)

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

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

//do something awesome 

}

答案 3 :(得分: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

这正是我想要的。

答案 4 :(得分: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;

答案 5 :(得分:-1)

一种简单的方法是使用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);