PDA

View Full Version : آموزش: Class ها و ابزارها و تکنیک های کاربردی در PHP



Keramatifar
پنج شنبه 31 اردیبهشت 1394, 04:47 صبح
با درود فراوان
در این تاپیک نحوه نوشتن انواع Class ها و کامپوننت هایی که برای برنامه نویسی در PHP کاربرد فراوانی دارند را آموزش خواهم داد
همچنین کلاس ها و ابزارهایی که در سایت های تخصصی مانند phpclasses.org یا github ارائه شده اند را بررسی، معرفی خواهم کرد.

ویرایش: به عنوان تاپیک بحث تکنیک های کاربری PHP هم اضافه شد

لیست موارد این تاپیک


پروژه SPGEN (http://barnamenevis.org/showthread.php?495890-Class-%D9%87%D8%A7-%D9%88-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-PHP&p=2222579&viewfull=1#post2222579)MySql Stored Procedure and PHP Model Generator (http://barnamenevis.org/showthread.php?495890-Class-%D9%87%D8%A7-%D9%88-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-PHP&p=2222579&viewfull=1#post2222579)
کاربرد Transaction ها در برنامه نویسی (http://barnamenevis.org/showthread.php?495890-Class-%D9%87%D8%A7-%D9%88-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-PHP&p=2224894&viewfull=1#post2224894)

Keramatifar
پنج شنبه 14 خرداد 1394, 03:38 صبح
پروژه SPGEN
MySql Stored Procedure and PHP Model Generator
قبلا در مورد مزایای Stored Procedure خیلی بحث شده که با کمی جستجو در انجمن می تونید مطالب بسیار خوبی پیدا کنید
اما به هر حال نوشتن این SP ها تا حدودی وقت گیر است، چه برسد به زمانیکه بخواهیم فایل DAL یا Data Access Layer که با PDO کار می کند و جهت فراخوانی این StoredProcedure ها هست را هم بنویسیم
یادمه حدود 3 سال پیش توی اولین اولین ترم کلاس از

کارگاه عملی eShop با PHP MVC و OOP (http://barnamenevis.pro/academy/course/phpeshop/org)

ایده نوشتن برنامه ای که به صورت خودکار برای هرجدول پنج SP استاندارد و کلاس DAL مربوط به آن را تولید میکند رو که مدت ها تو ذهنم بود،با دانشجوها مطرح کردم که با استقبال اونها همراه شد و نتیجه اش پروژه ای به نام SPGEN شد
لینک پروژه در GitHub (https://github.com/Keramatifar/MySql_spGen)

Keramatifar
سه شنبه 19 خرداد 1394, 13:32 عصر
کاربرد Transaction ها در برنامه نویسی
یکی از ابزارهای فوق العاده سودمند در کار با بانک های اطلاعاتی Transaction ها هستند، اما متاسفانه بدلیل ضعف در مطالعه یا منابع، استفاده از Transaction ها را کمتر مشاهده می کنیم
معمولا در برابر اصرار بر اشتباه و ادامه آن، در منطق پیاده سازی و کدنویسی، یک ماژول یا عدم تمایل به ایجاد تغییرات در نحوه اجرا، مقاومت بخصوصی از طرف برنامه نویس مربوطه وجود دارد
بنابراین بجای سبد خرید و ماژول های دیگر، مثال "حساب بانکی" را مطرح میکنم که روش عقلانی دیگری برای پیاده سازی آن وجود ندارد، و هیچ توجیهی برای عدم استفاده از Transaction در پیاده سازی پذیرفته نیست

حساب بانکی شخصی، از نوع حساب جاری که دارای دسته چک است را در نظر می گیریم
موجودی فعلی: 2.000.000 ریال
چک به تاریخ امروز: 1.000.000 ریال
مبلغ کل یک فاکتور فرضی: 1.000.000 ریال
کارمزد کارت به کارت بانکی: 7.000 ریال
در نظر بگیرید این شخص رفته جلوی عابر بانک و می خواهد مبلغ فاکتور را بصورت کارت به کارت پرداخت کند، فرآیند تکمیل شده و به مرحله آخر رسیده:
"در صورت صحت اطلاعات دکمه تایید را فشار دهید"
همون موقع هم چک روز به مبلغ 1.000.000 ریال داخل شعبه در حال نقد شدن است و به باجه صندوق رسیده

حالات ممکن:
اگر صندوقدار زودتر دکمه تسویه رو بزنه:
چک پاس میشه و موجودی حساب میشه: 1.000.000 ریال
بنابراین وقتی شخص جلوی عابر بانک دکمه تایید رو می زنه پیغام "عدم وجود موجودی کافی" رو می بینه، چرا؟
مبلغ فاکتور + کارمزد کارت به کارت بانک < موجودی فعلی (بعد از پاس شدن چک)
1.000.0000 +7.000 > 1.000.000

اگر شخص جلوی عابر بانک زودتر دکمه تایید رو بزنه:
صندوقدار بانک با پیام "برگشت چک به دلیل عدم تامین موجود کافی" روبرو میشه، چرا؟
موجودی فعلی حساب (بعد از انتقال کارت به کارت) < مبلغ چک
1.000.0000 +7.000 > 1.000.000

اما به هر حال این وسط کلی Query روی جدول های مختلف اجرا شده و داده هایی تغییر پیدا کردن تا به مرحله آخر برسه، تکلیف اونها چی میشه؟
طبق تعریف کلی Transaction دارای خاصیتی است به نام ACID سرنام Atomicity Consistency Isolation Durability
همچنین دستورات RollBack و Commit
وقتی در انتهای Trans همه چیز درست باشد شما commit را فراخوانی می کنید و عملیات ثبت نهایی می شود
در صورت بروز هرگونه مشکلی در هر قسمتی از کوئری، با اجرای دستور RollBack کلیه تغییرات به ترتیب به حالت اولیه بر می گردند (Ctrl + Z خودمون)

در قسمت بعدی نحوه استفاده از Transaction ها رو در PHP و MySql آموزش خواهم داد

Keramatifar
سه شنبه 19 خرداد 1394, 14:29 عصر
کامپوننت Treeview برای PHP


از TreeView معمولا برای نمایش ساختار Hierarchy استفاده می شود.
Hierarchy یا سلسله مراتبی، روشی در طراحی جداول بانک اطلاعاتی است
در این نوع طراحی دیتابیس، جدول دارای فیلدی است که با خود جدول دارای Relation از نوع One-To-Many است
مثال:


ParentID

CategoryTitle

ID



Null

نرم افزار

1



Null

سخت افزار

2



2

مانیتور

3



3

مانیتور ال سی دی

4




همانطور که مشاهده می کنید فیلد ParentID برای سرگروه ها مقدار Null دارد و به ازای هر زیرگروه ID سرگروه در آن قرار می گیرد.
معمولا این نوع جداول توسط کامپوننت Treeview (سلسله مراتبی) در برنامه نویسی نمایش داده می شود



لینک پروژه در phpclasses (http://www.phpclasses.org/package/7040-PHP-Display-a-collapsible-tree-from-a-MySQL-query.html)

Keramatifar
چهارشنبه 20 خرداد 1394, 22:02 عصر
مفهوم تراکنش (Transaction) در دیتابیس

تغییرات بانک اطلاعاتی معمولا ناشی از اتفاقات واقعی، مانند دریافت یک سفارش جدید از مشتری، انتقال وجه از حسابی به حسابی دیگر و امثال آن می باشد. در حقیقت، دریافت یک سفارش جدید تنها یک مورد تغییر در بانک اطلاعاتی نمی باشد.

بلکه باعث تغییرات چندگانه در بانک اطلاعاتی میشود:
۱- سفارش جدید در جدول سفارشات اضافه می شود.
۲- اعتبار مالی مشتری به اندازه سفارشی که داده است کاهش پیدا می کند.
۳- موجودی آن کالایی که سفارش داده شده است کاسته می شود.
۴- تعداد کل محصولات سفارش داده شده تغییر می کند.
۵- کل فروش ها برای دفتر مربوط به فروشنده تغییر می کند.

نکته ی مهم این مثال آن است که عملی که در ظاهر یک عمل ساده و غیر قابل تجزیه (اتمی) به نظر می رسد یعنی دریافت یک سفارش از مشتری، واقعا ۵ عمل به هنگام سازی روی بانک اطلاعاتی یعنی یک عمل INSERT و چهار عمل UPDATE است. علاوه بر این، بانک اطلاعاتی بین این چند عمل به هنگام سازی، حالت پایدار و سازگاری ندارد و به طور موقت، قیدهایی را نقض می کند مثلا بین عمل ۱ و ۲، سفارش مشتری ثبت شده اما اعتبار مالی مشتری کاهش پیدا نکرده است.


توجه: این تغییرات بستگی به طرح کلی بانک اطلاعاتی شما دارد. ممکن است در ساختار مورد نظر شما تنها تغییر اول ضروری باشه یعنی ثبت سفارش جدید. و موارد دیگر را توسط پرس و جو بدست آورد. بطور نمونه برای بدست آوردن اعتبار مالی فعلی مشتری کافیه جمع مبلغ خرید را بدست آورده و از اعتبار اولیه کم کنیم.


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

به این ترتیب باید در بانک اطلاعاتی یک تناسب “همه یا هیچ” باشد. SQL بطور دقیق این قابلیت را از طریق پردازش تراکنش ارائه می دهد. که موضوع این سری مقالات آموزشی را تشکیل می دهد.

مورد دیگری که می توان در این راستا به آن اشاره کرد انتقال وجه بین دو حساب است. در اینجا مبلغی از حساب شما کسر و به حساب دیگری واریز می شود. در این فرایند، تراکنش این تضمین را می دهد که این میانه راه از بین نرود و یکی را طلب کار و دیگری را بدهکار کند (مثلا پول از حساب شما کسر ولی به حساب طرف واریز نشود یا برعکس)


تراکنش چیست؟
تراکنش یک یا چند دستور SQL می باشد مثل به روزرسانی، درج و یا حذف یک یا چندین سطر از داده ها که با همدیگر یک واحد منظقی از کار را شکل می دهند. این دستورات SQL که شکل دهنده ی تراکنش هستند، نوعا کاملا مرتبط به هم هستند و اعمال وابسته به هم را انجام می دهند. هر دستور در تراکنش قسمتی از یک کار را انجام می دهد، اما برای تکمیل کار، همه ی دستورات مذکور ضروری هستند.

گروه بندی دستورات بعنوان یک تراکنش به RDBMS می گوید که کل دستورات باید بطور خودکار اجرا شوند؛ در واقع همه ی دستورات باید بطور کامل اجرا شوند تا بانک اطلاعاتی حالت ثبات خود را حفظ کند.

بنابراین، واحد منطقی از کار (یعنی یک تراکنش) الزاما تنها یک عمل بانک اطلاعاتی نیست بلکه دنباله ای از چند عمل است که در حالت کلی، یک حالت سازگار از بانک اطلاعاتی را به یک حالت سازگار دیگر تبدیل می کند بدون آنکه در تمام نقاط میانی لازم باشد بانک اطلاعاتی در حالت سازگار باشد.

مثال های متعددی می شود برای تراکنش زد در ادامه به یک مورد اشاره میکنم:
افزودن یک سفارش: برای پذیرش سفارش یک مشتری، برنامه ورود سفارش باید (الف) جدول Products را مورد بازیابی و پرسش قرار دهد تا اطمینان حاصل شود که محصول سفارش شده موجود است یا خیر (ب) جدول Customers را مورد پرس و جو قرار می دهد تا مطمئن شود که آیا مشتری به اندازه ای که می خواهد سفارش دهد اعتبار مالی دارد یا خیر (ج) در صورت حصول اطمینان از دو مورد قبل سفارش را به جدول Orders وارد کرده (د) جدول Products را بروز در آورده، یعنی مقدار سفارش را از کل تعداد محصول کم کند (ه) جدول Employee را بروز در آورده، یعنی مقدار سفارش را به کل فروشهای فروشنده ای که سفارش را پذیرفته است اضافه کند و سایر به هنگام سازی های مورد نیاز دیگر.


در تراکنش فوق چند عمل، که هر یک مشتمل بر یک دستور مجزای SQL می باشد، مورد نیاز است تا تراکنش منطقی مجزایی را اجرا نماید. مفهوم تراکنش برای برنامه هایی که یک بانک اطلاعاتی را بروز در می آوردند، بسیار حساس می باشد، زیرا جامعیت یک بانک اطلاعاتی را تضمین می کند.
یک DBMS که بر مبنای SQL واقع شده است قرارداد زیر درباره ی دستورات در یک تراکنش را در پی دارد:


تراکنش در SQL

132119

همانطور که از نمودار پیداست. هنگامی که برنامه با خطایی مواجه می شود DBMS تمام تغییرات را برگردانده و وضعیت را به زمانی که تراکنش آغاز شده بود می گرداند. در مورد مشکل سخت افزاری نیز همین اتفاق می افتد.


بدیهی است در حالت ایده آل نمی توان تضمین کرد که تمام به هنگام سازی ها انجام شود. متاسفانه، چنین تضمینی نمی تواند فراهم شود زیرا همیشه این امکان وجود دارد که کارها به خوبی پیش نرود و اندکی بعد، سیستم دچار اشکال شود. برای مثال، ممکن است از کار افتادن سیستم بین عملیات اتفاق بیفتد یا هنگام اجرای عمل UPDATE، سرریزی محاسباتی اتفاق بیفتد و غیره.

اما سیستمی که از مدیریت تراکنش پشتیبانی می کند چنین تضمینی را فراهم می کند. به ویژه این که تضمین می کند اگر تراکنشی، به هنگام سازهایی را اجرا کند و قبل از رسیدن به پایان تراکنش، به هر دلیلی سیستم دچار خرابی شود آنگاه به هنگام سازی ها نادیده گرفته می شود. بنابراین، تراکنش باید به طور کامل اجرا شود یا به طور کامل لغو شود.


دستورات Transaction
ابتدا اجازه دهید مدل تراکنش در استاندارد ANSI/ISO را مورد بررسی قرار داده سپس دستورات مدیریت تراکنش در محصول تجاری SQL مورد نظر یعنی SQL Server را با هم مرور میکنیم.


SQL تراکنش های بانک اطلاعاتی را از طریق دو دستور پرازش تراکنش ساپورت می کند:

۱- دستور COMMIT خاتمه ی موفقیت آمیز یک تراکنش را اعلام می کند. این دستور به DBMS می گوید که مبادله تکمیل شده است؛ تمام دستوراتی که دربرگیرنده تراکنش هستند اجرا شده اند، و بانک اطلاعاتی باثبات می باشد.

۲- دستور ROLLBACK اعلام می کند که یک تراکنش با موفقیت به پایان نرسیده است. این دستور به DBMS می گوید که کاربر نمی خواهد تراکنش کامل شود؛ بلکه DBMS باید تمام تغییرات انجام شده روی بانک اطلاعاتی در طی تراکنش را برگرداند. در واقع، DBMS بانک اطلاعاتی را به همان حالتی بر می گرداند که قبل از شروع تراکنش بوده است.

دستورات COMMIT و ROLLBACK، مانند دستورات SELECT، INSERT و UPDATE، دستورات قابل اجرای SQL هستند.


استاندارد ANSI/ISO یک مدل برای تراکنش در SQL و نقش دستورات COMMIT و ROLLBACK تعیین کرده است. تقریبا بیشتر محصولات تجاری SQL از این مدل تراکنش، که بر اساس DB2 می باشد، استفاده می کنند. این استاندارد مشخص می کند که یک تراکنش در SQL بطور خودکار با اولین دستوری که توسط کاربر یا برنامه اجرا می شود، آغاز می گردد.


تراکنش از طریق دستورات بعدی SQL ادامه پیدا می کند تا اینکه با یکی از چهار مورد زیر خاتمه یابد:

۱- یک دستور COMMIT عمل تراکنش را با موفقیت به اتمام می رساند و تغییرات بانک اطلاعاتی را کامل می سازد. بلافاصله بعد از دستور COMMIT یک تراکنش جدید شروع می شود.

۲- یک دستور ROLLBACK با برگشت دادن تغییرات بانک اطلاعاتی، تراکنش را ناتمام می گذارد. بلافاصله بعد از دستور ROLLBACK یک تراکنش جدید آغاز می گردد.

۳- همچنین خاتمه موفقیت آمیز برنامه باعث خاتمه ی تراکنش می شود، دقیقا مانند این که دستور COMMIT اجرا شده باشد. از آنجایی که برنامه پایان یافته است، تراکنش دیگری برای شروع وجود ندارد.

۴- همچنین خاتمه غیر طبیعی برنامه تراکنش را ناتمام می گذارد، دقیقا همانطور که دستور ROLLBACK اجرا می شد. در این مورد هم، چون برنامه پایان یافته است، تراکنش جدید و دیگری برای شروع وجود ندارد.