PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题
Posted
技术标签:
【中文标题】PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题【英文标题】:PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows serious problem 【发布时间】:2009-11-23 15:18:17 【问题描述】:我的申请有严重问题。
当我在我的 SQL Server 数据库中选择“CTE”,然后我使用 sqlsrv_num_rows 来计算结果对象中的行数时,我得到了奇怪的结果:-1。
这个值甚至在手册中都没有(链接:http://msdn.microsoft.com/en-us/library/ee376931(SQL.90).aspx)。
示例代码:
例如,W 已选择“CTE - 公用表表达式”:
$sql = ";WITH unsorted_cte AS
(
SELECT
*
FROM
xxx
WHERE
yyy
)
SELECT
u_cte.*
FROM
[unsorted_cte] u_cte
ORDER BY
u_cte.[zzzz] ASC";
在 sql 控制台中,@@rowcount 具有正确的值,但是当我们在 php 脚本中使用此选择时,它返回 -1。
样本:
// make query with proper coursor
$result = sqlsrv_query($link, $sql, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET));
// var dump shows us proper resource
var_dump($result):
resource(3) of type (SQL Server Statement)
// sqlsrv_num_rows show us wrong rows count
var_dump(sqlsrv_num_rows($result));
int(-1)
// sqlsrv_errors are empty
var_dump(sqlsrv_errors());
NULL
我尝试在整个 coursors http://msdn.microsoft.com/en-us/library/ee376927(SQL.90).aspx 和 Selecting Rows 参数中修复它,但我无法修复它。
顺便说一句。在我的情况下,唯一有效的选择行是 SQLSRV_CURSOR_FORWARD。
我的环境: PHP 5.3 微软 SQL 2005 视窗服务器 适用于 PHP 1.1 的 SQL Server 驱动程序 (msdn dot microsoft dot com/en-us/library/ee229551(SQL.10).aspx) 数据库编码:unicode
我希望,某人知道这个问题的解决方案。
【问题讨论】:
使用给定的工具格式化您的问题将使别人更容易帮助您。使用看起来像二进制字符串的按钮将代码格式化为代码。 【参考方案1】:这里描述的问题是暴露了构建 sqlsrv 驱动程序的 ODBC 驱动程序中的一个错误。 ODBC 驱动程序对以 WITH 开头的 SQL 查询进行某种级别的解析,然后它会错误地处理这些查询。解决方法是将查询作为存储过程执行,这会更改 ODBC 驱动程序执行的代码路径。
SQL Server Native Client 团队(SNAC 是 Microsoft 的 ODBC 实现)已意识到此错误。我会确保他们知道这个错误造成的影响。
谢谢。
布莱恩·斯旺,微软
【讨论】:
以上是关于PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题的主要内容,如果未能解决你的问题,请参考以下文章
Win 10 + IIS + PHP v7.1.7 + SQL Server 2008 R2如何让SQL Server连接正常工作?