PHP 5.5 (MS) SQL 服务器功能无法按预期工作


PHP 5.5's (MS) SQL server functions not working as expected

我的系统管理员正在将我的PHP服务器从5.2升级到5.5。结果,mssql 系列函数消失了,我必须更新我的代码(似乎是 odbc 函数或 sqlsrv 函数(。不幸的是,除了简单的查询之外,似乎两者都无法正常工作。

我将其中一个有问题的查询减少到以下两个变体(添加的中间行是唯一的更改(:

IF OBJECT_ID('tempdb..#i') IS NOT NULL BEGIN DROP TABLE #i END
SELECT 'value' as test
IF OBJECT_ID('tempdb..#i') IS NOT NULL BEGIN DROP TABLE #i END
CREATE TABLE #i (id INT primary key) INSERT INTO #i SELECT 405782
SELECT 'value' as test

当我在SQL Server Mangement Studio中尝试它们时,两者都工作正常并返回一行。当我尝试 PHP 的第一个时,它工作正常并返回一行。但是,当我尝试从 PHP 执行第二个查询时,我得到了一个意外的结果:

$SQL_query= '********'; //Second query
$serverName = '**********';
$connectionInfo = array( "Database"=>"*****","UID"=>"********","PWD"=>"*********");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
$msg1=sqlsrv_errors(SQLSRV_ERR_ALL); // ""
if($conn){ //truthy
  $result=sqlsrv_query($conn,$SQL_query);
  if(sqlsrv_has_rows ($result)){$rows='true';}else{$rows='false';} //false
  $msg2=sqlsrv_errors(SQLSRV_ERR_ALL); // ""
  $row=sqlsrv_fetch_array($result,SQLSRV_FETCH_NUMERIC) //false
}

(odbc 函数更糟糕,如果查询包含 SET @var 语句,则会窒息......

因此,查询的结果不正确,但未报告任何错误。

谁能解释一下?你会认为,如果这些函数可以处理的查询范围在某种程度上受到限制,那么至少会在这些函数的 PHP 文档中顺便提到它。

供参考:Microsoft SQL Server 标准版 9.00.1406.00,PHP 5.5.19 x86 线程安全禁用,在 Windows 上运行。

编辑:根据Rob Farley的建议,我已经确认这些@@OPTIONS要么相同,要么对重现问题无关紧要。

根据您使用的驱动程序(freetds?(,您可能会发现ANSI_NULLS(以及其他 ANSI 设置,例如 QUOTED_IDENTIFIER (的设置与预期不同,这可能会影响表的创建等内容。尝试传入测试这些值的查询,您很可能会发现问题。

问题是客户端框架对每个语句默认返回的行计数感到困惑。当第一个INSERT发生时,它返回的行计数为 1,使其看起来好像这是一个返回结果的语句,但事实并非如此 - 行计数甚至可能与结果本身混淆。PHP并不是唯一受此困扰的技术;jTDS是另一个有问题的驱动程序(在jTDS的情况下,它需要行计数(。 SET NOCOUNT ON禁止显示以下额外信息:

SET NOCOUNT ON
IF OBJECT_ID('tempdb..#i') IS NOT NULL BEGIN DROP TABLE #i END
CREATE TABLE #i (id INT primary key)
INSERT INTO #i SELECT 405782
SELECT 'value' as test