Ich möchte meine Dropdowns automatisch mit einer Aufzählung möglicher Werte aus einer Datenbank füllen. Ist das in MySQL möglich?
96
Ich habe eine Codeigniter-Version für Sie. Außerdem werden die Anführungszeichen aus den Werten entfernt.
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;
}
Sie können die Werte erhalten, indem Sie sie wie folgt abfragen:
Von dort müssen Sie es in ein Array konvertieren:
quelle
MySQL-Referenz
Sie möchten so etwas wie:
Dadurch erhalten Sie die angegebenen Werte. MySQL gibt diese immer in einfachen Anführungszeichen zurück. Ein einfaches Anführungszeichen im Wert wird durch ein einfaches Anführungszeichen maskiert. Sie können wahrscheinlich sicher
trim($val, "'")
jedes der Array-Elemente aufrufen . Sie möchten''
in nur konvertieren'
.Im Folgenden werden Array-Elemente mit $ trimmedvals ohne Anführungszeichen zurückgegeben:
quelle
Dies ist wie viele der oben genannten Schritte, liefert jedoch das Ergebnis ohne Schleifen UND bringt Sie dazu, dass Sie wirklich wollen: ein einfaches Array zum Generieren von Auswahloptionen.
BONUS: Es funktioniert sowohl für SET- als auch für ENUM-Feldtypen.
$ option_array: Array ([0] => rot [1] => grün [2] => blau)
quelle
Dies ist einer der 8 Gründe von Chris Komlenic, warum der ENUM-Datentyp von MySQL böse ist :
quelle
Sie können die Zeichenfolge so analysieren, als wäre sie eine CSV-Zeichenfolge (Comma Separated Value). PHP hat eine großartige integrierte Funktion namens str_getcsv, die eine CSV-Zeichenfolge in ein Array konvertiert.
Dies sollte Ihnen etwas Ähnliches wie das Folgende geben:
Mit dieser Methode können Sie auch einfache Anführungszeichen in Ihre Zeichenfolgen einfügen (beachten Sie die Verwendung von zwei einfachen Anführungszeichen):
Weitere Informationen zur Funktion str_getcsv finden Sie im PHP-Handbuch: http://uk.php.net/manual/en/function.str-getcsv.php
quelle
str_getcsv
funktioniert nur in PHP 5> = 5.3.0. Sie können diese Datei einschließen, wenn Sie diese Funktionalität in früheren Versionen erhalten möchten.Eine aktuellere Art, dies zu tun, funktionierte für mich:
Letztendlich sind die Enum-Werte, wenn sie von "enum ()" getrennt werden, nur eine CSV-Zeichenfolge. Analysieren Sie sie also als solche!
quelle
hier ist für mysqli
quelle
Hier ist die gleiche Funktion von Patrick Savalle für das Framework Laravel angepasst
quelle
Ich möchte einfach hinzufügen, was Jasonbar sagt, wenn ich abfrage wie:
Wenn Sie das Ergebnis als Array erhalten, sieht es folgendermaßen aus:
Wobei [n] und [Text] den gleichen Wert angeben.
In keiner Dokumentation, die ich gefunden habe, wirklich erzählt. Einfach gut zu wissen, was es sonst noch gibt.
quelle
quelle
Versuche dies
gibt Ihnen alle Informationen zu dieser Spalte in dieser Tabelle;
quelle
Codeigniter, der die Version als Methode eines Modells anpasst:
Ergebnis:
quelle
Sie alle verwenden einige seltsame und komplexe Regex-Muster. X)
Hier ist meine Lösung ohne preg_match:
quelle
Mit dieser Syntax können Sie mögliche Werte in MySQL QUERY abrufen:
und Sie erhalten Wert, Beispiel: enum ('Männlich', 'Weiblich')
Dies ist ein Beispiel für sytax php:
quelle
Für Laravel funktionierte dies:
Ausgabe:
quelle
Das Problem bei jeder anderen Antwort in diesem Thread ist, dass keiner von ihnen alle Sonderfälle der Zeichenfolgen innerhalb der Aufzählung richtig analysiert.
Das größte Sonderzeichen, das mich für eine Schleife geworfen hat, waren einfache Anführungszeichen, da sie selbst als zwei einfache Anführungszeichen zusammen codiert sind! So wird beispielsweise eine Aufzählung mit dem Wert
'a'
als codiertenum('''a''')
. Schrecklich, richtig?Nun, die Lösung besteht darin, MySQL zu verwenden, um die Daten für Sie zu analysieren!
Da alle anderen in diesem Thread PHP verwenden, werde ich das verwenden. Es folgt der vollständige Code. Ich werde es später erklären. Der Parameter enthält
$FullEnumString
die gesamte Enum-Zeichenfolge, die aus einer beliebigen Methode extrahiert wurde, die Sie aus allen anderen Antworten verwenden möchten.RunQuery()
undFetchRow()
(nicht assoziativ) sind Stellvertreter für Ihre bevorzugten DB-Zugriffsmethoden.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
bestätigt, dass der Aufzählungswert mit dem übereinstimmt, was wir erwarten, dh"enum(".$STUFF.")"
mit nichts vorher oder nachher). Wenn preg_match fehlschlägt,NULL
wird zurückgegeben.Hier wird
preg_match
auch die Liste der Zeichenfolgen gespeichert, die in seltsamer SQL-Syntax maskiert sind$Matches[1]
. Als nächstes wollen wir in der Lage sein, die realen Daten daraus zu gewinnen. Also rennst du einfach"SELECT ".$Matches[1]
und haben eine vollständige Liste der Zeichenfolgen in Ihrem ersten Datensatz!Ziehen Sie diese Platte einfach mit einem heraus
FetchRow(RunQuery(...))
und Sie sind fertig.Wenn Sie dies alles in SQL ausführen möchten, können Sie Folgendes verwenden
PS Um zu verhindern, dass jemand etwas darüber sagt, nein, ich glaube nicht, dass diese Methode zu einer SQL-Injection führen kann.
quelle
Um die Liste der möglichen Werte abzurufen, wurde sie gut dokumentiert. Als Erweiterung einer anderen Antwort, die die Werte in Klammern zurückgab , wollte ich sie entfernen und eine durch Kommas getrennte Liste hinterlassen, in der ich jederzeit eine Explosionsfunktion verwenden kann benötigt, um ein Array zu bekommen.
Das
SUBSTRING
beginnt jetzt mit dem 6. Zeichen und verwendet eine Länge, die 6 Zeichen kürzer als die Gesamtzahl ist, wobei die nachfolgende Klammer entfernt wird.quelle
das wird bei mir funktionieren:
und dann
quelle
Für PHP 5.6+
quelle
Es ist außergewöhnlich, wie keiner von Ihnen gedacht hat, dass wenn Sie ein Aufzählungsfeld verwenden, dies bedeutet, dass die zuzuweisenden Werte "a priori" bekannt sind.
Wenn die Werte "a priori" bekannt sind, können Sie sie am besten über eine sehr einfache Enum-Klasse verwalten.
Küssen Sie die Regel und speichern Sie einen Datenbankaufruf.
http://it2.php.net/manual/en/class.splenum.php
quelle
Ich erhalte Enum-Werte auf folgende Weise:
Wenn ich diese SQL laufen lasse, bekomme ich: enum ('BDBL', 'AB Bank')
dann habe ich nur den Wert mit folgendem Code gefiltert:
Ausgabe :
Array (2) {[0] => String (4) "BDBL" [1] => String (7) "AB Bank"}
quelle
Beispiel:
quelle
SELECT SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'Artikel' UND COLUMN_NAME = 'Status'
Würde nicht für enum funktionieren ('', 'X''XX')
quelle