【问题标题】:PHP sqlsrv_fetch_array not showing all resultsPHP sqlsrv_fetch_array 未显示所有结果
【发布时间】:2021-02-17 14:57:19
【问题描述】:

我在 PHP 中使用sqlsrv_connect 连接到 MSSQL 数据库。连接工作正常,我可以执行查询,但我有一个问题,指定返回的 row countsqlsrv_fetch_array while 循环 执行的迭代次数不同.谁能帮忙解释一下原因?

这是我的代码...

// Establish a connection to the MSSQL database
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
    // If there was an error format and display
    die(formatErrors(sqlsrv_errors()));
}

// Set the query to the MSSQL database
$tsql = "SELECT xyz FROM db_table WHERE field = ? ORDER BY field ASC";      ***** DUMMY EXAMPLE ******

$params = array($some_value);
    
// Executes the query
$stmt = sqlsrv_query($conn, $tsql, $params, array( "Scrollable" => 'static' ));
    
// Was there an error
if ($stmt === false) {
    die(formatErrors(sqlsrv_errors()));
}

$row_count = sqlsrv_num_rows($stmt);
echo "Total rows: ".$row_count."<br/>";      ****** THIS RETURNS 28463 ROWS, WHICH IS CORRECT ******

// Update the response
$response = array(0 => array("status" => "success", "value" => "connected", "records" => "0"));

// Set the row count start position
$i = 1;

// Iterate through the results
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {

    // Increase the processed row count
    $i++;
}

echo $i;      ****** THIS RETURNS 5978 ROWS, WHICH IS INCORRECT ******

最终在生产中,这将在 while 循环中执行一个操作,但我首先需要弄清楚为什么它没有遍历所有行。

【问题讨论】:

  • 尝试使用SQLSRV_FETCH_BOTH 而不是SQLSRV_FETCH_ASSOC。你可以阅读更多关于它Here
  • @EdvinasPlatovas 为什么会改变任何首先获取的结果记录的数量?
  • @CBroe sqlsrv_num_rows 计算行数。 sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) 将合并具有多个同名列的结果集?
  • 您是否尝试在脚本末尾执行formatErrors(sqlsrv_errors()) 来检查可能的错误? sqlsrv_fetch_assoc() 成功返回一个数组,null 如果没有更多行要返回,false 如果发生错误。
  • 作为第二个选项,尝试将ClientBufferMaxKBSize 选项更改为sqlsrv_configure(),因为您使用的是客户端光标。默认值为 10240 KB,因此您可以轻松达到该限制。

标签: php sql-server sqlsrv


【解决方案1】:

我终于能够完成这项工作,但使用for 循环而不是while 循环,并使用SQLSRV_SCROLL_ABSOLUTE 明确定义行

for ($i=0; $i < sqlsrv_num_rows($stmt); $i++){
    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, $i);

    // Do something here with $row data

    echo "Row: ".trim($i);
}

这会按预期返回所有 28463 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多