2009-03-31 2 views
0

MySQL 쿼리를 가져 와서 각 테이블 이름 앞에 문자열을 삽입해야합니다. 솔루션은 한 줄 일 필요는 없지만 분명히 정규식 문제입니다. 그것은 PHP에서 구현되므로 프로그래밍 로직도 괜찮습니다.RegEx : MySQL 쿼리에서 각 테이블 앞에 문자열 삽입

이유 및 배경 : 테이블 접두사 (예 : 'users'대신 'nx_users')를 허용하도록 코드베이스를 수정하고 있습니다. 따라서 저를 위해 자동화하는 기능을 갖춰야합니다. 모든 쿼리를 찾아서 수동으로 수정할 필요가 없습니다.

예 :

SELECT * FROM users, teams WHERE users.team_id = teams.team_id ORDER BY users.last_name 

접두사 'nx_'을 사용하여, 그것은 분명히 같은 테이블 별칭 같은 다른 사건을 처리해야

SELECT * FROM nx_users, nx_ teams WHERE nx_ users.team_id = nx_ teams.team_id ORDER BY nx_ users.last_name 

로 변경해야합니다, 조인 및 기타 일반적인 MySQL은 명령.

아무도이 작업을 수행하지 않았습니까?

답변

3

여기서 말하는 코드베이스의 크기는 어느 정도입니까? 이와 같은 것을위한 정규 표현식은 재앙으로 심각하게 유혹하고 있으며 나는 여러분이 아마 mysql_query이나 코드에서 무엇을 찾고 스스로 변경하는 것이 더 나을 것이라고 생각합니다. 정규 표현식을 구현하고 의심 할 여지없이 놓칠 ​​수있는 모든 경우를 수정하는 데 소요되는 시간을 넘지 않아야합니다.

+0

나는 보통 동의 하겠지만 실제로는 그렇게되는대로 실행되는 솔루션을 의미합니다. 그것은 다른 개발자들이 잘 쓸 웹 애플 리케이션의 일부입니다. 이 기능을 안정적으로 사용할 수 있다면 장기적으로 나에게 더 좋습니다. – Paulo

+0

+1. SQL을 파싱 할 권한이없는 regex에서 특히 * 신뢰할 수있는 * 것을 사용할 수 없습니다. 일부 언어/플랫폼에서는 적절한 SQL 구문 분석기를 사용할 수 있지만 여전히 위험한 제안입니다. – bobince

0

먼저 정규 표현식만으로는 작업을 수행 할 수 없습니다. 같은 것들을 고려해

select sender from email where subject like "from users group by email" 

당신의 SQL 구문을 분석 수정할 수 구문 분석 트리를 생산 한 다음 수정 된 구문 분석 트리에서 수정 된 SQL을 방출 할 뭔가가 필요이 정말 작업을 수행합니다. 그걸로 할 수는 있지만 권장하지는 않습니다 (파올로가 준 이유로).

더 나은 방법은 테이블 이름, SQL을 보내기 위해 사용하는 함수, 단어 등을 스크립트를 통해 찾아서 편집자에게 던지기 위해 소스를 통해 grep하는 것입니다.

2

코드를 다시 작성하기 위해 정규식을 사용하는 것은 문제가 될 것입니다.

이 문자열을 동적으로 변경해야하는 경우 SQL 논리를 한 곳으로 분리하고 모든 SQL 쿼리에 적절히 배치되는 $ table_prefix 변수가 있어야합니다. 변수는 호출 코드에 의해 설정 될 수 있습니다.

$query = "SELECT foo from " . $table_prefix . "bar WHERE 1"; 

클래스에서 캡슐화하는 경우 더 좋습니다.

이 예는 탈출이나 보안 문제를 고려하지 않았습니다.

+0

+1 그래, 이것 역시 내가 제안하려고했던 것이다. –

관련 문제