PHP sqlsrv_fetch_array 只循环一半的结果

Posted

技术标签:

【中文标题】PHP sqlsrv_fetch_array 只循环一半的结果【英文标题】:PHP sqlsrv_fetch_array only loops through half of the results 【发布时间】:2018-09-05 15:25:56 【问题描述】:

当循环遍历(60 行)的结果集时,php 仅循环遍历少数结果。如果我不对结果进行排序,它会返回四个。如果我按他们的 ID 对结果进行排序,它会返回 31 个结果。我相信这可能与每行数据的大小有关,但我不能确定。我从中选择的视图有 50 列,其中大约四分之一是 html 代码,我相信它们的数据类型为 varchar(max)。我正在使用以下规格和代码。 微软 SQL 服务器 2008 PHP 7.2 ODBC 17 PHP 执行时间为 900 秒 PHP 内存限制为 4096MB

$connection_info = array();
$connection_info["Database"] = "database";
$connection_info["UID"] = "username";
$connection_info["PWD"] = "password"
$connection = sqlsrv_connect( "server", $connection_info );
result = sqlsrv_query( $connection, "SELECT * FROM server.[database].[dbo].[table]", array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ) );

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC ) ) 
    echo $row["id"] . " " . var_dump( sqlsrv_errors() ) . "<br>";
    
echo var_dump( sqlsrv_errors() );

sqlsrv_errors() 的最后一次检查返回错误:

数组(1) [0]=> 数组(6) [0]=> 字符串(5) "01004" ["SQLSTATE"]=> string(5) "01004" [1]=> int(0) ["code"]=> int(0) [2]=> string(71) "[Microsoft][ODBC Driver 17 for SQL Server]字符串数据,对 截断" ["消息"]=> 字符串(71) "[Microsoft][ODBC Driver 17 for SQL Server]字符串数据,右截断"

【问题讨论】:

while (sqlsrv_fetch($result)) echo sqlsrv_get_field($result, 0 )."\n"; 是否会报错? 不,它不会遍历所有 63 个结果的第一个值。但是,我尝试将 0 更改为 9(其中包含大量数据的列之一)并且我得到了资源 id # 然后是 id 号。 sqlsrv_errors() 返回 null。 OK,那你可以用sqlsrv_get_field()正确获取所有行数据吗? 不幸的是,这是不可能的。使用代码的函数应该从数组中列出的所有表中收集数据。并非所有表格都具有相同数量的结果或相同数量的列。 有人找到解决方案了吗? 【参考方案1】:

我也有类似的问题。

我发现循环似乎会随机停止。这是我解决问题的方法。当循环到达服务器产生错误的点时(可以使用'sqlsrv_errors'显示)

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC ) )   
echo $row["id"] . " " . var_dump( sqlsrv_errors() ) . "<br>"; 

这是我避免这个问题的方式:

$params = array();
$options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
$result = sqlsrv_query($conn, $query, $params, $options);
for ($i = 0; $i < sqlsrv_num_rows($result); $i++) 
    $obj = sqlsrv_fetch_array($newq, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_ABSOLUTE, $i);
    echo $row[0]; 

我认为出现问题是因为它不知道如何处理出现的错误,因此退出循环。

This is the documentation that describes the issue

【讨论】:

请注意错误行(返回false而不是null,两者都会终止原始循环)仍然会丢失,它只是不会停止循环。

以上是关于PHP sqlsrv_fetch_array 只循环一半的结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP填充按钮onclick问题

SQLSRV 不获取所有行

从表中获取最后一个 ID 号

[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'user1' 无效

嵌套查询 - 内部查询循环结束外部查询循环

linux 安装多个PHP版本(php5.6 php7.1 php7.2 php7.3 php7.4 php8.0)nginx配置php多版本