【发布时间】:2021-02-17 14:57:19
【问题描述】:
我在 PHP 中使用sqlsrv_connect 连接到 MSSQL 数据库。连接工作正常,我可以执行查询,但我有一个问题,指定返回的 row count 与 sqlsrv_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