2014-12-11 4 views
2

sysadmin이 PHP 서버를 5.2에서 5.5로 업그레이드하고 있습니다. 결과적으로 mssql 계열의 함수가 없어지고 코드를 업데이트해야합니다 (ODBC 함수 또는 sqlsrv 함수처럼 보입니다). 불행히도, 간단한 쿼리를 넘어선 어떤 것도 제대로 작동하지 않는 것으로 보입니다.PHP 5.5 (MS) SQL 서버 기능이 예상대로 작동하지 않습니다.

내가 (추가 중간 선이 유일한 변화) 아래 다음과 같은 두 가지 변종에 문제가있는 쿼리 중 하나 감소했습니다 내가 SQL 서버 Mangement 스튜디오에서 그들을 시도

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 

은 모두 잘 작동하고 한 행을 반환합니다. 내가 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 Standard Edition 9.00.1406.00, PHP 5.5.19 x86 스레드 안전성이 비활성화되었으며 Windows에서 실행 중입니다.

편집 : Rob Pharley의 제안에 따라 @@ OPTIONS가 문제를 재현하는 데있어 동일하거나 중요하지 않음을 확인했습니다.

+0

'SET NOCOUNT ON;'이 트릭을 수행했습니다! 답변에 의견을 말하면 현상금 –

+0

완료 - 답변이 맞는지 또는 다른 'SET NOCOUNT OFF'가 필요한지 확인하십시오. –

+0

예제 쿼리의 경우 다시 설정하지 않아도됩니다. 더 큰 결과 집합을 위해 그렇게해야 할 필요가 발견되면 후속 조치 의견을 드리겠습니다. –

답변

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 
2

사용하는 드라이버 (freetds?)에 따라 ANSI_NULLS (및 기타 ANSI 설정, 예 : QUOTED_IDENTIFIER)이 예상과 다르게 설정되어있을 수 있습니다. 이는 생성 등의 작업에 영향을 줄 수 있습니다 테이블. 이러한 값을 테스트하는 쿼리를 전달하면 문제를 찾을 수 있습니다.

+0

http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx에서 3.1 (미리보기)을 사용했습니다. 금요일에 업데이트가 있었고 이제 더 이상 미리보기가 표시되지 않습니다. 업데이트를 시도하겠습니다. 테스트를 위해 쿼리해야하는 값에 대한 포인터/참조를 제공 할 수 있습니까? –

+1

다음과 같이 설정하십시오. SET ARITHABORT ON SET CONCAT_NULL_YIELDS_NULL SET ANSI_NULLS ON SET ANSI_PADDING ON ANSI_WARNINGS 설정 ON NUMERIC_ROUNDABORT OFF –

+0

모든 @@ OPTIONS 비트를 검사했으며 SQL Server Managements Studio와 PHP의 sqlsrv 호출간에 동일합니다 (위의 설정과 일치합니다). 단, ARITHABORT는 PHP에서 제외됩니다. PHP 옵션을 SSMS (ON)로 설정해도 문제가있는 쿼리는 PHP에서 성공하지 못했습니다. SSMS 옵션을 PHP (OFF)로 설정해도 문제가있는 쿼리가 실패하지 않는 것은 SSMS입니다. –