2009-10-08 5 views
1

현재 PHP에서 SQL Server 2000 저장 프로 시저를 사용하고 있습니다. PHP 문서 다음에 나는 매개 변수의 값을 할당 한 다음 저장 프로 시저를 실행하기 위해 mssql_bind을 사용합니다.mssql_bind NULL로 변환하는 빈 문자열

문제는 내가 (저장 프로 시저가 호출 될 때이 NULL로 변환)

내가하지 말자

은 내부에있는 모든 매개 변수를 변환해야 할 매개 변수에 빈 문자열을 결합하는 저를 방지 this bug을 가지고 있다는 것입니다 저장 프로 시저 (Stored Procedures)는 NULL이 빈 문자열로 다시 변환되는지 확인합니다. 나는 빈 문자열뿐만 아니라 둘 다 자신의 의미를 가지고 NULL을 사용할 수 있기를 원한다.

누구든지 PHP에서이 문제를 해결할 수 있습니까? 버그가 수정되었거나 수정 될 경우 PHP 버그 웹 사이트가 명확하지 않습니다. PHP 5.2.11 (5.2 분기의 최신 버전)을 사용합니다.

답변

0

당신이 무엇을 제안하고 싶지 않아 가정하면, 옵션은

  1. 는 PHP의 CVS 스냅 샷을 다운로드하고 실행 가능한 경우를 설치, 그것은 고정되어 있는지입니다 왼쪽. 실행 가능하지 않거나 cvs를 통해 고정 된 경우 ...
  2. 저장 프로 시저를 사용하려면 system() 또는 exec() 호출을 사용하십시오. 너무 많은 번거 로움이 있다면 ...
  3. PHP 나 다른 스크립트 코드로 저장 프로 시저를 사용하지 마십시오.
  4. ''문자열에 대해 다른 값을 받아들이도록 저장 프로 시저를 변경하고 THAT를 ''문자열로 변환하십시오.
  5. 원하지 않는 일을하십시오. 가혹한 : P 그러나 나는 다른 방법을 보지 않는다.
0

bug #44325은 문제를 해결하기위한 패치를 제안했지만 문제가 ntwdblib.dll에 있고 php_mssql 확장 코드에없는 것 같은 정확한 해결책이 아닙니다.

는 닷컴 oplot에서 alexr에서 주석을 참조하십시오

미안 해요. 이 버그는 수정되지 않았습니다. 이 은 ntwdblib.dll의 버그입니다. 그리고 최신 업데이트 후 버그는 반환합니다.

빈 문자열을 바인드 할 때 저장된 프로 시저에 빈 문자열 대신 chr (0) char 이 수신되었습니다.

마지막 수정 사항을 롤백하십시오. 이 버그 버그는 복구 할 수 없습니다. 이 고려

, 나는 PHP 측 내가 Windows에서 PHP + MSSQL와 함께 일 :-(

마지막 시간에 할 수있는 많은 거기 확실하지 않다 나는 문제가 꽤 많이했다 실제로,이 몇 가지 매우 유사 같은 ;-(

은 어쩌면 가능한 솔루션은 당신을 위해,? 새로운 SQL Server Driver for PHP 드라이버로 전환 할 수 있습니다 ... 그는하지만, 윈도우에서 작동 참고

+0

예, 문제가 있습니다. Linux에서 PHP를 실행 중이므로 새 드라이버를 사용할 수 없습니다. 또한 Windows 구성 요소 인 ntwdblib.dll이 아닌가요? 그래서 PHP의 리눅스 버전에 영향을 미치지 않아야합니까, 아니면 제가 잘못 됐나요? – MaxiWheat

0

필자는 개인적으로 테스트 할 수있는 MSSQL 서버가 없지만 PDO 기능을 사용해 보았습니다. 직접 mssql의 tead?

PDOStatement->bindValue(mixed $parameter , mixed $value [, int $data_type ]) 

bindValue()

예, 내가 PDO는 래퍼입니다 만 아는 사람 일 수 있다는 것을 깨닫게! :)

+0

예, PDO가 있다는 것을 알고 있지만 Stored Proc에서 반환 할 수있는 여러 결과 집합을 지원하지 않습니다. – MaxiWheat

+0

너무 나빴어. :( –

0

해결 방법이 있습니다.

ADODB를 사용하고 있지만 (문제는 아님) mssql 드라이버 (adodb5 드라이버 폴더의 adodb-mssql.inc.php)를 해킹했습니다.

여기에 코드를 간단하게

if($var === ''){ 
     //stupid hack to prevent mssql driver from converting empty strings to null. now they arent empty strings but they will get trimmed down to legth 0 ;-) 
     $var = ' '; 
     $type = SQLVARCHAR; 
     $isNull = false; 
     $maxLen = 0; 
    } 

빈 문자열을 결합하려는 경우 확인하고 변경하는 경우는 비 비어있을 수 있습니다. 당신이 어떤 가치를 사용하는지는 중요하지 않습니다. 단지 공간을 사용합니다.

유형을 sqlvarchar로 지정하고 isnull을 false로 설정해야합니다. 이제 maxlen을 0으로 만들어 mssql 드라이버가 문자열을 빈 문자열로 트림합니다.

이러한 변수는 분명하지 않은 경우 mssql_bind 함수에 전달되어야합니다.