2009-09-08 2 views
1

거의 모든 특정 데이터베이스 함수를 추상화하는 명령 클래스가 있습니다 (ODBC 및 원시 mssql 라이브러리를 사용하는 Mssql 2005, MySQL 및 Oracle에서 실행되는 응용 프로그램과 똑같습니다). 우리의 문제는 실행될 때, 각각의 값으로 모든 자리를 대체 방법을 준비하지만 문제는 그 다음 사용하고 있다는 것입니다.에 대한준비된 문에 대한 Preg_replace 솔루션

if(is_array($Parameter['Value'])) 
{ 
    $Statement = str_ireplace(':'.$Name, implode(', ', $this->Adapter->QuoteValue($Parameter['Value'])), $Statement); 
} 
else 
{ 
    $Statement = str_ireplace(':'.$Name, $this->Adapter->QuoteValue($Parameter['Value']), $Statement); 
} 
우리는 두 메르 유사한 매개 변수의 이름이 때 문제가 발생

, 예 : session_browser 및 session_browse_version ... 첫 번째 부분은 마지막 부분을 부분적으로 대체합니다.

물론 우리는 특정 순서 내에서 매개 변수를 지정하는 방법을 배웠지 만 이제는 "자유"시간이 있기 때문에 더 좋게 만들고 싶습니다. 그래서 preg_replace ...로 전환하려고 생각하고 있습니다. 좋지 않습니다. 정규식, 누구든지 ': parameter_name`과 같은 문자열을 대체하는 정규식에 대한 도움을 줄 수 있습니까?

최고 감사합니다, 브루노 B B 갈하 에스

답변

2

실수로 긴 매개 변수 이름에서 짧은 매개 변수 이름과 일치하지 않도록 당신의 \bmetacharacter 단어에 맞게 경계를 사용해야합니다.

preg_replace("/:$Name\b/", 
    implode(",", $this->Adapter->QuoteValue((array) $Parameter['Value'])), 
    $Statement); 

참고 그러나 때 식별자이 거짓 긍정적 인 일치를 만들 수 : 당신은 하나 개의 항목의 배열에 스칼라 값을 강요하는 경우

또한, 특별한 경우의 배열 할 필요가 없습니다 식별자를 인용 문자열 리터럴 이스케이프 따옴표를 포함 할 때

SELECT * FROM ":Name"; 

SELECT * FROM Table WHERE column = ':Name'; 

이 더욱 복잡해진다 : 또는 리터럴 문자열 매개 변수 자리처럼 보이는 패턴이 포함되어 있습니다.

SELECT * FROM Table WHERE column = 'word\':Name'; 

당신은 당신이 보안이나 성능에 대한 준비된 명령문의 혜택을 물리 치고 있기 때문에 동안 준비 SQL 문자열에 변수를 보간 재고 할 수 있습니다.

모든 RDBMS 백엔드가 명명 된 매개 변수를 지원하지 않으며 SQL 매개 변수를 IN() 술어의 값 목록에 사용할 수 없기 때문에 내가하는 일을 왜하는지 이해합니다. 그러나 당신은 굉장히 새는 추상화를 만들고 있습니다.

+0

당신은 나를 길게 잃어 버렸지 만 약간의 연구와 구글, 당신은 이해합니다 :) – Val