2009-07-02 9 views
1

Disons que j'ai un tableau de requêtes DDL de table et que je veux obtenir le nom de chaque table en cours de création. Quelle serait la meilleure approche pour extraire le nom de la table?Analyse PHP et SQL

Ainsi, par exemple:

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

foreach($ddl as $tableDef) { 
    $tableName = [???]; 
    echo $tableName; 
} 

C'est juste un cas simplifié, mais je me demande comment j'analyser le nom de la table. Est-il sûr de supposer que c'est ce qui vient après "CREATE TABLE"? Y a-t-il des cas particuliers dont je devrais être au courant?

Répondre

2

MySQL prend en charge CREATE TABLE IF N'EXISTE pas foobar, que tu devras prendre en compte. Le code suivant devrait faire l'affaire:

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

Selon le MySQL docs, la forme de base d'un appel CREATE TABLE est

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

vous aurez donc besoin de prendre en compte la possibilité du mot TEMPORAIRE et la chaîne SINON EXISTE. Je crois qu'il est également possible que le nom de la table soit en arrière-tick cité au cas où il contient des caractères amusants (je peux me tromper à ce sujet si).

est ici un premier rendez-vous à une regex:

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

Si vous contrôlez le tableau ...

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

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

Ou un regex:

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