2011-06-19 8 views
2

SQLの 'CREATE'クエリから列名を取得したいとします。文字列照合

問合せ:

CREATE TABLE 'test' (
'col1' INT(10) NOT NULL , 
'col2' VARCHAR(50) NOT NULL , 
'col3' DATE NOT NULL 
) ENGINE = MYISAM ; 

コード:

preg_match_all("/'(.+)' (\w+)\(? ?(\d*) ?\)?/", $sql, $_matches, PREG_SET_ORDER); 

出力:

Array ( 
[0] => Array ([0] => 'col1\' INT(10) [1] => col1\ [2] => INT [3] => 10) 
[1] => Array ([0] => 'col2\' VARCHAR(50) [1] => col2\ [2] => VARCHAR [3] => 50) 
[2] => Array ([0] => 'col3\' DATE [1] => col3\ [2] => DATE [3] =>) 
) 

しかし、私はトンのような単純な結果を必要とします彼:

array(
    array('INT(10)', 'col1'), 
    array('VARCHAR(50)', 'col2'), 
    array('DATE', 'col3') 
); 

すべての可能な解決策があります。おかげ

+0

-ve票も歓迎されている。.. – Awan

+0

関連回答:[フェッチする方法列'MySQLのテーブルを作成する'クエリ文字列の名前?](http://stackoverflow.com/questions/5590928/how-to-fetch-column-names-from-mysql-create-table-query-string/5591342#5591342) – hakre

+0

は問題のようですh 'addslashes()'または 'magic_quotes'(' preg_match_all'の前) – knittl

答えて

2
$sql = <<<SQL 
     CREATE TABLE 'test' (
     'col1' INT(10) NOT NULL , 
     'col2' VARCHAR(50) NOT NULL , 
     'col3' DATE NOT NULL 
     ) ENGINE = MYISAM ; 
SQL; 

preg_match_all("/'(.+)' (\w+(?:\(?\d* ?\))?)/", $sql, $matches, PREG_SET_ORDER); 

$matches = array_map(function($array) { 
    return array($array[2], $array[1]); 
}, $matches); 

var_dump($matches); 

前の回答から既存のクエリを再使用して

array(3) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(9) "INT(10)" 
    [1]=> 
    string(4) "col1" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(13) "VARCHAR(50)" 
    [1]=> 
    string(4) "col2" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(4) "DATE" 
    [1]=> 
    string(4) "col3" 
    } 
} 
2

出力:

preg_match_all("/'(.+)' ((\w+)\(? ?(\d*) ?\)?)/", $sql, $_matches, PREG_SET_ORDER); 

$matches = array_map(function($v) {return array(trim($v[2]), $v[1]);}, $_matches); 
関連する問題