PHP5.5的(MS)SQL server功能未按预期工作

PHP5.5的(MS)SQL server功能未按预期工作,php,sql-server,odbc,php-5.5,Php,Sql Server,Odbc,Php 5.5,我的系统管理员正在将我的PHP服务器从5.2升级到5.5。结果,mssql函数族消失了,我必须更新代码,似乎是odbc函数还是sqlsrv函数。不幸的是,除了简单的查询之外,这两种方法似乎都不能正常工作 我已将其中一个有问题的查询缩减为以下两个变体,添加的中间行是唯一的更改: 如果对象_ID'tempdb..i'不为NULL,则开始删除表i结束 选择“值”作为测试 如果对象_ID'tempdb..i'不为NULL,则开始删除表i结束 创建表i id INT主键插入i SELECT 405782

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

我已将其中一个有问题的查询缩减为以下两个变体,添加的中间行是唯一的更改:

如果对象_ID'tempdb..i'不为NULL,则开始删除表i结束 选择“值”作为测试 如果对象_ID'tempdb..i'不为NULL,则开始删除表i结束 创建表i id INT主键插入i SELECT 405782 选择“值”作为测试 当我在SQLServerManagementStudio中尝试它们时,两者都可以正常工作并返回一行。当我尝试PHP中的第一个时,它运行良好并返回一行。但是,当我尝试从PHP执行第二个查询时,我得到了一个意外的结果:

$SQL_query='********'//第二个问题 $serverName='***********'; $connectionInfo=数组数据库=>****,UID=>*******,PWD=>*******; $conn=sqlsrv\u connect$serverName,$connectionInfo; $msg1=sqlsrv\u errorsSQLSRV\u ERR\u ALL;// 如果$conn{//truthy $result=sqlsrv\u query$conn,$SQL\u query; 如果sqlsrv_有_行$result{$rows='true';}其他{$rows='false';}//false $msg2=sqlsrv\u errorsSQLSRV\u ERR\u ALL;// $row=sqlsrv\u fetch\u数组$result,sqlsrv\u fetch\u NUMERIC//false } odbc函数更糟糕,如果查询包含SET@var语句,就会阻塞

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

有人能解释一下吗?您可能认为,如果这些函数可以处理的查询范围受到某种限制,那么至少在这些函数的PHP文档中会提到它

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


编辑:根据Rob Farley的建议,我已经确认@选项对于重现问题是相同的或无关紧要的。

根据您使用的freetds?驱动程序的不同,您可能会发现ANSI_NULLS和其他ANSI设置(如引号标识符)的设置与预期的不同,这会影响一些事情,比如创建表。尝试传入一个测试这些值的查询,您很可能会发现问题所在。

问题在于,客户机框架被默认情况下为每条语句返回的行数所迷惑。当第一次插入时,它返回一个行计数1,使它看起来好像这是一个返回结果的语句,而事实并非如此-行计数甚至可能会因为结果本身而混淆。PHP并不是唯一受此困扰的技术;jTDS是另一个在jTDS中有问题的驱动程序,它需要行计数。SET NOCOUNT ON(设置为NOCOUNT ON)将抑制此额外信息:

不计较 如果对象_ID'tempdb..i'不为NULL,则开始删除表i结束 创建表i id INT主键 插入i选择405782 选择“值”作为测试
我使用了来自的3.1预览版。现在有一个更新在周五,它不再说预览,我会尝试更新它。您可以提供任何指针/引用来说明我应该查询哪些值以进行测试吗?这些:SET CONCAT上的SET ARITHABORT\u NULL\u在SET QUOTED上的产量\u NULL\u在SET ANSI上的标识符\u在SET ANSI上的NULL\u在SET ANSI上的PADDING在SET ANSI上\u在SET NUMERIC上的警告\u ROUNDABORT OFFI检查了所有@选项位,并且它们在SQL Server Managements studio之间是相同的,以及来自PHP的sqlsrv调用,并与上面的设置相匹配,但ARITHABORT对PHP关闭的情况除外。将PHP选项设置为上的SSMS选项不会导致有问题的查询在PHP中成功。将SSMS选项设置为PHP OFF并不会导致有问题的查询失败;我成功了!如果你把你的评论变成一个答案,我会给你赏金-现在请检查答案,看看它是否正确,或者是否需要另一个设置NOCOUNT OFF。对于我的示例查询,我不需要将其设置为back OFF。如果我发现需要对较大的结果集执行此操作,我将给出后续注释。如果此特定查询在set NOCOUNT ON的情况下始终运行,则代码很可能无法处理多语句批处理上的行数,因此需要NOCOUNT ON INTERVICE。唯一的例外是,如果您实际在某处使用了rowcount,当然是在sqlserv_num_行中。