PHP sqlsrv_fetch_array仅循环遍历一半结果

时间:2018-09-05 15:25:57

标签: php sql sqlsrv

当循环遍历(60行)结果集时,PHP仅循环遍历一些结果。如果我不对结果排序,则返回四。如果按其ID对结果进行排序,它将返回31个结果。我相信这可能与每一行中数据的大小有关,但我不确定。我从中选择的视图有50列,其中约四分之一是HTML代码,我相信这些列的数据类型为varchar(max)。我正在使用以下规范和代码。
Microsoft SQL SERVER 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()会返回错误

array(1) { [0]=> array(6) { [0]=> string(5) "01004" ["SQLSTATE"]=> string(5) "01004" [1]=> int(0) ["code"]=> int(0) [2]=> string(71) "[Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation" ["message"]=> string(71) "[Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation" } }

1 个答案:

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