Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

مطالب همینجوری

بر و بچ

MyView TakhteShasi Tween

دوستشون دارم

بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:128

گرفتن مقدار فیلدهای Enum و Set در MySQL
۲۳ تير ۱۳۸۹ ساعت ۱۱:۵۸

پی اچ پی
بیرون کشیدن لیست Enum و Set از دیتابیس

یکی از روشهای ذخیره اطلاعات در MySQL استفاده از لیست از قبل تعیین شده است که کنترل کنیم فقط کلمات خاصی قابل ذخیره و بازیابی باشند. مثلا جدول زیر:

CREATE TABLE boplo_categories (
	`id` INT(10) AUTO_INCREMENT PRIMARY_KEY,
	`categories` ENUM('PHP', 'Web Design', 'MODx', 'IT', 'Scratch'),
	`tags` SET('Solution', 'API', 'AJAX', 'CSS', 'Javascript')
)

در این جدول، ستون categories که از نوع ENUM تعیین شده، حتما با یکی از مقادیر مشخص شده می تونه پر بشه.
و ستون tags که از نوع SET ایجاد شده مانند ENUM عمل می کنه با این تفاوت که در این ستون میشه بیشتر از یکی از موارد لیست رو ثبت کرد مثلا هم CSS و هم Solution ولی ENUM فقط یک مقدار میتونه داشته باشه.

کار با ENUM و SET خیلی لذتبخشه غیر از موقعی که بخوایم لیستی که در ENUM یا SET مشخص شده رو در برنامه امون داشته باشیم. معمولترین کاردبردش ساختن <SELECT> براساس مقادیر مشخص شده است. برای اینکار باید ابتدا لیست مقادیری که بصورت ENUM یا SET مشخص شده رو توسط یک کوئری بدست بیاریم و سپس کلمات لیست رو از این مقدار خارج کنیم. مثلا میخوایم لیست کلمات مشخص شده برای ستون categories که بالا قرار دادم رو بدست بیاریم:

$sql = "
	SELECT COLUMN_TYPE 
	FROM INFORMATION_SCHEMA.COLUMNS 
	WHERE 
		TABLE_NAME = 'boplo_categories' 
		AND COLUMN_NAME = 'categories'
";
$row = mysql_fetch_row( mysql_query($sql) );
$list = $row[0];

تا اینجا متغیر list$ حاوی مقدار زیر خواهد بود:

enum('PHP','Web Design','MODx','IT','Scratch')
اصل کار کوئری بود. حالا برای Enum، توسط تابع substr شش تا کاراکتر اول این مقدار و دو کاراکتر آخرش رو حذف می کنیم:
$list = substr($list, 6, -2);
که list$ به این تبدیل میشه:
PHP','Web Design','MODx','IT','Scratch
در آخر توسط تابع explode لیست رو به آرایه تبدیل می کنیم:
$array = explode("','", $list);

کد زیر نمونه کامل این مراحل هست که چک می کنه، لیست SET رو هم بازیابی می کنه:

$tableName = 'boplo_categories';
$columnName = 'categories';

$sql = "
	SELECT COLUMN_TYPE 
	FROM INFORMATION_SCHEMA.COLUMNS 
	WHERE 
		TABLE_NAME = '$tableName' 
		AND COLUMN_NAME = '$columnName'
";
$row = mysql_fetch_row( mysql_query($sql) );
$list = $row[0];

if(substr($list,0,3) == 'set')
	$list = substr($list, 5, -2); // Remove Prefix and Suffix
if(substr($list,0,4) == 'enum')
	$list = substr($list, 6, -2); // Remove Prefix and Suffix

$array = explode("','", $list); // Split to array

print_r($array);

و کد زیر، نمونه جمع و جور این مراحل به شکل یک تابع کم حجمه:

/**
 * Get ENUM and SET dataset lists
 * @author AHHP
 *
 * @param string $table Table name.
 * @param string $column Column name which is ENUM or SET.
 * @return array Set of data as an array.
*/
function mysql_get_dataset($table, $column) {
	list($list) = mysql_fetch_row(
		mysql_query("
			SELECT COLUMN_TYPE 
			FROM INFORMATION_SCHEMA.COLUMNS 
			WHERE 
				TABLE_NAME = '$table' 
				AND COLUMN_NAME = '$column'
		")
	);
	if(substr($list,0,3) == 'set') $start = 5;
	if(substr($list,0,4) == 'enum') $start = 6;
	return explode("','",substr($list, $start, -2));
}

$array = mysql_get_dataset('boplo_categories', 'categories');
print_r($array);

خروجی هر دو نمونه بالا، مقدار زیر خواهد بود:

Array
(
    [0] => PHP
    [1] => Web Design
    [2] => MODx
    [3] => IT
    [4] => Scratch
)

مؤید باشید

 

تو چی فکر می کنی؟


Hesam : اون بالا تو آموزش گفتید 6 تا از اول 2 تا از آخر بعد تو کدی که نشون دادین نوشتید :
$list = substr($list, 5);
$list = substr($list, 0, -2);
d
.
.
.
.
و حالا اگر اون کد بالا رو به این شکل در بیاریم غلط میشه ؟ :
$list = substr($list, 6, -2);
d
(1 سال و 6 ماه و 28 روز و 15 ساعت و 13 دقیقه پیش)

امیرحسین : ممنون از نکته ای که اشاره کردید.
من کدها رو براساس این نکته تغییر دادم.
(1 سال و 6 ماه و 28 روز و 13 ساعت و 14 دقیقه پیش)

مهدی : سلام!
نکته خیلی جالبی بود! خیلی لازمش داشتم! ممنونم ازت!
(1 سال و 6 ماه و 1 روز و 21 ساعت و 59 دقیقه پیش)

meysam : با سلام
تشکر از مقاله مفیدت
خارج از بحث این رو ذکر کنم که استفاده از enum و Set روی دیتابیس های معمولی تا به سنگین و مخصوصا برای سایت های بزرگ سربار روی دیتابیس ایجاد میکنه که خطرناک هستش
ترجیحا باید از کد نویسی سمت سرور برای چک کردن مقادیر استفاده کرد
در ضمن مطلبت مفید بود
(1 سال و 1 ماه و 7 روز و 10 ساعت و 5 دقیقه پیش)

امیرحسین : ما برای اینکار یک کوئری اجرا کردیم. مسلما نسبت به کدهای استاتیک کندتر خواهد بود.
این فقط یک راهکار برای حالتهای خاص بود.
(1 سال و 1 ماه و 3 روز و 10 ساعت و 45 دقیقه پیش)

یک دوست : salam agha amir hosein .
khoneye mofido khobi darin.
saitetunam jalebo ghashangi darin.
(11 ماه و 19 روز و 11 ساعت و 5 دقیقه پیش)

 

me

امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
خلاصه اینجا خونه منه،

به خونه امیرحسین خوش اومدی...

MODx | Template World