PHP ve SQL Ayrıştırma

3 Cevap php

Ben masa DDL sorguları bir dizi var ve ben yaratılan her tablonun adını almak istiyorsanız söyleyin. Iyi yaklaşım tablo adını ayıklamak için ne olurdu?

Yani, örneğin:

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

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

Bu sadece basitleştirilmiş bir durumda, ama ben tablo adı ayrıştırmak nasıl merak ediyorum. O "TABLO OLUŞTURMA" sonra gelir ne olduğunu varsaymak güvenli mi? Ben farkında olmalıdır özel durumlar var mı?

3 Cevap

MySQL DEĞİL dikkate almak zorunda kalacak foobar, BULUNMASI HALİNDE CREATE TABLE destekler. Aşağıdaki kod hile yapmak gerekir:

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

Eğer dizi kontrol eğer ...

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

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

Ya da bir 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];
    }
}

MySQL docs göre, bir CREATE TABLE aramanın temel şeklidir

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

Yani GEÇİCİ kelimenin olasılığı ve NOT BULUNMASI HALİNDE dize için hesap gerekir. Ben tablo adı herhangi komik karakterler (Ben o düşünceden konuda yanlış olabilir) içermesi durumunda kote geri kene olması için de mümkün olduğuna inanıyorum.

Burada bir regex bir ilk gitmek bulunuyor:

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