मैं MySQL डेटाबेस में संभावित मान कैसे पा सकता हूं?


96

मैं एक DB से स्वचालित रूप से संभव मानों के साथ अपने ड्रॉपडाउन को आबाद करना चाहता हूं। क्या यह MySQL में संभव है?

जवाबों:


97

मेरे पास आपके लिए एक कोडिग्न वर्जन है। यह मानों से उद्धरण भी निकालता है।

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;
}

29
यदि ईनम मानों में स्वयं अल्पविराम हो तो यह समाधान टूट जाएगा।
फोम।


3
PHP संस्करण: $ प्रकार = $ इस-> mysql-> का चयन करें ("$ $ $ फ़ील्ड से"> <फ़ील्ड>] [0] ["टाइप"];
एलेसेंड्रो।

php का उपयोग करके एक सरणी में टाइप वैल्यू को इस तरह कन्वर्ट करने के लिए: $ खंड = str_replace ("'", "", $ पंक्ति [0] [' टाइप ']); $ खंड = str_replace ("एनम", "", $ खंड); $ खंड = str_replace ("(", "", $ खंड); $ खंड = str_replace (")", "", $ खंड); $ खंड = विस्फोट (',', $ खंड);
बजे गुस्तावो एमिल

1
मैंने सभी enum मानों को निकालने के लिए एक पूर्ण प्रमाण के साथ एक उत्तर जोड़ा है , कोई फर्क नहीं पड़ता कि उनके अंदर के अक्षर।
डाकुसन

53

आप इसे इस तरह से क्वेरी करके मान प्राप्त कर सकते हैं:

SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename' 
    AND TABLE_NAME='tablename'
    AND COLUMN_NAME='columnname'

वहां से आपको इसे एक ऐरे में बदलना होगा:

  • यदि आप आलसी हैं, तो सीधे एक सरणी में निकाल दें (हालांकि MySQL का एकल उद्धरण एस्केप असंगत हो सकता है), या
  • $ विकल्प_अरे = str_getcsv ($ विकल्प, ',', "" ") संभवतः काम करेंगे (यदि आप उद्घाटन और समापन कोष्ठक को छोड़ने के लिए प्रतिस्थापन को बदल देते हैं), या
  • एक नियमित अभिव्यक्ति

31

MySQL संदर्भ

यदि आप किसी ENUM कॉलम के लिए सभी संभावित मान निर्धारित करना चाहते हैं, तो tbl_name से SHOW COLUMNS का उपयोग करें enum_col को लें और आउटपुट के टाइप कॉलम में 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, "'")प्रत्येक सरणी तत्वों पर सुरक्षित रूप से कॉल कर सकते हैं। आप ''बस में बदलना चाहते हैं '

निम्नलिखित उद्धरणों के बिना $ trimmedvals सरणी आइटम लौटाएगा:

$trimmedvals = array();
foreach($vals as $key => $value) {
$value=trim($value, "'");
$trimmedvals[] = $value;
}

11

यह ऊपर के बहुत सारे की तरह है, लेकिन आपको बिना छोरों के परिणाम देता है, और आप जो चाहते हैं, वास्तव में चाहते हैं: अन्य विकल्पों को उत्पन्न करने के लिए एक सरल सरणी।

बोनस: यह 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] => नीला)


10

यह क्रिस कोम्मेलिक के 8 कारणों में से एक है क्यों MySQL के ईएनएम डेटा प्रकार ईविल है :

 4. अलग ENUM सदस्यों की सूची प्राप्त करना एक दर्द है।

डेटाबेस से संभावित मानों के साथ चयन बॉक्स या ड्रॉप डाउन सूची को आबाद करने के लिए एक बहुत ही सामान्य आवश्यकता है। ऐशे ही:

रंग चुनो:

[ select box ]

यदि इन मूल्यों को 'रंग' नाम की एक संदर्भ तालिका में संग्रहीत किया जाता है, तो आप सभी की आवश्यकता है: SELECT * FROM colors... जो तब ड्रॉप डाउन सूची को गतिशील रूप से उत्पन्न करने के लिए पार्स किया जा सकता है। आप संदर्भ तालिका में रंगों को जोड़ या बदल सकते हैं, और आपके सेक्सी ऑर्डर फॉर्म स्वतः अपडेट हो जाएंगे। बहुत बढ़िया।

अब बुराई ENUM पर विचार करें: आप सदस्य सूची कैसे निकालते हैं? आप DISTINCT मानों के लिए अपनी तालिका में ENUM कॉलम को क्वेरी कर सकते हैं, लेकिन यह केवल उन मूल्यों को लौटाएगा जो वास्तव में उपयोग किए जाते हैं और तालिका में मौजूद हैं , जरूरी नहीं कि सभी संभव मान। आप INFORMATION_SCHEMA को क्वेरी कर सकते हैं और उन्हें स्क्रिप्टिंग भाषा के साथ क्वेरी परिणाम से बाहर कर सकते हैं, लेकिन यह अनावश्यक रूप से जटिल है। वास्तव में, मुझे किसी ENUM कॉलम की सदस्य सूची निकालने का कोई सुरुचिपूर्ण, विशुद्ध रूप से SQL तरीका नहीं पता है।


9

आप स्ट्रिंग को पार्स कर सकते हैं जैसे कि यह CSV (कोमा सेपरेटेड वैल्यू) स्ट्रिंग था। PHP में एक शानदार बिल्ड-इन फ़ंक्शन है जिसे str_getcsv कहा जाता है जो एक CSV स्ट्रिंग को एक सरणी में परिवर्तित करता है।

// 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
)

यह विधि आपको अपने तार में एकल उद्धरण की अनुमति देती है (दो एकल उद्धरणों के उपयोग पर ध्यान दें):

$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


1
मैंने जो उदाहरण दिया, वह आपको डेटाबेस से फ़ील्ड जानकारी प्राप्त करने का तरीका नहीं दिखाता है, लेकिन इस पेज पर बहुत सारे उदाहरण हैं जो आपको यह दिखाने के लिए कि कैसे करना है।
आधार जू

2
str_getcsvकेवल PHP 5> = 5.3.0 में काम करता है, आप इस फ़ाइल को शामिल कर सकते हैं यदि आप इस कार्यक्षमता को पहले के संस्करणों में प्राप्त करना चाहते हैं।
स्टीव

1
यह इसे संभालने का सही तरीका होना चाहिए क्योंकि यह स्ट्रिंग के अंदर भागे हुए कोट्स और कॉमा को मानता है।
क्रिस्टोफ़र साल्-स्टोर्गार्ड

1
शानदार समाधान, समय बचाता है;)
जॉन

6

इसे करने का एक और तरीका, यह मेरे लिए काम कर रहा है:

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 स्ट्रिंग है, इसलिए इसे इस तरह से पार्स करें!


5

यहाँ 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);

4

यहाँ पैट्रिक सैवले द्वारा दिया गया वही कार्य है जो कि फ्रेमवर्क लारवेल के लिए अनुकूलित है

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;

}

2

मैं बस यह जोड़ना चाहता हूं कि जब जोसनबार क्या कहता है, जैसे:

SHOW columns FROM table

यदि आपको परिणाम एक सरणी के रूप में मिलता है तो यह इस तरह दिखाई देगा:

array([0],[Field],[1],[Type],[2],[Null],[3],[Key],[4],[Default],[5],[Extra])

जहाँ [n] और [text] समान मूल्य देते हैं।
वास्तव में किसी भी दस्तावेज में मुझे नहीं बताया गया है। बस यह जानने के लिए अच्छा है कि और क्या है।


2
$row = db_fetch_object($result);
     if($row){
     $type = $row->Type;
     preg_match_all("/'([^']+)'/", $type, $matches,PREG_PATTERN_ORDER );
     return $matches[1];


}

2

इसे इस्तेमाल करे

describe table columnname

आपको उस तालिका में उस कॉलम के बारे में सारी जानकारी देता है;


2

कुछ मॉडल की विधि के रूप में कोडिनैपिंग एडैपिंग संस्करण:

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"
}

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपने स्वयं के पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ।
worldofjr

क्या आपको यकीन है? क्यों? इस फ़ंक्शन के परिणाम केवल form_dropdown जैसे फ़ंक्शन में सम्मिलित कर सकते हैं ...
Андрій Глущенко

2

आप सभी कुछ अजीब और जटिल रेगेक्स पैटर्न 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()'"));
}

2

आप MySQL QUERY में enum संभव मान प्राप्त करने के लिए इस सिंटैक्स का उपयोग कर सकते हैं:

$syntax = "SELECT COLUMN_TYPY FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME = '{$THE_TABLE_NAME}' 
AND COLUMN_NAME = '{$THE_COLUMN_OF_TABLE}'";

और आपको मूल्य मिलता है, उदाहरण: enum ('पुरुष', 'महिला')

इसका उदाहरण 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;
}
?>

2

लारवेल के लिए इसने काम किया:

$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

इस धागे में हर दूसरे जवाब के साथ समस्या यह है कि उनमें से कोई भी एनम के भीतर तार के सभी विशेष मामलों को ठीक से पार्स नहीं करता है।

सबसे बड़ा विशेष मामला चरित्र जो मुझे एक पाश के लिए फेंक रहा था, एकल उद्धरण था, क्योंकि वे खुद को एक साथ 2 एकल उद्धरण के रूप में एन्कोड किया गया था! इसलिए, उदाहरण के लिए, मान के साथ एक एनम '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(".$STUFF.")"(पहले या बाद में कुछ नहीं) के साथ मेल खाता है । यदि preg_match विफल रहता है, NULLतो वापस कर दिया जाता है।

यह preg_matchस्ट्रिंग्स की सूची भी संग्रहीत करता है, अजीब SQL सिंटैक्स में बच गया, में $Matches[1]। इसलिए अगला, हम वास्तविक डेटा प्राप्त करना चाहते हैं। तो आप बस चलाते हैं "SELECT ".$Matches[1], और आपके पास अपने पहले रिकॉर्ड में तार की पूरी सूची है!

तो बस उस रिकॉर्ड को एक के साथ बाहर खींचो FetchRow(RunQuery(...))और तुम्हारा काम हो गया।

यदि आप SQL में यह पूरी बात करना चाहते हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं

SET @TableName='your_table_name', @ColName='your_col_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)));
PREPARE stmt FROM @Q;
EXECUTE stmt;

PS किसी को इसके बारे में कुछ कहने से पहले, नहीं, मुझे नहीं लगता कि इस विधि से SQL इंजेक्शन हो सकता है।


महान समाधान! बेशक, यह SQL इंजेक्शन नहीं हो सकता है, क्योंकि हम अपने स्वयं के DB स्कीमा से मान ले रहे हैं।
तराजू

दृष्टिकोण के लिए धन्यवाद। मुझे इस तरह के {"बिल्डिंग_एज्यूएशन्स": "बिल्डिंग_ग्रीव्यूलेशन", "0": "बिल्डिंग_एज्यूएशन्स", "लिस्ट_ऑफ_नॉवर्स": "लिस्ट_ऑफ_वॉनर्स", "1:": लिस्ट_ऑफ_वॉएर्स "} जैसे आवर्तक मान मिल रहे हैं। कोई विचार क्यों? (अच्छी तरह से phpmyadmin में काम करता है, लेकिन जब पीओडी ऑब्जेक्ट का उपयोग करके चलाया जाता है तो यह परिणाम होता है।)
गनी ओज़ान्स

Php में क्वेरी से mysql पंक्ति से मान खींचने के लिए 3 तरीके हैं। mysql_fetch_assoc उचित कुंजियों के साथ मानों में खींचता है, mysql_fetch_row संख्यात्मक कुंजियों के साथ मानों में खींचता है, और mysql_fetch_array मानों को एक या दोनों के रूप में खींच सकता है। ऐसा लगता है कि इस ऑपरेशन के लिए आपका pdo mysql_fetch_array का उपयोग कर रहा है। भ्रूण के दौरान ऐसा न करने के लिए यह बताने का एक तरीका होना चाहिए।
डाकुसन

या आपकी pdo समस्या के लिए बहुत अधिक सरल उत्तर, बस एक array_unique, या एक array_filter चलाएं जो विशेष अनुक्रमणिका को हटाता है।
दक्खन

अति उत्कृष्ट! इसी तरह से आप MySQL को पूरी मेहनत करते हैं।
स्पेंसर विलियम्स

2

संभावित मूल्यों की सूची लाने के लिए अच्छी तरह से प्रलेखित किया गया है, लेकिन एक और जवाब पर विस्तार करते हुए कि कोष्ठक में मान लौटाते हैं , मैं उन्हें एक अल्पविराम से अलग की गई सूची के साथ छोड़ना चाहता था जो मुझे तब भी एक विस्फोट प्रकार के फ़ंक्शन का उपयोग करने की अनुमति देगा। एक सरणी प्राप्त करने की आवश्यकता है।

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 अक्षर की कुल तुलना में कम है, अनुगामी कोष्ठक को हटाने का उपयोग करता है।


1

यह मेरे लिए काम करेगा:

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)

1

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);

1

यह असाधारण है कि आप में से किसी ने भी यह नहीं सोचा है कि यदि आप एक एनम फील्ड का उपयोग कर रहे हैं तो इसका मतलब है कि असाइन किए जाने वाले मान "एक प्राथमिकता" के रूप में जाने जाते हैं।

इसलिए यदि मानों को "प्राथमिकताओं" के रूप में जाना जाता है, तो उन्हें प्रबंधित करने का सबसे अच्छा तरीका एक बहुत ही सरल Enum क्लास है।

चुंबन शासन और एक डेटाबेस कॉल को बचाने।

<?php
class Genre extends \SplEnum {
 const male = "Male";
 const female = "Female";
}

http://it2.php.net/manual/en/class.splenum.php


0

मुझे इस तरह से एनम मान मिलता है:

SELECT COLUMN_TYPE 
FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME = 'tableName' 
     AND COLUMN_NAME = 'columnName';

इस sql को चलाने पर मुझे: enum ('BDBL', 'AB Bank')

तब मैंने निम्नलिखित कोड का उपयोग करके सिर्फ मूल्य को फ़िल्टर किया है:

preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
var_dump($enum) ;

बाहर रखा:

सरणी (2) {[0] => स्ट्रिंग (4) "बीडीबीएल" [1] => स्ट्रिंग (7) "एबी बैंक"}


0
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');

0

SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) का चयन करें AS से सूचना के आधार पर _schema.COLUMNS कहाँ TABLE_NAME = 'लेख' और COLUMN_NAME = 'स्थिति'

एनम ('', 'X''XX') के लिए काम नहीं करेंगे


1
इस प्रकार का उत्तर एक टिप्पणी में होना चाहिए।
राहुल

स्टैक ओवरफ्लो काफी बुद्धिमान है और मुझे प्रतिष्ठा प्रणाली के कारण टिप्पणी नहीं करने देता है।
साल्वर हार्डिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.