2017-11-24 2 views
0

PHP 5.3에 pdo_sqlsrv 확장명과 MSSQL2008 데이터베이스가 있습니다. 다음 코드는 준비된 명령문을 사용하여 테이블에서 데이터를 검색합니다. 모든 것이 정상적으로 작동합니다. 그러나 SQL 서버 프로파일에서 여러 번 명령문을 반복하면 준비된 명령문을 다시 사용할 수 없다는 것을 알 수 있습니다. 모든 SQL 요청에서 명령.이 다시 준비됩니다.MSSQL이있는 PHP PDO가 준비된 문을 다시 사용하지 않습니다.

$this->statement = $connection->prepare("SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = :textType;"); 
    $this->statement->bindValue(":textType", "URL"); 
    $this->statement->execute(); 
    $data = $this->statement->fetchAll(PDO::FETCH_ASSOC) or array(); 
    $this->statement->closeCursor(); 


    $this->statement->bindValue(":textType", "SYSTEM"); 
    $this->statement->execute(); 
    $data = $this->statement->fetchAll(PDO::FETCH_ASSOC) or array(); 
    $this->statement->closeCursor(); 

이 동작은 변수 $ stringType의 문자열 길이가 다를 수 있습니다. 프로파일 러 목록에서 볼 수 있듯이 동일한 입력문이 다른 입력 매개 변수 데이터 유형 (nvarchar (6) 및 nvarchar (3))으로 두 번 준비됩니다. 그 데이터 요청

SQL 서버 프로파일 로그 항목 :

declare @p1 int 
set @p1=2 
exec sp_prepexec @p1 output,N'@P1 nvarchar(3)',N'SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = @P1;',N'URL' 
select @p1 

declare @p1 int 
set @p1=3 
exec sp_prepexec @p1 output,N'@P1 nvarchar(6)',N'SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = @P1;',N'SYSTEM' 
select @p1 

입력 문자열 데이터가 항상 같은 길이 인 경우, 문은 SQL 서버에 의해 재사용된다. 그러나 그것은 거의 드문 경우입니다 ...

SQL 서버가 이미 준비된 문장을 재사용하지 않는 이유를 아는 사람이 있습니까? 또는 @ P1을 적절한 데이터 형식 (예 : nvarchar (40)) (TextType 열 정의와 동일)으로 조작하는 방법은 무엇입니까?

제가 놓친 드라이버 관련 옵션이있을 수 있습니까?

+0

PDO 속성'PDO :: ATTR_EMULATE_PREPARES'을 false로 설정할 수 있습니다. – Sammitch

+0

문을 준비하기 전에 속성을 설정하려고했습니다 : '$ connection-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, false); ' 결과를 변경하지 않았습니다. 중요한 것은 매개 변수 문자열 길이가 정확히 같을 때만 작동한다는 것입니다. 그렇지 않으면 @ P1의 다른 매개 변수 길이로 인해 새로운 prepared statement를 생성합니다. – Tom

답변

0

bindValue() 대신 bindParam()을 시도 했습니까? 어쩌면 당신은 그것을 시도 할 수 있습니다.

+0

예 bindParam과 세 번째 매개 변수 PDO :: PARAM_STR로 이미 시도했습니다. SQL 서버의 결과는 같습니다. – Tom

관련 문제