Saya ingin mengisi dropdown saya dengan enum kemungkinan nilai dari DB secara otomatis. Apakah ini mungkin di MySQL?
96
Saya memiliki versi codeigniter untuk Anda. Itu juga menghapus kutipan dari nilai.
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);
$enum = explode("','", $matches[1]);
return $enum;
}
Anda bisa mendapatkan nilai dengan menanyakannya seperti ini:
Dari sana Anda harus mengubahnya menjadi array:
sumber
Referensi MySQL
Anda menginginkan sesuatu seperti:
Ini akan memberi Anda nilai yang dikutip. MySQL selalu mengembalikan ini dalam tanda kutip tunggal. Kutipan tunggal dalam nilai dipisahkan oleh kutipan tunggal. Anda mungkin dapat memanggil
trim($val, "'")
setiap elemen array dengan aman. Anda pasti ingin mengubahnya''
menjadi file'
.Berikut ini akan mengembalikan item array $ trimmedvals tanpa tanda kutip:
sumber
Ini seperti banyak hal di atas, tetapi memberi Anda hasil tanpa loop, DAN membuat Anda benar-benar diinginkan: array sederhana untuk menghasilkan opsi pilih.
BONUS: Ini berfungsi untuk SET serta jenis bidang ENUM.
$ option_array: Array ([0] => red [1] => green [2] => blue)
sumber
Ini adalah salah satu dari 8 Alasan Chris Komlenic Mengapa Tipe Data ENUM MySQL Itu Jahat :
sumber
Anda dapat mengurai string tersebut seolah-olah itu adalah string CSV (Comma Separated Value). PHP memiliki fungsi built-in yang disebut str_getcsv yang mengubah string CSV menjadi array.
Ini akan memberi Anda sesuatu yang mirip dengan berikut ini:
Metode ini juga memungkinkan Anda untuk memiliki tanda kutip tunggal di string Anda (perhatikan penggunaan dua tanda kutip tunggal):
Untuk informasi lebih lanjut tentang fungsi str_getcsv, periksa manual PHP: http://uk.php.net/manual/en/function.str-getcsv.php
sumber
str_getcsv
hanya berfungsi di PHP 5> = 5.3.0, Anda dapat menyertakan file ini jika Anda ingin mendapatkan fungsionalitas ini di versi sebelumnya.Cara yang lebih mutakhir untuk melakukannya, ini berhasil untuk saya:
Pada akhirnya, nilai enum saat dipisahkan dari "enum ()" hanyalah string CSV, jadi uraikan seperti itu!
sumber
di sini untuk mysqli
sumber
Berikut adalah fungsi yang sama yang diberikan oleh Patrick Savalle yang diadaptasi untuk kerangka kerja Laravel
sumber
Untuk Laravel ini berhasil:
Keluaran:
sumber
Saya hanya ingin menambahkan apa yang dikatakan jasonbar , saat menanyakan seperti:
Jika Anda mendapatkan hasilnya sebagai array, akan terlihat seperti ini:
Dimana [n] dan [teks] memberikan nilai yang sama.
Tidak benar-benar diceritakan dalam dokumentasi yang saya temukan. Cukup baik untuk mengetahui apa lagi yang ada di sana.
sumber
sumber
coba ini
memberi Anda semua informasi tentang kolom itu di tabel itu;
sumber
Versi adaptasi Codeigniter sebagai metode dari beberapa model:
Hasil:
sumber
Kalian semua menggunakan beberapa pola regex yang aneh dan kompleks x)
Inilah solusi saya tanpa preg_match:
sumber
Anda dapat menggunakan sintaks ini untuk mendapatkan kemungkinan nilai enum di MySQL QUERY:
dan Anda mendapatkan nilai, contoh: enum ('Pria', 'Wanita')
ini adalah contoh sytax php:
sumber
Masalah dengan setiap jawaban lain di utas ini adalah tidak satupun dari mereka yang mengurai dengan benar semua kasus khusus dari string dalam enum.
Karakter kasus khusus terbesar yang membuat saya berputar-putar adalah tanda kutip tunggal, karena mereka dikodekan sendiri sebagai 2 tanda kutip tunggal bersama-sama! Jadi, misalnya, enum dengan nilai
'a'
dikodekan sebagaienum('''a''')
. Mengerikan, bukan?Nah, solusinya adalah dengan menggunakan MySQL untuk mengurai data untuk Anda!
Karena semua orang menggunakan PHP di utas ini, itulah yang akan saya gunakan. Berikut kode lengkapnya. Saya akan menjelaskannya setelah. Parameter
$FullEnumString
akan menampung seluruh string enum, diekstrak dari metode apa pun yang ingin Anda gunakan dari semua jawaban lainnya.RunQuery()
danFetchRow()
(non asosiatif) adalah stand-in untuk metode akses DB favorit Anda.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
mengonfirmasi bahwa nilai enum cocok dengan yang kita harapkan, yaitu,"enum(".$STUFF.")"
(tanpa ada sebelum atau sesudah). Jika preg_match gagal,NULL
dikembalikan.Ini
preg_match
juga menyimpan daftar string, lolos dalam sintaks SQL aneh, di$Matches[1]
. Jadi selanjutnya, kami ingin mendapatkan data yang sebenarnya dari itu. Jadi, Anda hanya menjalankan"SELECT ".$Matches[1]
, dan Anda memiliki daftar lengkap string di rekaman pertama Anda!Jadi tarik saja rekaman itu dengan a
FetchRow(RunQuery(...))
dan selesai.Jika Anda ingin melakukan semua ini dalam SQL, Anda dapat menggunakan yang berikut ini
PS Untuk mencegah siapa pun mengatakan sesuatu tentang itu, tidak, saya tidak percaya metode ini dapat menyebabkan injeksi SQL.
sumber
Untuk mengambil daftar nilai yang mungkin telah didokumentasikan dengan baik, tetapi memperluas jawaban lain yang mengembalikan nilai dalam tanda kurung , saya ingin menghapusnya meninggalkan saya dengan daftar yang dipisahkan koma yang kemudian akan memungkinkan saya untuk menggunakan fungsi tipe meledak setiap kali saya dibutuhkan untuk mendapatkan sebuah array.
The
SUBSTRING
sekarang dimulai pada karakter ke-6 dan menggunakan panjang yang 6 karakter lebih pendek dari total, menghilangkan tanda kurung trailing.sumber
ini akan berhasil untuk saya:
lalu
sumber
Untuk PHP 5.6+
sumber
Sungguh luar biasa bagaimana tidak ada di antara Anda yang mengira bahwa jika Anda menggunakan kolom enum, itu berarti nilai yang akan ditetapkan dikenal "a priori".
Oleh karena itu, jika nilai-nilai tersebut dikenal secara "a priori", cara terbaik untuk mengelolanya adalah melalui kelas Enum yang sangat sederhana.
Cium aturan dan simpan satu panggilan database.
http://it2.php.net/manual/en/class.splenum.php
sumber
Saya mendapatkan nilai enum dengan cara ini:
Menjalankan sql ini saya mendapatkan: enum ('BDBL', 'AB Bank')
maka saya telah memfilter nilai saja menggunakan kode berikut:
Keluaran:
larik (2) {[0] => string (4) "BDBL" [1] => string (7) "AB Bank"}
sumber
Contoh:
sumber
PILIH SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) SEBAGAI DARI information_schema.COLUMNS WHERE TABLE_NAME = 'Articles' AND COLUMN_NAME = 'status'
Tidak akan berfungsi untuk enum ('', 'X''XX')
sumber