我的系统管理员正在将我的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与复制问题相同或无关紧要。
答案 0 :(得分:2)
根据您正在使用的驱动程序(freetds?),您可能会发现ANSI_NULLS
(以及其他ANSI设置,例如QUOTED_IDENTIFIER
)的设置与预期的不同,会影响诸如表的创建之类的事情。尝试传入一个测试这些值的查询,你很可能会发现问题。
答案 1 :(得分:1)
问题是客户端框架被默认为每个语句返回的行计数混淆。当第一个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