PDA

View Full Version : چیزی شبیه به dataset توی .net یا ado table



Unique
سه شنبه 14 تیر 1390, 00:37 صبح
سلام

میدونم عنوان سوال زیاد جالب نیست اما چون توی php تازه کار هستم ، همه اصطالحات و کلاس ها را نمیشناسم !

من نیاز به یک object ، کنترل ، کامپوننت یا هر چیزی که توی php بهش می گن دارم تا بتونم مثلا 100 تا رکورد از پایگاه بخونم بعدش بتونم اون را filter ، sort یا پیمایش کنم !

دوستان متوجه باشند من نمیخوام sort یا filter از طریق sql داشته باشم ! روال عمومی توی php اینه که یه query بدی ، بعدش data را fetch کنی آرایه و پیمایش !

فکر کنین query زیر را میدیم :


select a1,a2 from table1

حالا می خواهیم جواب را بدون استفاده از sql فیلتر کنیم !
اگه دوستان متوجه منظور من نمی شوند بگن تا توضیح بدهم !

kavoshgar63
سه شنبه 14 تیر 1390, 09:06 صبح
خب جواب حاصله رو بریز توی آرایه بعد توی پی اچ پی خودت مرتبش کن

Unique
سه شنبه 14 تیر 1390, 15:24 عصر
البته شما تقصیری ندارین که جوابتون اون چیزی نیست که من انتظار دارم ! مشکل از من هستش که بحث sort را بیان کردم !
فکر کن میخواهیم جواب را filter کنیم ! مثلا a1=10 را میخواهیم فیلتر کنیم !
با استفاده از آرایه ها و loop میشه یک فیلتر دستی نوشت ! اما loop توی php خیلی کند هستش و مثلا اگه 1000 تا رکورد باشه زیاد جالب نمیشه ! (من تجربه عملی در این مورد ندارم بر اساس مطالبی که خوندم نظر دادم)
من بعید میدونم php با این حجم وسیع از کلاس هاش چنین قابلیت اساسی را نداشته باشه !

رضا قربانی
سه شنبه 14 تیر 1390, 15:45 عصر
خب یه کم گنگ گفتی عزیز

برای فیلتر کردن ، جواب رو می ریزی توی یه متغیر و کارهای لارم رو با توابع مختلف بر روی متغیر اعمال می کنی و بعد اون متغیر اصلاح شده یا فیلتر شده یا هر کار دیگه ، رو ببر بنداز داخل دستورات sql یا هر جای دیگه .

Unique
سه شنبه 14 تیر 1390, 16:08 عصر
سلام !

جناب قربانی شما باز هم منظور من را متوجه نشدید ! (من گفتم تازه کار هستم ! اما نه صفر کیلومتر ! 10 سال با .net کار وب انجام دادم با php و coldfusion هم آشنایی دارم)

اینجوری نمیشه ! باید اصولی توضیح بدم ! یا اصلا توی php این طرز تفکر وجود نداره یا من مشکل دارم توی توضیحاتم !

جدول زیر را در نظر بگیرین :


table 1
===============
a1 a2
10 a
20 b
30 c
10 d
20 e
20 f

حالا فکر کنین میخواهیم رکورد هایی که مقدار a1=20 هستش را در بیارم ! خوب خیلی راحت داریم :


select * from table1 where a1=20

جوابش را هم fetch میکنیم توی یک آرایه و تمام !

اما اگه بخواهیم ببینیم برای a1=20 , a1=10 , a1=30 چه جوابهای هست ! ب2 تا راه حل داریم :
1 - سه تا query بنویسیم که این خیلی بده چون اگه 40 تا حالت را بخواهی چک کنی باید 40 تا query بنویسی ! این فاجعه ترین روش هست !
2 - یه روش هم اینه که کل جدول را بخونی بعد یکبار پیمایش کنی و با استفاده از یک آرایه دو بعدی ! مقادیر را جدا کنی و بعدش خیلی راحت اطلاعات را از آرایه دو بعدی بکشی بیرون !

اما این روش ها برای اطلاعات با پیچیدگی زیاد تولید query های زیاد یا عملیات پیچیده میکنه !

مثلا توی .net با استفاده از SqlAdapter یک خروجی Dataset میگیرند بعدش با DataView اطلاعات را فیلتر میکنند !

یا توی Delphi با استفاده از TAdoTable یا TAdoQuery اطلاعات را از جدول میگرند و با خصوصیت filter الاعاتشون را فیلتر می کنند !

دیگه تفصیلی تر از این نمیشد توضیح داد !

eshpilen
سه شنبه 14 تیر 1390, 16:10 عصر
یا اصلا توی php این طرز تفکر وجود نداره یا من مشکل دارم توی توضیحاتم !
بله این تفکر وجود نداره. چون در خود PHP بصورت پیشفرض چنین چیزی وجود نداره. حداقل بنده که یادم نمیاد!
اما نه اینکه فکر کنید کتابخانه ای براش نیست. دنبالش بگردید شاید پیدا کنید.
این داستان در نرم افزارهای میکروسافت و ویندوز خیلی بیشتر شناخته شده و مورد استفاده هست چون میکروسافت ADO و الان ADO.NET رو ابداع کرده که جزء پیشفرض و ساختار کتابخانه هاش و فریمورک هاش هست و اونجا راه اصلی و پیشفرض کار کردن با دیتابیس هست و حتی جاهای دیگر هم استفاده شده.

البته فکر نمیکنم برای کارهای ساده نیازی به این بند و بساط باشه. با روشهای دیگه یا حتی بقول کاربران دیگه که میگن بریزید توی متغییر و خودتون فیلتر و Sort و غیره رو پیاده کنید. ضمنا بنظرم 1000 تا رکورد در شرایط معمول در هیچ زبان برنامه نویسی ای مشکلی بحساب نمیاد.

اینا تا جاییکه بنده میدونستم البته!

Unique
سه شنبه 14 تیر 1390, 17:33 عصر
خوب ، پس به صورت پیش فرض چیزی با این مضمون وجود نداره !
راستش دلیل مطرح کردن این بحث اینه که من میخوام یک سری اطلاعات درختی را توی یک Tree نمایش بدم !

احتمالا همه دوستان میدونند که برای این کار دو روش متداول وجو داره !

اولیش : The Adjacency List Mode هستش که نمیدونم دقیقا توی فارسی چی میگن ! اما اضولش اینه که یک جدول با سه تا فیلد دارم id,parent,name که میشه خیلی راحت باهاش یک tree ساخت !
دومیش : Modified Preorder Tree Traversal هستش که توضیحاتش زیاده و اصلا قصد معرفیش را ندارم !

روش اول خیلی مورد استفاده قرار میگیره ! اما زمانی که من خواستم توی php پیاده سازیش کنم متوجه شدم هر بار باید query بدم که این فاجعست !
برای همین این سوال را مطرح کردم !

حالا کسی کتابخانه ای که امکان فیلتر را فراهم کنه یا روشی که باهاش بشه با یک بار query دادن tree را ساخت سراغ داره ؟

eshpilen
سه شنبه 14 تیر 1390, 20:30 عصر
واسه چی هر بار کوئری بدی؟
خودت یه کشی چیزی پیاده سازی کن خب.
من اگر باشم مثلا در اون بخشهایی از کد که جدول مورد استفاده در ساخت Tree رو آپدیت میکنن کدی کار میذارم که هربار بعد از آپدیت کردن جدول یه عدد شمارنده رو هم داخل یک فایل افزایش بدن. به اینصورت کدی که Tree رو میسازه هر وقت خواست ببینه آیا منبع داده ایش تغییر کرده یا نه فقط نیاز داره اون عدد رو با عدد قبلی مقایسه کنه. اگر عدد تغییر کرده بود کوئری مجدد میده و Tree رو آپدیت میکنه، در غیراینصورت Tree رو تغییر نمیده/از روی کش ایجاد میکنه (فرضا دیتایی رو که برای ساختن کوئری لازمه در یک فایل یا سشن یا بعضی وقتا حتی خود صفحه (مثل viewstat در ASP.NET) ذخیره کردیم).
خلاصه در PHP شما کامپوننت ها و سیستم های آماده نداری مثل دات نت، و سطح برنامه نویسی پایینتر هست، اما عوضش برنامه نویسی این چیزا حال میده و آدم چیزی یاد میگیره (و بقول یکی از بزرگان: برنامه نویسی سطح پایین روح برنامه نویسان را جلا میبخشد!!).
البته بعید میدونم اگر بگردی کتابخانه ای فریمورکی چیزی پیدا نکنی که حداقل بعضی از انتظارات دات نتی شما رو برآورده نکنه.

بعضیا اعتقاد دارن برنامه نویسی وب با PHP راحتتره. بنده نمیدونم این تفکر تا چه اندازه صحیح هست یا نیست. ولی بهرحال درمورد پروژه های خیلی سفارشی و غیر کلیشه ای فکر میکنم PHP خوب کار بده. چون در اینطور پروژه ها کدنویسی سفارشی و سطح پایین زیاد هست و کمتر میشه برای همه چیز از کامپوننت های آماده استفاده کرد.

حالا برای من جالبه تجربه و نظر یک برنامه نویس دات نت رو که به PHP اومده بدونم و باهاش در امور فنی تبادل نظر کنم. راستی چی شد شما به PHP روو آوردید؟

Unique
سه شنبه 14 تیر 1390, 21:05 عصر
من خیلی متوجه راه حلت نشدم ! اما با توجه به جستجوی هایی که کردم ! مثل اکثر پیاده سازی ها ! برنامه نویسان php همچنان با آرایه ها پیوند خورده اند ! و کدی پیدا کردم که با یک بار query دادن ! اطلاعات tree را میخونه !
در رابطه با چند بار query دادن هم درست گفتم ! 70% مثال هایی که توی اینترنت در مورد The Adjacency List Mode برای ساختار های tree توی یک دیتابیس هست ! همشون برای نمایش یک جدول به صورت recursive از فراخوانی query های متعدد استفاده کردند ! مثلا :
http://www.sitepoint.com/hierarchical-data-database/

فکر کنم منظور شما این بود که لازم نیست هر بار اطلاعات tree را از جدول بخونم و با ست کردن یک فیلد bit میشه فهمید باید دیتا را دوباره خونی کرد یا نه ! در واقع cache کنیم ! اما من منظورم ساخت همون tree اولیه از روی جدول بود ! حالا اگه خواستیم cache هم میکنیم !

در رابطه با php با این همه امکانات نمیشه گفت زبان سطح پائینی هستش ! در مورد syntax هم چون برنامه نویسی را با pascal یاد گرفتم ! زیاد با c حال نمیکنم و php هم که وام گرفته خدایی هستش از c !

تعصبی اصلا روی زبون ها ندارم ! .net (که البته زبون نیست و framework هستش) برای خودش نقاط ضعف و قوتی داره ! php هم همینطور ! رو آوردن من به php به خاطر علاقه جدیدم به لینوکس بود و اینکه سرویس دهنده های لینوکس خیلی مفت تر و stable تر از ویندوز هستند ! در ضمن برنامه نویسان .net بیش از 90% فکر میکنن visual studio همه انتظاراتشون را بر آورده میکنه ! و برنامه ها را میشه براحتی با رابط گرافیکی و با ست کردن چند تا فیلد تولید کرد ! به همین خاطر اکثرشون اطلاعات زیادی در رابطه با اصول وب ندارن ! من خودم بار ها خواستم دو یا سه تا برنامه نویس .net استخدام کنم ! اما متوجه شدم اگه visual stdeio را ازشون بگیری دیگه قفل میکنن ! این موضوع در رابطه با php کار ها صدق نمیکنه ! چون در حین یادگیری php خیلی از اصول را یاد می گیرن ! مثل asp classic کار ها !

به نظرم php تنها یک ایراد داره ! اونم اینکه نسب به .net که کامپایل میشه (البته به صورت کامل نه) کند تره که البته شاید توی پروژه های خیلی بزرگ کارش را نشون بده ! پروژه هایی نظیر facebook و gmail و از این دسته ! که با توجه به اینکه یه پروژه بزرگ سرویس دهنده اختصاصی میخواد ! پس این کندی را هم میشه یه کاریش کرد ! کلا زبون با حالی هستش ! من که لذت میبرم از کد نویسیش !

eshpilen
سه شنبه 14 تیر 1390, 21:41 عصر
در رابطه با php با این همه امکانات نمیشه گفت زبان سطح پائینی هستش !نسبت به ASP.NET گفتم. چون میشه گفت ASP.NET یک فریمورک کامپوننت گرا هست. اما PHP یک سطح پایینتر از برنامه نویسی کامپوننتی قرار داره. البته بدیهی هست برای PHP هم میشه فریمورک ها و کتابخانه های کامپوننت طراحی کرد (و به گمانم موجود باشه).
ASP.NET رویدادگرا هم هست. درحالیکه PHP ساختار خام داره (حالا خواستی میپزی میخوری خب :لبخند:).


در ضمن برنامه نویسان .net بیش از 90% فکر میکنن visual studio همه انتظاراتشون را بر آورده میکنه ! و برنامه ها را میشه براحتی با رابط گرافیکی و با ست کردن چند تا فیلد تولید کرد ! به همین خاطر اکثرشون اطلاعات زیادی در رابطه با اصول وب ندارن ! من خودم بار ها خواستم دو یا سه تا برنامه نویس .net استخدام کنم ! اما متوجه شدم اگه visual stdeio را ازشون بگیری دیگه قفل میکنن ! این موضوع در رابطه با php کار ها صدق نمیکنه ! چون در حین یادگیری php خیلی از اصول را یاد می گیرن ! مثل asp classic کار ها !اون مشکل از یادگیری خودشونه.
واقعیتش اینه که یادگیری ASP.NET سخت تر و طولانی تر از PHP هست و فقط موقعی میتونی ازش بقدر کافی جواب بگیری که کامل و اصولی یاد گرفته باشی و خوب ساختارش و روش کدنویسی در اون رو شناخته باشی.
اونا اصلا کامل و عمیق یاد نگرفتن.
درمورد PHP هم بقول شما حداقل با طرز کار و ساختارهای پایه آشنایی دارن. ولی بنظر بنده در کل فرق زیادی نمیکنه. برنامه نویس حرفه ای و ناشی و شبه برنامه نویس در همه جا هست.


پروژه هایی نظیر facebook و gmail و از این دسته ! که با توجه به اینکه یه پروژه بزرگ سرویس دهنده اختصاصی میخواد ! پس این کندی را هم میشه یه کاریش کرد ! کلا زبون با حالی هستش ! من که لذت میبرم از کد نویسیش ! facebook که ظاهرا زبان و انجین PHP رو مقداری دستکاری کرده و یه برنامه ای بنام HipHop (http://en.wikipedia.org/wiki/HipHop_%28software%29) هم ساخته که کدهای PHP رو به کد بهینه شدهء سی++ تبدیل میکنه. این کدها کامپایل میشن و در نتیجه با کارایی بالایی (2 تا 6 برابر سرعت PHP) اجرا میشن.
کلا زبون با حالی هستش ! من که لذت میبرم از کد نویسیش ! تقریبا هرکسی باهاش بقدر کافی آشنا بشه و کار کنه همین نظر رو داره.
واقعا ابزار دسته. حتی اگر ASP.NET کار حرفه ای هم باشی بازم PHP در جاهای خاص خودش خیلی مفیده و چیز دیگه ایه. با وجود تمام درپیتی هاش :قهقهه:
اینکه میگم درپیتی جدی میگم. بالاخره آدم با دیدن یکسری نشانه ها متوجه میشه که از اولش طراحیش و روند رشدش خیلی حرفه ای و اصولی نبوده، ولی خب به مرور رشد کرده و هرچی نیاز داشن بهش اضافه کردن، و با همین وضعیت وصله و پینه کلی واسه خودش قدرت و محبوبیت دست و پا کرده. این یه نمونه از موفقیت مدل توسعهء بازمتن هست که آدم میبینه چطور یه چیزی بصورت طبیعی رشد میکنه و بدون اینکه منابع مالی و انسانی زیاد و شرکتهای عظیم پشتش باشه هم میتونه به جایی برسه. حتی توسط افراد و گروههای مستقل و داوطلب.
البته حتی شرکتهای بزرگ تجاری هم بعضی وقتا سوتی های بزرگ و ضایع میدن. بالاخره اونا هم آدمن دیگه!! لزوما که همشون سوپرمن، بهترین، و ضمنا مبرا از خطا نیستن!

MMSHFE
چهارشنبه 15 تیر 1390, 09:22 صبح
آقا كي ميگه فيلتر تو PHP نيست؟


$filter = 0;

function filter($var)
{
global $filter;
return ($var['a1'] == $filter);
}

mysql_connect('localhost', 'root', '');
mysql_select_db('db_name');
$result = mysql_query('SELECT * FROM `table_name` ORDER BY `id`');
for($i = 0; $i < mysql_num_rows($result); $i++)
{
$rows[] = mysql_fetch_assoc($result);
}
$values = array(10, 20, 30, 40, 50);
foreach($values as $value)
{
$filter = $value;
echo '<pre>'."\n";
print_r(array_filter($rows, 'filter'));
echo '</pre>'."\n";
}

واسه مرتب سازي هم كه PHP تا دلتون بخواد تابع داره.
راستي، واسه The Adjacency List Mode هم من ترجمه "فهرست همسايگي" رو انتخاب كردم كه به نظرم مناسب مياد. :لبخندساده:
موفق باشيد.

Unique
چهارشنبه 15 تیر 1390, 12:39 عصر
روش شما درسته ! و فیلتر توی php را میشه به همین راحتی انجام داد ! (البته خیلی کند هستش نسبت به فیلتری که توی dataset برای .net framework وجود داره !)
من در رابطه با نمایش tree به یک جواب بهتر رسیدم و اون استفاده از یک تابع دو بعدی هستش که در این حالت مقایسه های تک به تک اعضای آرایه کاملا از بین میره ! و سرعت به صورت چشم گیری افزایش پیدا میکنه !

eshpilen
چهارشنبه 15 تیر 1390, 18:27 عصر
لازم نیست هر بار اطلاعات tree را از جدول بخونم و با ست کردن یک فیلد bit میشه فهمید باید دیتا را دوباره خونی کرد یا نه !
با یه بیت یعنی چطوری دقیقا؟
راستی این tree دقیقا چی هست مثلا؟

Unique
پنج شنبه 16 تیر 1390, 02:51 صبح
ببخشین من خیلی اهل توضیح دادن نیستم ! شاید بعضی چیز ها گنگ به نظر برسه !
منظور از tree یک مدل درختی مثل دایرکتوری ها و فایل های یک درایو هستش ! میخواستم با The Adjacency List Mode یک همچین ساختاری را توی php اجرا کنم ! هر جای اینترنت که گشتم دیدم همشون دارن با یک روتین recursive و فراخوانی query ها برای هر parent این سیستم را اجرا می کنند ! من توی .net با یک بار فراخونی کل اطلاعات از جدول و استفاده از dataset و dataview , توی یک روتین recursive این کار را می کردم !توی php متوجه شدم چیزی مثل dataview یا dataset یا فیلتر AdoTable وجود نداره ! اینجا سوال کردم !

روش MMSHFE کاملا جواب میده ولی کنده ! بهترین کار اینه که کل دیتا را بریزی توی یک ارایه 2 بعدی ! که بعد اول parent هستش و بعد دوم یک ارایه از مشخصات node (مثل id,name) حالا با یک تابع recursive مدل tree را میسازی !
بابت کمک دوستان هم ممنون !