我的系统管理员正在将我的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