Nasıl bir MySQL veritabanı enum olası değerleri alabilirim?

8 Cevap php

Ben otomatik olarak DB numaralandırma olası değerleri ile benim dropdowns doldurmak istiyor. Bu MySQL mümkün mü?

8 Cevap

Senin için bir CodeIgniter sürümü var. Ayrıca değerlerden tırnak şeritler.

function get_enum_values( $table, $field )
{
    $type = $this->db->query( "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'" )->row( 0 )->Type;
    preg_match('/^enum\((.*)\)$/', $type, $matches);
    foreach( explode(',', $matches[1]) as $value )
    {
         $enum[] = trim( $value, "'" );
    }
    return $enum;
}

MySQL Reference

If you want to determine all possible values for an ENUM column, use SHOW COLUMNS FROM tbl_name LIKE enum_col and parse the ENUM definition in the Type column of the output.

Sen gibi bir şey isterim:

$sql = "SHOW COLUMNS FROM `table` LIKE 'column'";
$result = $db->query($sql);
$row = $result->fetchRow();
$type = $row['Type'];
preg_match('/enum\((.*)\)$/', $type, $matches);
$vals = explode(',', $matches[1]);

Bu size aktardığı değerler verecektir. MySQL zaman tek tırnak içinde bu döner. Değer tek bir alıntı, bir tek alıntı ile kaçtı. Muhtemelen güvenle dizi elemanların her trim($val, "'") arayabilirsiniz. Sen '' sadece ' içine covnert isteyeceksiniz.

Böyle değerleri alabilirsiniz:

SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename' 
    AND TABLE_NAME='tablename'
    AND COLUMN_NAME='columnname'"

Oradan bir diziye dönüştürmek gerekir:

  • eval, doğrudan bir diziye sen (MySQL tek tırnak kaçış uyumsuz olabilir ancak) tembel, ya da eğer
  • $ Options_array = str_getcsv ($ seçenekler, ',', "'"), muhtemelen (eğer açılış ve kapanış parantez atlamak için altdizesine değiştirmez ise) çalışmak, ya da olur
  • Düzenli ifade

Bir CSV (Virgülle Ayrılmış Değer) dize oldu sanki Sen dizeyi ayrıştırmak. PHP bir dizi için bir CSV dize dönüştürür str_getcsv denilen büyük bir yap-işlevi vardır.

// This is an example to test with
$enum_or_set = "'blond','brunette','redhead'";

// Here is the parser
$options = str_getcsv($enum_or_set, ',', "'");

// Output the value
print_r($options);

Bu size aşağıdaki benzer bir şey vermelidir:

Array
(
    [0] => blond
    [1] => brunette
    [2] => redhead
)

Bu yöntem aynı zamanda size dizeleri tek tırnak (iki tek tırnak kullanımı fark) olmasını sağlar:

$enum_or_set = "'blond','brunette','red''head'";

Array
(
    [0] => blond
    [1] => brunette
    [2] => red'head
)

For more information on the str_getcsv function, check the PHP manual: http://uk.php.net/manual/en/function.str-getcsv.php

Bu Chris Komlenic en biridir 8 Reasons Why MySQL's ENUM Data Type Is Evil:

 4. Getting a list of distinct ENUM members is a pain.

Çok yaygın bir ihtiyaç, bir seçme-kutusunu doldurmak veya veritabanından olası değerleri ile liste açılır etmektir. Bu gibi:

Select color:

[ select box ]

Bu değerler 'renkler' adlı bir referans tabloda depolanan iseniz, ihtiyacınız olan: SELECT * FROM colors ... sonra da dinamik aşağı açılır listeyi oluşturmak için dışarı ayrıştırılır edilebilir. Ekleyebilir veya referans tablosundaki renkleri değiştirmek ve seksi sipariş formları otomatik olarak güncellenir olabilir. Başar.

Şimdi kötü ENUM düşünün: nasıl üye listesini ayıklamak? DISTINCT değerler için tablo ENUM sütunu sorgu olabilir ama bu sadece zorunlu olarak, tüm olası değerleri aslında used and present in the table değerler değil dönecektir. Sen ınformatıon_schema sorgulamak ve bir betik dili ile sorgu sonucu onları ayrıştırmak, ama gereksiz yere karmaşık olabilir. Aslında, ben bir ENUM sütunun üye listesini ayıklamak için herhangi zarif, tamamen SQL yol bilmiyorum.

Bu deneyin

describe table columnname

sana o tabloda o sütun hakkında tüm bilgileri verir;

Ben sadece böyle sorgularken jasonbar, ne diyor eklemek istediğiniz:

SHOW columns FROM table

Eğer bir dizi olarak sonuç dışarı alırsanız bu gibi görünecektir:

array([0],[Field],[1],[Type],[2],[Null],[3],[Key],[4],[Default],[5],[Extra])

Where [n] and [text] give the same value.
Not really told in any documentation I have found. Simply good to know what else is there.

Daha bunu yapmanın tarihi bir yol kadar, bu benim için çalıştı:

function enum_to_array($table, $field) {    
    $query = "SHOW FIELDS FROM `{$table}` LIKE '{$field}'";
    $result = $db->query($sql);
    $row = $result->fetchRow();
    preg_match('#^enum\((.*?)\)$#ism', $row['Type'], $matches);
    $enum = str_getcsv($matches[1], ",", "'");
    return $enum;
}

Sonuçta, enum değerler ") (enum" ayrılan zaman sadece bir CSV dize, bu nedenle gibi ayrıştırmak!