2009-07-02 54 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

MySQL支持CREATE TABLE IF不存在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] 

所以你需要考慮單詞TEMPORARY的可能性,IF NOT EXISTS的字符串。我相信也可以將表名引用回去以防萬一它包含任何有趣的字符(儘管我可能會錯誤)。

這裏是在正則表達式第一去:

/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) { ... } 

或者正則表達式:

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]; 
    } 
}