2009-07-02 3 views
1

테이블 DDL 쿼리의 배열이 있다고 가정 해 봅시다. 만들고있는 각 테이블의 이름을 가져 오려고합니다. 테이블 이름을 추출하는 최선의 방법은 무엇입니까? 그래서 예를 들면PHP와 SQL 구문 분석

:

$ddl = array(
    'CREATE TABLE tableOne ...', 
    'CREATE TABLE tableTwo ...', 
    'CREATE TABLE tableThree ...' 
); 

foreach($ddl as $tableDef) { 
    $tableName = [???]; 
    echo $tableName; 
} 
단지 단순화 된 사건

,하지만 난 테이블 이름을 구문 분석하는 방법을 궁금하네요. "CREATE TABLE"다음에 오는 것이 무엇이든간에 가정하는 것이 안전한가요? 내가 알아야 할 특별한 경우가 있습니까?

답변

2

존재하지 않는 foobar, 당신이 고려해야 할 것입니다. 다음 코드는 트릭을 수행해야합니다.

foreach ($ddl as $tableDef) { 
    if (preg_match("/^CREATE\s+(?:TEMPORARY\s+)?TABLE\s+(?:IF NOT EXISTS\s+)?([^\s]+)/i", $tableDef, $matches)) { 
     $tableName = $matches[1]; 
    } 
} 
0

MySQL docs에 따르면, CREATE TABLE 호출의 기본 형태는

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
    (create_definition,...) 
    [table_options] 
    [partition_options] 

그래서 임시 단어의 가능성 및 NOT이있는 경우 문자열을 설명해야한다. 나는 그것이 재미있는 문자를 포함하고있는 경우에 대비하여 테이블 이름이 역 따옴표로 인용 될 수도 있다고 생각한다.

/CREATE\s+(TEMPORARY\s+)*TABLE\s+(IF NOT EXISTS\s+)*(.*?)\s+/gi 
1

당신이 배열을 제어하면 ...

$ddl = array(
    'tableOne' => 'CREATE TABLE tableOne ...', 
    'tableTwo' => 'CREATE TABLE tableTwo ...', 
    'tableThree' => 'CREATE TABLE tableThree ...' 
); 

foreach ($ddl as $tablename => $sql) { ... } 

또는 정규식 : 여기

는 정규식에서 첫 번째 이동의

MySQL이 경우 CREATE TABLE을 지원
foreach ($ddl as $sql) { 
    if (preg_match('/CREATE(\s+|\s+TEMPORARY\s+).*\s+TABLE(\s+|\s+IF NOT EXISTS\s+)(\w[\w\d_]*)\s/imU', $sql, $match)) { 
     echo $match[3]; 
    } 
}