MySQL 데이터베이스에서 가능한 열거 값을 가져오려면 어떻게 해야 합니까?
드롭다운에 DB에서 가능한 열거 값을 자동으로 채우고 싶다.MySQL에서도 가능합니까?
코드 시그너 버전이 있습니다.또한 값에서 따옴표를 제거합니다.
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;
}
다음과 같이 쿼리하면 값을 얻을 수 있습니다.
SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename'
AND TABLE_NAME='tablename'
AND COLUMN_NAME='columnname'
여기서부터 어레이로 변환해야 합니다.
- (MySQL의 단일 따옴표 이스케이프는 호환되지 않을 수 있지만) 게을러지면 어레이에 직접 반영할 수 있습니다.
- $sub_array = str_getcsvsubsubsubsubsec, '', '''가 동작할 수 있습니다(개폐 괄호를 건너뛰도록 하위 문자열을 변경하는 경우). 또는
- 정규 표현
ENUM 열에 대해 가능한 모든 값을 판별하려면 SHOW COLUMNS FROM tbl_name LIKE enum_col을 사용하여 출력의 Type 열에 있는 ENUM 정의를 해석합니다.
다음과 같은 것이 필요합니다.
$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]);
그러면 견적된 값이 표시됩니다.MySQL은 항상 이러한 항목을 작은 따옴표로 묶어서 반환합니다.값의 단일 따옴표는 단일 따옴표로 이스케이프됩니다.하게 전화할 수 거예요.trim($val, "'")
각 어레이 요소에서 사용할 수 있습니다.''
에 '
.
다음은 따옴표 없이 $trimedvals 어레이 항목을 반환합니다.
$trimmedvals = array();
foreach($vals as $key => $value) {
$value=trim($value, "'");
$trimmedvals[] = $value;
}
이는 위의 많은 부분과 비슷하지만 루프 없이 원하는 결과를 얻을 수 있습니다.선택한 옵션을 생성하기 위한 심플한 어레이입니다.
보너스: SET 및 ENUM 필드 유형에 대해 작동합니다.
$result = $db->query("SHOW COLUMNS FROM table LIKE 'column'");
if ($result) {
$option_array = explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $result[0]->Type));
}
$option_array:어레이 ( [0] = > 빨간색 [1] = > 녹색 [2] = > 파란색)
CSV(Comma Separated Value) 문자열인 것처럼 해석할 수 있습니다.PHP에는 CSV 문자열을 배열로 변환하는 str_getcsv라는 훌륭한 빌트인 함수가 있습니다.
// 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);
이것은 다음과 같은 결과를 얻을 수 있습니다.
Array
(
[0] => blond
[1] => brunette
[2] => redhead
)
이 메서드에서는 스트링에 작은 따옴표를 붙일 수도 있습니다(2개의 작은 따옴표를 사용하는 것에 주의해 주세요).
$enum_or_set = "'blond','brunette','red''head'";
Array
(
[0] => blond
[1] => brunette
[2] => red'head
)
str_getcsv 함수에 대한 자세한 내용은 PHP 매뉴얼을 참조하십시오.http://uk.php.net/manual/en/function.str-getcsv.php
다음은 Chris Komlenic이 MySQL의 ENUM 데이터 유형이 나쁜 8가지 이유 중 하나입니다.
4. 다른 ENUM 멤버의 리스트를 얻는 것은 귀찮다.
일반적으로 선택 상자 또는 드롭다운 목록에 데이터베이스에서 가능한 값을 입력해야 합니다.다음과 같이 합니다.
색상 선택:
[ select box ]
이 '라는 되어 있는 에는 'colors'라는 이름만 있으면
SELECT * FROM colors
그런 다음 구문 분석하여 드롭다운 목록을 동적으로 생성할 수 있습니다.참조표에서 색상을 추가 또는 변경할 수 있으며 섹시 주문 양식이 자동으로 업데이트됩니다.아주 좋아요.이제 사악한 ENUM을 생각해 봅시다.멤버 리스트를 추출하려면 어떻게 해야 하나요?테이블의 ENUM 열에서 DISTINT 값을 쿼리할 수 있지만 실제로 사용되고 테이블에 존재하는 값만 반환되며 모든 가능한 값은 반환되지 않습니다.스크립트 언어를 사용하여 INFORMATION_SCHEMA를 쿼리하고 쿼리 결과를 해석할 수 있지만 이는 불필요하게 복잡합니다.사실, 저는 ENUM 열의 멤버 리스트를 추출하는 우아하고 순수한 SQL 방법을 모릅니다.
좀 더 최신의 방법으로, 이것은 나에게 효과가 있었다.
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;
}
최종적으로 enum()에서 분리된 열거값은 CSV 문자열일 뿐이므로 그대로 해석합니다.
여기 mysqli가 있습니다.
function get_enum_values($mysqli, $table, $field )
{
$type = $mysqli->query("SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'")->fetch_array(MYSQLI_ASSOC)['Type'];
preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
return $enum;
}
$deltypevals = get_enum_values($mysqli, 'orders', 'deltype');
var_dump ($deltypevals);
여기 라라벨 프레임워크에 적응한 패트릭 사발레에 의해 주어진 동일한 기능이 있다.
function get_enum_values($table, $field)
{
$test=DB::select(DB::raw("show columns from {$table} where field = '{$field}'"));
preg_match('/^enum\((.*)\)$/', $test[0]->Type, $matches);
foreach( explode(',', $matches[1]) as $value )
{
$enum[] = trim( $value, "'" );
}
return $enum;
}
가능한 값 목록을 가져오려면 괄호 안의 값을 반환한 다른 답변에 대해 자세히 설명해야 합니다.따라서 콤마 구분 목록을 사용하여 어레이를 가져올 때마다 폭발형 함수를 사용할 수 있습니다.
SELECT
SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6) AS val
FROM
information_schema.COLUMNS
WHERE
TABLE_NAME = 'articles'
AND
COLUMN_NAME = 'status'
SUBSTRING
여기서 는 6번째 문자로 시작하여 합계보다6자 짧은 길이를 사용하여 후행 괄호를 삭제합니다.
다음과 같이 쿼리할 때 제이슨바가 말하는 내용을 추가하고 싶을 뿐입니다.
SHOW columns FROM table
결과를 배열로 출력하면 다음과 같습니다.
array([0],[Field],[1],[Type],[2],[Null],[3],[Key],[4],[Default],[5],[Extra])
ᄂ[ᄂ]자 [문자]자
내가 찾은 어떤 문서에도 실제로 언급되지 않았다.그 밖에 무엇이 있는지 아는 것은 좋은 일이다.
여러분 모두 이상하고 복잡한 정규식 패턴을 사용하고 있습니다.x )
preg_match를 사용하지 않는 솔루션을 다음에 나타냅니다.
function getEnumTypes($table, $field) {
$query = $this->db->prepare("SHOW COLUMNS FROM $table WHERE Field = ?");
try {$query->execute(array($field));} catch (Exception $e) {error_log($e->getMessage());}
$types = $query->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE, 1)[$field];
return explode("','", trim($types, "enum()'"));
}
Laravel에게 이것은 효과가 있었습니다.
$result = DB::select("SHOW COLUMNS FROM `table_name` LIKE 'status';");
$regex = "/'(.*?)'/";
preg_match_all( $regex , $result[0]->Type, $enum_array );
$enum_fields = $enum_array[1];
echo "<pre>";
print_r($enum_fields);
출력:
Array
(
[0] => Requested
[1] => Call Back
[2] => Busy
[3] => Not Reachable
[4] => Not Responding
)
이 스레드 내의 다른 모든 응답의 문제는 열거형 내의 문자열의 모든 특수한 케이스를 적절하게 해석하는 응답이 없다는 것입니다.
나를 혼란에 빠뜨린 가장 큰 특수 케이스 캐릭터는 작은 따옴표였다.그것들은 2개의 작은 따옴표로 부호화되어 있기 때문이다!예를 를,, 이 with with with with with with with with이다라는 입니다.'a'
로 부호화되어 있다.enum('''a''')
끔찍하지?
해결책은 MySQL을 사용하여 데이터를 해석하는 것입니다.
이 스레드에서는 모두 PHP를 사용하고 있기 때문에, 그것을 사용합니다.다음은 전체 코드입니다.나중에 설명할게요.파라미터$FullEnumString
는 다른 모든 응답에서 사용하는 메서드에서 추출된 열거 문자열 전체를 유지합니다. RunQuery()
그리고.FetchRow()
(관련되지 않음)은 즐겨찾는 DB 접근 방식을 위한 스탠드인입니다.
function GetDataFromEnum($FullEnumString)
{
if(!preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches))
return null;
return FetchRow(RunQuery('SELECT '.$Matches[1]));
}
preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
enum 값이 우리가 기대하는 것과 일치하는지 확인합니다.즉,"enum(".$STUFF.")"
(전후에 아무것도 없음)preg_match가 실패하면NULL
이 반환됩니다.
이것.preg_match
또한 이상한 SQL 구문으로 이스케이프된 문자열 목록도 저장합니다.$Matches[1]
그 다음에, 실제의 데이터를 취득할 수 있으면 좋겠다고 생각하고 있습니다.그러니까 넌 그냥 도망가"SELECT ".$Matches[1]
첫 번째 레코드의 모든 문자열 목록이 있습니다.
그러니까 그 기록을 꺼내서FetchRow(RunQuery(...))
그럼 끝이야
SQL에서 이 모든 작업을 수행할 경우 다음을 사용할 수 있습니다.
SET @TableName='your_table_name', @ColName='your_col_name', @DBName='your_database_name';
SET @Q=(SELECT CONCAT('SELECT ', (SELECT SUBSTR(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE)-6) FROM information_schema.COLUMNS WHERE TABLE_NAME=@TableName AND COLUMN_NAME=@ColName AND TABLE_SCHEMA=@DBName)));
PREPARE stmt FROM @Q;
EXECUTE stmt;
추신: 다른 사람이 그것에 대해 말하지 못하도록 하기 위해, 아니요, 이 방법은 SQL 주입으로 이어질 수 있다고 생각하지 않습니다.
$row = db_fetch_object($result);
if($row){
$type = $row->Type;
preg_match_all("/'([^']+)'/", $type, $matches,PREG_PATTERN_ORDER );
return $matches[1];
}
이거 먹어봐
describe table columnname
는 해당 표의 컬럼에 대한 모든 정보를 제공합니다.
일부 모델의 메서드로 버전을 조정하는 코드 시그니터:
public function enum_values($table_name, $field_name)
{
$query = $this->db->query("SHOW COLUMNS FROM `{$table_name}` LIKE '{$field_name}'");
if(!$query->num_rows()) return array();
preg_match_all('~\'([^\']*)\'~', $query->row('Type'), $matches);
return $matches[1];
}
결과:
array(2) {
[0]=> string(13) "administrator"
[1]=> string(8) "customer"
}
이 정도면 충분합니다.
SELECT REPLACE(SUBSTRING(COLUMN_TYPE,6,(LENGTH(COLUMN_TYPE)-6)),"'","")
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='__TABLE_SCHEMA__'
AND TABLE_NAME='__TABLE_NAME__'
AND COLUMN_NAME='__COLUMN_NAME__'
그리고 나서.
explode(',', $data)
MySQL QUERY에서 가능한 값을 가져오려면 다음 구문을 사용할 수 있습니다.
$syntax = "SELECT COLUMN_TYPY FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = '{$THE_TABLE_NAME}'
AND COLUMN_NAME = '{$THE_COLUMN_OF_TABLE}'";
값을 얻을 수 있습니다.예: enum('Male','Female')
sytax php의 예를 다음에 나타냅니다.
<?php
function ($table,$colm){
// mysql query.
$syntax = mysql_query("SELECT COLUMN_TYPY FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = '$table' AND COLUMN_NAME ='$colm'");
if (!mysql_error()){
//Get a array possible values from table and colm.
$array_string = mysql_fetch_array($syntax);
//Remove part string
$string = str_replace("'", "", $array_string['COLUMN_TYPE']);
$string = str_replace(')', "", $string);
$string = explode(",",substr(5,$string));
}else{
$string = "error mysql :".mysql_error();
}
// Values is (Examples) Male,Female,Other
return $string;
}
?>
다음과 같은 방법으로 열거값을 얻을 수 있습니다.
SELECT COLUMN_TYPE
FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = 'tableName'
AND COLUMN_NAME = 'columnName';
이 sql을 실행하면 enum('BBL', ABBank')을 얻을 수 있습니다.
다음 코드를 사용하여 값만 필터링했습니다.
preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
var_dump($enum) ;
출력:
array(2) {
[0]=>
string(4) "BDBL"
[1]=>
string(7) "AB Bank"
}
그냥 재미삼아 UTF-8에 안전하고 견적이 어려운 FSM 솔루션을 작성했습니다.
mysql/mariadb는 항상 작은 따옴표를 사용하여 값을 랩하고 리터럴의 따옴표를 2배로 한다고 가정했습니다.
$string=$column_info;
$char = '';
$next_char = '';
$buffer = '';
$buffering = false;
$enum_values = array();
while( mb_strlen($string) > 0 ){
// consume a multibyte char
$char=mb_substr($string,0,1);
$string=mb_substr($string,1);
if ( $char === "'" && $buffering === false ) {
// start buffering
$buffering=true;
} else if ( $char === "'" && $buffering === true){
// see next char
$next_char=mb_substr($string,0,1);
$string=mb_substr($string,1);
if( $next_char === "'" ){
// two quote '' found, literal
$buffer = "$buffer$char";
} else {
// end of string
$enum_values[] = $buffer;
$buffer = '';
$buffering = false;
}
} else if( $buffering === true ) {
// normal char during buffering
$buffer = "$buffer$char";
}
}
if( $buffering ){
// this means an unterminated string
throw new \Exception("Unterminated string in enum");
}
return $enum_values;
테스트 대상:
array(7) {
[0]=>
string(10) "added enum"
[1]=>
string(22) "a "double Quoted" enum"
[2]=>
string(6) "normal"
[3]=>
string(26) "an utf-8 enum ☠ (middle)"
[4]=>
string(15) "a 'Quoted' enum"
[5]=>
string(21) "a single quote ' enum"
[6]=>
string(23) "an utf-8 enum (end) ☠"
}
PHP 5.6+의 경우
$mysqli = new mysqli("example.com","username","password","database");
$result = $mysqli->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table_name' AND COLUMN_NAME='column_name'");
$row = $result->fetch_assoc();
var_dump($row);
DELIMITER //
DROP FUNCTION IF EXISTS ENUM_VALUES;
CREATE FUNCTION ENUM_VALUES(
_table_name VARCHAR(64),
_col_name VARCHAR(64)
) RETURNS JSON
BEGIN
RETURN (
SELECT CAST(CONCAT('[', REPLACE(SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6), "'", '"'), ']') AS JSON)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = _table_name
AND COLUMN_NAME = _col_name
AND DATA_TYPE = 'enum'
);
END //
DELIMITER ;
예:
SELECT ENUM_VALUES('table_name', 'col_name');
열거 필드를 사용할 경우 할당되는 값이 "선험적"으로 알려져 있다는 것을 의미한다고 생각하는 사람은 아무도 없습니다.
따라서 값이 "a priori"로 알려진 경우 가장 좋은 관리 방법은 매우 단순한 Enum 클래스를 사용하는 것입니다.
Kiss rule을 실행하여 데이터베이스 콜을 1개 저장합니다.
<?php
class Genre extends \SplEnum {
const male = "Male";
const female = "Female";
}
http://it2.php.net/manual/en/class.splenum.php
WordPress를 사용하다은 쉼표 합니다.(,)
안에
function get_enum_values($wpdb, $table, $field) {
$values = array();
$table = "{$wpdb->prefix}{$table}";
$query = "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'";
$results = $wpdb->get_results($query, ARRAY_A);
if (is_array($results) && count($results) > 0) {
preg_match("/^enum\(\'(.*)\'\)$/", $results[0]['Type'], $matches);
if (is_array($matches) && isset($matches[1])) {
$values = explode("','", $matches[1]);
}
}
return $values;
}
cchana의 답변에 추가.메서드 "length-6"은 열거형 이외의 값에서 실패합니다.
예를 들어 (값은 키릴 문자, 테이블은 UTF8 - utf8_general_ci 입니다).이 예에서는 단순성을 위해 변수를 사용합니다. 스키마에서 선택하면 동일한 값을 얻을 수 있습니다.)
set @a:="enum('в работе','на списание','списано')";
select substring(@a,6,length(@a)-6);
+-------------------------------------------------------------+
| substring(@a,6,length(@a)-6) |
+-------------------------------------------------------------+
| 'в работе','на списание','списано') |
+-------------------------------------------------------------+
괄호 안에 주의해 주세요.
select right(@a,1);
+-------------+
| right(@a,1) |
+-------------+
| ) |
+-------------+
다음 문자를 하나 더 제거해 보겠습니다.
select substring(@a,6,length(@a)-7);
+-------------------------------------------------------------+
| substring(@a,6,length(@a)-7) |
+-------------------------------------------------------------+
| 'в работе','на списание','списано') |
+-------------------------------------------------------------+
운이 없군!괄호는 제자리에 있습니다.
인인中(mid()
function function function function function function function function function function function function function function function function와 같은 substring()
을 사용하다
select mid(@a,6,length(@a)/2);
+---------------------------------------------------------+
| mid(@a,6,length(@a)/2) |
+---------------------------------------------------------+
| 'в работе','на списание','списан |
+---------------------------------------------------------+
참조: 문자열의 오른쪽 끝은 3자뿐입니다.하지만 키릴 문자를 라틴어로 대체해야 할까요? 모든 것이 완벽하게 작동합니다.
set @b:="enum('in use','for removal','trashed')";
select (substring(@b,6,length(@b)-6));
+----------------------------------+
| (substring(@b,6,length(@b)-6)) |
+----------------------------------+
| 'in use','for removal','trashed' |
+----------------------------------+
JFYI
편집:에 대한 은 편20210221: 20210221 。CHAR_LENGTH()
'가 아니라 '아'가 '아'가 LENGTH()
PDO를 사용하면 다음과 같이 동작합니다.
$stmt = $mysql->prepare("SHOW COLUMNS FROM table LIKE 'column'");
$stmt->execute();
$enumvalues = $stmt->fetch(PDO::FETCH_ASSOC)['Type'];
$enumvalues = explode(',', str_replace('\'', '', substr($enumvalues, 5, strlen($enumvalues) - 6)));
SELECT
SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6) AS val
FROM
information_schema.COLUMNS
WHERE
TABLE_NAME = 'articles'
AND
COLUMN_NAME = 'status'
enum('',X'X')에는 사용할 수 없습니다.
언급URL : https://stackoverflow.com/questions/2350052/how-can-i-get-enum-possible-values-in-a-mysql-database
'programing' 카테고리의 다른 글
Larabel MySql 연결 문제가 너무 많습니다. (0) | 2022.12.09 |
---|---|
정의되지 않은 참조/해결되지 않은 외부 기호 오류란 무엇이며 어떻게 수정해야 합니까? (0) | 2022.12.09 |
MySQL 문에 PHP 변수를 포함하는 방법 (0) | 2022.12.09 |
알기 쉽게 설명하자면 Java에서 Runnable이란 무엇입니까? (0) | 2022.12.09 |
IntelliJ IDEA Project SDK 설정 방법 (0) | 2022.12.09 |