sqlsrv 数组不返回所有行

问题描述 投票:0回答:7

我似乎无法弄清楚为什么根据

sqlsrv_fetch_assoc
,当结果集中有2行时,
sqlsrv_num_rows
只返回1行。我尝试过对参数进行硬编码,但仍然得到相同的结果。

SSMS 结果集

id 描述
------ -------------
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
php sql-server sqlsrv
7个回答
7
投票

当我尝试查看结果集时

      $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
      print_r($row);`

既然您单独列出了这一点,我希望您不要这样做(显示所有代码):

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

3
投票

sqlsrv_fetch_array
:以关联数组、数值数组或两者(默认)的形式返回“下一个”可用数据行。

我强调。

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

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

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



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



1
投票

$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

这正是我正在寻找的。


0
投票
fetch_array

一次只检索一行(一行是下一行)...尝试类似...


while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );){ //do something awesome }



0
投票


0
投票

就我而言,我有一个 varchar 字段,但我认为任何 char 字段都可能发生这种情况。

选择替换(替换(替换(替换(替换(替换(替换内容,char(146),''),char(147),''),char(148),''),char(149),'') ),字符(150),' '),字符(151),' ') 来自我的表

然后我得到了所有结果。无法声称此处列出的所有字符是否捕获了所有内容(注意 LF/0x0a 工作正常)

这是 PHP 的 Linux 版本。

© www.soinside.com 2019 - 2024. All rights reserved.