Я хочу автоматически заполнить свои раскрывающиеся списки возможными значениями перечисления из БД. Возможно ли это в MySQL?
96
У меня есть для вас версия codeigniter. Он также удаляет кавычки из значений.
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;
}
Вы можете получить значения, запросив его следующим образом:
Оттуда вам нужно будет преобразовать его в массив:
источник
Справочник по MySQL
Вам нужно что-то вроде:
Это даст вам указанные значения. MySQL всегда возвращает их в одинарных кавычках. Одиночная кавычка в значении заменяется одиночной кавычкой. Вероятно, вы можете безопасно вызывать
trim($val, "'")
каждый из элементов массива. Вы захотите преобразовать''
в просто'
.Следующее будет возвращать элементы массива $ trimmedval без кавычек:
источник
Это похоже на многое из вышеперечисленного, но дает результат без циклов, И дает то, что вы действительно хотите: простой массив для генерации параметров выбора.
БОНУС: работает как с полями SET, так и с ENUM.
$ option_array: Array ([0] => красный [1] => зеленый [2] => синий)
источник
Это одна из 8 причин, по которым тип данных MySQL ENUM является злом, названный Крисом Комленичем :
источник
Вы можете проанализировать строку, как если бы это была строка CSV (значения, разделенные запятыми). В PHP есть отличная встроенная функция str_getcsv, которая преобразует строку CSV в массив.
Это должно дать вам что-то вроде следующего:
Этот метод также позволяет использовать одинарные кавычки в ваших строках (обратите внимание на использование двух одинарных кавычек):
Дополнительные сведения о функции str_getcsv см. В руководстве по PHP: http://uk.php.net/manual/en/function.str-getcsv.php
источник
str_getcsv
работает только в PHP 5> = 5.3.0, вы можете включить этот файл, если хотите получить эту функциональность в более ранних версиях.Более современный способ сделать это, это сработало для меня:
В конечном счете, значения перечисления, отделенные от enum (), представляют собой просто строку CSV, поэтому проанализируйте ее как таковую!
источник
вот для mysqli
источник
Вот та же функция, которую дал Патрик Саваль, адаптированная для фреймворка Laravel.
источник
Для Laravel это сработало:
Вывод:
источник
Я просто хочу добавить к тому, что говорит jasonbar , при запросе, например:
Если вы получите результат в виде массива, он будет выглядеть так:
Где [n] и [text] дают одно и то же значение.
На самом деле не сказано в какой-либо документации, которую я нашел. Просто хорошо знать, что еще есть.
источник
источник
попробуй это
дает вам всю информацию об этом столбце в этой таблице;
источник
Версия адаптации Codeigniter как метод некоторой модели:
Результат:
источник
Все вы используете какие-то странные и сложные шаблоны регулярных выражений x)
Вот мое решение без preg_match:
источник
Вы можете использовать этот синтаксис для получения возможных значений перечисления в MySQL QUERY:
и вы получите значение, например: enum ('Male', 'Female')
это пример sytax php:
источник
Проблема с каждым другим ответом в этом потоке заключается в том, что ни один из них не анализирует должным образом все особые случаи строк в перечислении.
Самым большим символом особого случая, который заставлял меня зацикливаться, были одинарные кавычки, поскольку они кодируются как две одинарные кавычки вместе! Так, например, перечисление со значением
'a'
кодируется какenum('''a''')
. Ужасно, правда?Что ж, решение состоит в том, чтобы использовать MySQL для анализа данных за вас!
Поскольку все остальные используют PHP в этом потоке, я буду использовать именно его. Ниже приводится полный код. Я объясню это позже. Параметр
$FullEnumString
будет содержать всю строку перечисления, извлеченную из любого метода, который вы хотите использовать из всех других ответов.RunQuery()
иFetchRow()
(неассоциативный) заменяют ваши любимые методы доступа к БД.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
подтверждает, что значение перечисления соответствует тому, что мы ожидаем, то есть"enum(".$STUFF.")"
(ни до, ни после). Если preg_match терпит неудачу,NULL
возвращается.Здесь
preg_match
также хранится список строк, экранированных странным синтаксисом SQL, в$Matches[1]
. Итак, теперь мы хотим получить из этого реальные данные. Итак, вы просто запускаете"SELECT ".$Matches[1]
, и у вас есть полный список строк в вашей первой записи!Так что просто вытащите эту пластинку с
FetchRow(RunQuery(...))
и все готово.Если вы хотите сделать все это в SQL, вы можете использовать следующие
PS Чтобы не дать кому-либо что-то сказать об этом, нет, я не верю, что этот метод может привести к SQL-инъекции.
источник
Чтобы получить список возможных значений, был хорошо документирован, но, расширяя другой ответ, который возвращал значения в круглых скобках , я хотел удалить их, оставив мне список, разделенный запятыми, который затем позволил бы мне использовать функцию типа разнесения всякий раз, когда я нужно было получить массив.
SUBSTRING
Теперь начинается на 6 - й символ и использует длину, 6 символов короче , чем общее количество, удаляя косую скобку.источник
это сработает для меня:
а потом
источник
Для PHP 5.6+
источник
Удивительно, но никто из вас не подумал, что если вы используете поле enum, это означает, что присваиваемые значения известны «априори».
Поэтому, если значения известны «априори», лучший способ управлять ими - использовать очень простой класс Enum.
Поцелуй правило и сохрани один вызов базы данных.
http://it2.php.net/manual/en/class.splenum.php
источник
Я получаю значения перечисления таким образом:
Запустив этот sql, я получаю: enum ('BDBL', 'AB Bank')
то я отфильтровал только значение, используя следующий код:
Вывод :
array (2) {[0] => строка (4) "BDBL" [1] => строка (7) "AB Bank"}
источник
Пример:
источник
ВЫБЕРИТЕ SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'article' И COLUMN_NAME = 'status'
Не работает для enum ('', 'X''XX')
источник