আমি আমার ড্রপডাউনগুলি একটি ডিবি থেকে স্বয়ংক্রিয়ভাবে এনাম সম্ভাব্য মান সহ পপুলেট করতে চাই। এটি কি মাইএসকিউএলে সম্ভব?
উত্তর:
আপনার জন্য আমার কাছে কোডিগিটার সংস্করণ রয়েছে। এটি মানগুলি থেকে উদ্ধৃতিগুলি পৃথক করে দেয়।
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'
সেখান থেকে আপনাকে এটিকে অ্যারেতে রূপান্তর করতে হবে:
আপনি যদি কোনও ENUM কলামের জন্য সমস্ত সম্ভাব্য মান নির্ধারণ করতে চান তবে tbl_name LIKE enum_col থেকে COLUMNS দেখান এবং আউটপুটের টাইপ কলামে 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]);
এটি আপনাকে উদ্ধৃত মানগুলি দেবে। মাইএসকিউএল সর্বদা একক উদ্ধৃতিতে এগুলি আবদ্ধ করে দেয়। মানটির একক উদ্ধৃতি একক উদ্ধৃতি দ্বারা পালিয়ে যায়। আপনি সম্ভবত trim($val, "'")অ্যারে উপাদানগুলির প্রত্যেককে নিরাপদে কল করতে পারেন । আপনি রূপান্তর করতে চাইবেন ''শুধু মধ্যে '।
নিম্নলিখিতগুলি ছাড়াই $ ট্রিম্মডভ্যালগুলি অ্যারের আইটেমগুলি ফিরিয়ে দেবে:
$trimmedvals = array();
foreach($vals as $key => $value) {
$value=trim($value, "'");
$trimmedvals[] = $value;
}
এটি উপরের অনেকের মতো, তবে লুপগুলি ছাড়াই আপনাকে ফলাফল দেয় এবং আপনি সত্যই চান এমনটি পান: নির্বাচিত বিকল্পগুলি তৈরি করার জন্য একটি সাধারণ অ্যারে।
বোনাস: এটি সেটের পাশাপাশি ENUM ক্ষেত্রের ধরণের জন্যও কাজ করে।
$result = $db->query("SHOW COLUMNS FROM table LIKE 'column'");
if ($result) {
$option_array = explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $result[0]->Type));
}
$ বিকল্প_আররে: অ্যারে ([0] => লাল [1] => সবুজ [2] => নীল)
আপনি স্ট্রিংটিকে পার্স করতে পারেন যেমন এটি কোনও CSV (কমা বিভাজিত মান) স্ট্রিং was পিএইচপি-তে একটি দুর্দান্ত বিল্ট-ইন ফাংশন রয়েছে যার নাম 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 ফাংশন সম্পর্কে আরও তথ্যের জন্য, পিএইচপি ম্যানুয়ালটি পরীক্ষা করুন: http://uk.php.net/manual/en/function.str-getcsv.php
str_getcsvকেবল পিএইচপি 5> = 5.3.0 এ কাজ করে, আপনি পূর্ববর্তী সংস্করণগুলিতে এই কার্যকারিতাটি পেতে চাইলে আপনি এই ফাইলটি অন্তর্ভুক্ত করতে পারেন।
এই ক্রিস Komlenic এর অন্যতম 8 কারনে মাইএসকিউএল এর ENUM ডাটা টাইপ ইভিল :
৪. স্বতন্ত্র ENUM সদস্যের তালিকা পাওয়া ব্যথা।
খুব সাধারণ প্রয়োজন হ'ল ডাটাবেস থেকে সম্ভাব্য মানগুলির সাথে একটি নির্বাচন-বাক্স পপুলেশন বা ড্রপ ডাউন তালিকা তৈরি করা। এটার মত:
রঙ নির্বাচন করুন:
[ select box ]যদি এই মানগুলি 'রঙ' নামে একটি রেফারেন্স সারণীতে সংরক্ষণ করা হয় তবে আপনার যা দরকার তা হ'ল:
SELECT * FROM colors... যা পরে ড্রপ ডাউন তালিকাটি গতিশীলভাবে তৈরি করতে পার্স করা যায়। আপনি রেফারেন্স সারণীতে রঙগুলি যুক্ত করতে বা পরিবর্তন করতে পারেন এবং আপনার সেক্সি অর্ডার ফর্মগুলি স্বয়ংক্রিয়ভাবে আপডেট হবে। অসাধারণ.এখন দুষ্ট ENUM বিবেচনা করুন: আপনি কীভাবে সদস্য তালিকাটি নিষ্কাশন করবেন? আপনি DISTINCT মানগুলির জন্য আপনার টেবিলের ENUM কলামটি জিজ্ঞাসা করতে পারেন তবে এটি কেবলমাত্র ব্যবহৃত মানগুলি টেবিলে ব্যবহৃত হবে এবং প্রয়োজনীয় সমস্ত সম্ভাব্য মান নয় return আপনি INFORMATION_SCHEMA কে জিজ্ঞাসা করতে পারেন এবং একটি স্ক্রিপ্টিং ভাষার সাহায্যে ক্যোয়ারী ফলাফল থেকে তাদের পার্স করতে পারেন, তবে এটি অহেতুক জটিল। আসলে, আমি কোনও ENUM কলামের সদস্য তালিকাটি বের করার কোনও মার্জিত, খাঁটি এসকিউএল উপায় সম্পর্কে জানি না।
এটি করার আরও আধুনিক পদ্ধতি, এটি আমার পক্ষে কাজ করেছে:
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;
}
পরিণামে, "এনাম ()" থেকে পৃথক হয়ে গেলে এনাম মানগুলি কেবল একটি সিএসভি স্ট্রিং থাকে, সুতরাং এটিকে পার্স করুন!
এখানে 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;
}
লারাভেলের পক্ষে এটি কাজ করেছে:
$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
)
জেসনবার কী বলছে আমি কেবল তা যুক্ত করতে চাই, যখন জিজ্ঞাসা করা হয়েছিল:
SHOW columns FROM table
যদি আপনি অ্যারে হিসাবে ফলাফলটি পান তবে এটি দেখতে এরকম হবে:
array([0],[Field],[1],[Type],[2],[Null],[3],[Key],[4],[Default],[5],[Extra])
যেখানে [এন] এবং [পাঠ্য] একই মান দেয়।
আমি খুঁজে পেয়েছি কোন ডকুমেন্টেশন সত্যই বলা হয়নি। আর কি আছে তা জানার জন্য কেবল ভাল।
$row = db_fetch_object($result);
if($row){
$type = $row->Type;
preg_match_all("/'([^']+)'/", $type, $matches,PREG_PATTERN_ORDER );
return $matches[1];
}
কিছু মডেলের পদ্ধতি হিসাবে কোডিগিটার অ্যাডাপ্টিং সংস্করণ:
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"
}
আপনারা সবাই কিছু অদ্ভুত এবং জটিল রেজেক্স প্যাটার্ন ব্যবহার করেন x)
প্রাগ_ম্যাচ ছাড়া আমার সমাধানটি এখানে:
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()'"));
}
আপনি এই সিনট্যাক্সটি মাইএসকিউএল QUERY এ এনাম সম্ভাব্য মানগুলি পেতে ব্যবহার করতে পারেন:
$syntax = "SELECT COLUMN_TYPY FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = '{$THE_TABLE_NAME}'
AND COLUMN_NAME = '{$THE_COLUMN_OF_TABLE}'";
এবং আপনি মান পাবেন, উদাহরণস্বরূপ: এনাম ('পুরুষ', 'মহিলা')
এটি উদাহরণস্বরূপ 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 একক উদ্ধৃতি হিসাবে এনকোডেড রয়েছে! সুতরাং, উদাহরণস্বরূপ, মান সহ একটি এনাম 'a'হিসাবে এনকোড করা আছে enum('''a''')। ভয়াবহ, তাই না?
ঠিক আছে, সমাধানটি হ'ল মাইএসকিউএল আপনার জন্য ডেটা পার্স করতে ব্যবহার করুন!
যেহেতু প্রত্যেকে এই থ্রেডে পিএইচপি ব্যবহার করছে, তাই আমি এটি ব্যবহার করব। নীচে পূর্ণ কোড দেওয়া হল। আমি এটি পরে ব্যাখ্যা করব। প্যারামিটারটি $FullEnumStringপুরো এনাম স্ট্রিংটি ধারণ করবে, আপনি অন্য যে কোনও উত্তর থেকে যে পদ্ধতিটি ব্যবহার করতে চান তা থেকে নেওয়া হবে। RunQuery()এবং FetchRow()(অ-অ্যাসোসিয়েটিভ) আপনার প্রিয় ডিবি অ্যাক্সেস পদ্ধতির জন্য স্ট্যান্ড ইন।
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.")"(আগে বা পরে কিছুই নেই)। প্রিগ_ম্যাচ ব্যর্থ হলে, NULLফিরে আসবে।
এই preg_matchএছাড়াও স্ট্রিং তালিকা, অদ্ভুত এসকিউএল সিনট্যাক্স মধ্যে পলান সঞ্চয়, $Matches[1]। এরপরে, আমরা এর থেকে প্রকৃত ডেটা পেতে সক্ষম হতে চাই। সুতরাং আপনি কেবল চালান "SELECT ".$Matches[1], এবং আপনার প্রথম রেকর্ডে স্ট্রিংগুলির একটি সম্পূর্ণ তালিকা রয়েছে!
সুতরাং কেবল একটি দিয়ে এই রেকর্ডটি টানুন FetchRow(RunQuery(...))এবং আপনি সম্পন্ন করেছেন।
আপনি যদি এসকিউএল-এ এই পুরো জিনিসটি করতে চান তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন
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 কে এ সম্পর্কে কাউকে কিছু বলা থেকে বিরত রাখতে, না, আমি বিশ্বাস করি না যে এই পদ্ধতিটি এসকিউএল ইঞ্জেকশন নিয়ে যেতে পারে।
সম্ভাব্য মানগুলির তালিকাটি খুব ভালভাবে নথিভুক্ত করা হয়েছে, তবে অন্য উত্তরটি প্রসারিত করে যা প্রথম বন্ধনীতে মানগুলি ফিরিয়ে দিয়েছে , আমি সেগুলি ছিনিয়ে নিতে চেয়েছিলাম আমাকে কমা দ্বারা পৃথক করা তালিকা দিয়ে রেখে যা তখনই যখনই আমি বিস্ফোরিত টাইপের ক্রিয়াকলাপটি ব্যবহার করতে পারি would একটি অ্যারে পেতে প্রয়োজন।
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 অক্ষর মোট তুলনায় ছোট, চিহ্ন প্রথম বন্ধনী সরানোর ব্যবহার করে।
পিএইচপি 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);
এটি অসাধারণ যে কীভাবে আপনারা কেউ ভাবেন নি যে আপনি এনাম ক্ষেত্রটি ব্যবহার করছেন তার অর্থ হ'ল নির্ধারিত মানগুলি "একটি প্রাইরি" হিসাবে পরিচিত।
সুতরাং যদি মানগুলি "একটি প্রাইমারি" জানা থাকে তবে সেগুলি পরিচালনা করার সেরা উপায়গুলি খুব সাধারণ এনুম শ্রেণীর মাধ্যমে।
নিয়ম চুম্বন এবং একটি ডাটাবেস কল সংরক্ষণ করুন।
<?php
class Genre extends \SplEnum {
const male = "Male";
const female = "Female";
}
আমি এইভাবে এনাম মান পেতে পারি:
SELECT COLUMN_TYPE
FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = 'tableName'
AND COLUMN_NAME = 'columnName';
এই স্কয়ারটি চালিয়ে আমি পেয়েছি: এনাম ('বিডিবিএল', 'এবি ব্যাংক')
তারপরে আমি নীচের কোডটি ব্যবহার করে ঠিক মূল্য ফিল্টার করেছি:
preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
var_dump($enum) ;
আউট পুট:
অ্যারে (2) {[0] => স্ট্রিং (4) "বিডিবিএল" [1] => স্ট্রিং (7) "এবি ব্যাংক"}
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');
নির্বাচন করুন নির্বাচন করুন (COLUMN_TYPE, 6, লেন্থ (COLUMN_TYPE) - 6) তথ্য থেকে স্নাতকোত্তর.ক্লামএনএস যেখানে টেবিল_NAME = 'নিবন্ধ' এবং COLUMN_NAME = 'স্থিতি'
এনামের জন্য কাজ করবে না ('', 'এক্স' এক্সএক্স)
এখানে একটি কাস্টম ওয়ার্ডপ্রেস টেবিলের জন্য একটি সমাধান। এটি ENMA মানগুলির (,)মধ্যে কমা ছাড়াই কাজ করবে
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;
}