Chcę automatycznie wypełnić moje listy rozwijane wyliczonymi możliwymi wartościami z bazy danych. Czy to możliwe w MySQL?
96
Mam dla Ciebie wersję kodera. Usuwa również cytaty z wartości.
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;
}
Możesz uzyskać wartości, wykonując zapytanie w ten sposób:
Stamtąd musisz przekonwertować go na tablicę:
źródło
Dokumentacja MySQL
Chciałbyś coś takiego:
W ten sposób otrzymasz podane wartości. MySQL zawsze zwraca je ujęte w pojedyncze cudzysłowy. Pojedynczy cudzysłów w wartości jest poprzedzony pojedynczym cudzysłowem. Prawdopodobnie możesz bezpiecznie wywołać
trim($val, "'")
każdy z elementów tablicy. Będziesz chciał się nawrócić''
w sprawiedliwy'
.Poniższe polecenie zwróci elementy tablicy $ trimmedvals bez cudzysłowów:
źródło
Jest to podobne do wielu z powyższych, ale daje wynik bez pętli ORAZ daje to, czego naprawdę chcesz: prostą tablicę do generowania opcji wyboru.
BONUS: Działa zarówno dla typów pól SET, jak i ENUM.
$ option_array: Array ([0] => czerwony [1] => zielony [2] => niebieski)
źródło
To jeden z 8 powodów, dla których typ danych ENUM w MySQL jest zły : Chrisa Komlenica :
źródło
Ciąg można analizować tak, jakby był to ciąg CSV (wartość oddzielona przecinkami). PHP ma świetną wbudowaną funkcję o nazwie str_getcsv, która konwertuje ciąg CSV na tablicę.
Powinno to dać coś podobnego do następującego:
Ta metoda pozwala również na umieszczanie pojedynczych cudzysłowów w ciągach znaków (zwróć uwagę na użycie dwóch pojedynczych cudzysłowów):
Więcej informacji na temat funkcji str_getcsv można znaleźć w podręczniku PHP: http://uk.php.net/manual/en/function.str-getcsv.php
źródło
str_getcsv
działa tylko w PHP 5> = 5.3.0, możesz dołączyć ten plik, jeśli chcesz uzyskać tę funkcjonalność we wcześniejszych wersjach.Bardziej aktualny sposób na zrobienie tego, zadziałał dla mnie:
Ostatecznie wartości wyliczenia oddzielone od „enum ()” to po prostu łańcuch CSV, więc przeanalizuj go jako taki!
źródło
tutaj jest dla mysqli
źródło
Oto ta sama funkcja, którą podał Patrick Savalle, zaadaptowana dla frameworka Laravel
źródło
W przypadku Laravel to zadziałało:
Wynik:
źródło
Chcę po prostu dodać do tego, co mówi jasonbar , podczas wykonywania zapytań, takich jak:
Jeśli otrzymasz wynik jako tablicę, będzie on wyglądał następująco:
Gdzie [n] i [tekst] dają tę samą wartość.
Tak naprawdę nie jest to opisane w żadnej znalezionej dokumentacji. Po prostu dobrze jest wiedzieć, co jeszcze tam jest.
źródło
źródło
Spróbuj tego
podaje wszystkie informacje o tej kolumnie w tej tabeli;
źródło
Codeigniter adaptuje wersję jako metodę pewnego modelu:
Wynik:
źródło
Wszyscy używacie dziwnych i złożonych wzorców regex x)
Oto moje rozwiązanie bez preg_match:
źródło
Możesz użyć tej składni do pobrania możliwych wartości wyliczenia w zapytaniu MySQL:
i otrzymujesz wartość, na przykład: enum ('Male', 'Female')
to jest przykład php sytax:
źródło
Problem z każdą inną odpowiedzią w tym wątku polega na tym, że żaden z nich nie analizuje poprawnie wszystkich specjalnych przypadków ciągów w wyliczeniu.
Największą specjalną postacią, która rzucała mi się w pętlę, były pojedyncze cudzysłowy, ponieważ są one kodowane razem jako 2 pojedyncze cudzysłowy! Na przykład wyliczenie z wartością
'a'
jest kodowane jakoenum('''a''')
. Okropne, prawda?Cóż, rozwiązaniem jest użycie MySQL do przeanalizowania danych za Ciebie!
Ponieważ wszyscy inni używają PHP w tym wątku, ja będę tego używał. Poniżej znajduje się pełny kod. Wyjaśnię to później. Parametr
$FullEnumString
będzie zawierał cały ciąg wyliczenia, wyodrębniony z dowolnej metody, której chcesz użyć ze wszystkich innych odpowiedzi.RunQuery()
iFetchRow()
(nie asocjacyjne) są podstawkami dla twoich ulubionych metod dostępu do bazy danych.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
potwierdza, że wartość wyliczenia jest zgodna z tym, czego oczekujemy, to znaczy"enum(".$STUFF.")"
(bez niczego przed ani po). Jeśli preg_match nie powiedzie się,NULL
zostanie zwrócony.To
preg_match
również przechowuje listę ciągów znaków, zapisanych w dziwnej składni SQL, w$Matches[1]
. Następnie chcemy mieć możliwość wyciągnięcia z tego prawdziwych danych. Więc po prostu biegasz"SELECT ".$Matches[1]
i masz pełną listę strun w swoim pierwszym albumie!Więc po prostu wyciągnij ten rekord z rozszerzeniem
FetchRow(RunQuery(...))
i gotowe.Jeśli chcesz zrobić to wszystko w SQL, możesz użyć następującego
PS Żeby powstrzymać kogokolwiek od powiedzenia czegoś na ten temat, nie, nie wierzę, że ta metoda może prowadzić do wstrzyknięcia SQL.
źródło
Aby pobrać listę możliwych wartości, zostało dobrze udokumentowane, ale rozszerzając inną odpowiedź, która zwracała wartości w nawiasach , chciałem je usunąć, pozostawiając mi listę oddzieloną przecinkami, która umożliwiłaby mi użycie funkcji typu eksploduj za każdym razem, gdy będę potrzebne do uzyskania tablicy.
SUBSTRING
Teraz zaczyna się na znak 6 i wykorzystuje długość, która jest krótsza niż 6 znaków sumy, usuwanie nawiasów spływu.źródło
to zadziała dla mnie:
i wtedy
źródło
Dla PHP 5.6+
źródło
To niezwykłe, jak nikt z was nie pomyślał, że jeśli używasz pola wyliczeniowego, oznacza to, że wartości, które mają być przypisane, są znane „a priori”.
Dlatego jeśli wartości są znane „a priori”, najlepszym sposobem zarządzania nimi jest bardzo prosta klasa Enum.
Pocałuj regułę i zapisz jedno wywołanie bazy danych.
http://it2.php.net/manual/en/class.splenum.php
źródło
Otrzymuję wartości wyliczenia w ten sposób:
Uruchamiając ten SQL otrzymałem: enum ('BDBL', 'AB Bank')
następnie przefiltrowałem tylko wartość za pomocą następującego kodu:
Wynik :
array (2) {[0] => string (4) "BDBL" [1] => string (7) "AB Bank"}
źródło
Przykład:
źródło
SELECT SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'artykuły' AND COLUMN_NAME = 'status'
Nie działałoby dla wyliczenia („”, „X''XX”)
źródło