آموزش MVC | دوره آموزشی MVC در PHP | آموزش PHP و نوشتن به زبان MVC | جزوه آموزشی MVC در PHP و ... همگی اسامی است که می توانید به محتوای این مقاله مرتبط کنید ، در این مقاله آموزشی جامع ما سعی می کنیم به بهترین شکل بصورت جزوه آموزشی به شما برنامه نویسی MVC در PHP را به زبان ساده آموزش بدهیم اما به شما پیشنهاد می کنیم برای یادگیری بهتر به قسمت دوره های آموزشی توسینسو و آموزش PHP بروید و بصورت اصولی و اساسی PHP و MVC را آموزش ببینید.
توی این آموزش میخوام MVC از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .
برای یادگیری زبان برنامه نویسی پی اچ پی ، می توانید به دوره آموزش PHP در این لینک مراجعه کنید
MVC مخفف Model View Controller هست که Model واسه کار با دیتابیس، پعنی تو این قسمت هرکاری که میخوایم روی دیتابیس انجام بدیم اینجا کدشو مینویسیم، توی قسمت View کدهایی رو مینویسیم که میخوایم توی خروجی نمایش داده بشن، مثلا کدهای قالب وب سایت رو تو این قسمت میزاریم یا اگه یه صفحه ثبت نام توی وب سایتمون داشته باشیم باید توی صفحه ثبت نام از تگهای img , input , ... استفاده کنیم پس واسه اینکه این تگها نمایش داده بشن باید اونارو توی قسمت view بنویسیم
قسمت controller هم کنترل میکنه شرط ها ، توابع ، ورودی و خروجی هارو یعنی موقعی که کاربری چیزی از وب سایتمون درخواست میکنه، اون درخواست ابتدا توسط controller چک میشه و اگه لازم باشه درخواست رو میفرسته به model وگرنه درخواست به view فرستاده میشه، حالا اگه درخواست به Model فرستاده بشه ، model نسبت به درخواستی که کاربر داره روی دیتابیس اعمالی رو انجام میده و نتیجه درخواست رو برمیگردونه به controller و اون هم جواب رو میفرسته به view تا نتیجه به کاربر نمایش داده بده .
توضیح دادن اینا یکم سخته ولی موقعی که به کد نویسی رسیدیم همه چیزو متوجه میشید . من از برنامه 11 DreamWeaver واسه جایی که توش کد نوسی انجام میدیم استفاده میکنم و یه برنامه دیگه به اسم Wamp هم احتیاج دارید که بتونید از برنامه کاربردی خودمون خروجی بگیریم . پس واسه ابتدای کار برنامه DreamWeaver و Wamp نصب و بازشون میکنیم
توی DreamWeaver روی new site کلیک میکنیم و یه برنامه وب جدید درست میکنیم به این صورت که اسم برنامه و مسیرشم وارد میکنید بعد روی servers کلیک میکنید و بعد روی دکمه + کلیک میکنید تا یه صفحه براتون باز بشه ، بعدش تو قست connect using گزینه local//network انتخاب میکنید و مقدار server name و server folder و web url رو به ترتیب اسم برنامه ، مسیر برنامه و http:////127.0.0.1//WebApplicationName قرار میدید (بجای WebApplicationName اسم برنامه خودتونو قرار بدید)
بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .
خوب تگ body بصورت زیر تغییر میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)
میبینید که توی browser کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .
خروجی بصورت زیر نمایش داده میشه .
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد .
ولی الان به این شکل هست ،
پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .
تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه .
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
ErrorDocument 404 //error_pages//404.html
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
Redirect //olddir// http:////www.yourdomain.com//newdir//index.html
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
کد page.php:
ادامه کد:
توی تگ style کدهای css هست (اگه شد بعداً یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن .
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
username:password
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
username:password
username:password
username:password
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
http:////www.htaccesstools.com//htpasswd-generator
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه
اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .
ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید .
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
order allow,deny deny from 123.45.6. allow from all
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
order allow,deny allow from 162.1.1.1 deny from all
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ،
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> welcome </body> </html>
و حالا این کد توی .htaccess مینویسم .
DirectoryIndex index.html
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
خوب حالا اگه کدمونو به این صورت نوشته بودیم
DirectoryIndex index.html index.cgi index.php
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .
6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره) و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
IndexIgnore *.txt
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم
IndexIgnore *.txt *.jpg
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
IndexIgnore *
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
Options +Indexes
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
Options -Indexes
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
http://www.htaccess-guide.com
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
Options -indexes ErrorDocument 401 http://127.0.0.1/PHP-MVC/ ErrorDocument 403 http://127.0.0.1/PHP-MVC/ ErrorDocument 404 http://127.0.0.1/PHP-MVC/ ErrorDocument 500 http://127.0.0.1/PHP-MVC/
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
Options +FollowSymlinks RewriteEngine on Options -indexes ErrorDocument 401 http://127.0.0.1/PHP-MVC/ ErrorDocument 403 http://127.0.0.1/PHP-MVC/ ErrorDocument 404 http://127.0.0.1/PHP-MVC/ ErrorDocument 500 http://127.0.0.1/PHP-MVC/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ، $(*.)^ یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<?php echo $_GET['url']; ?>
بصورت شکل زیر :
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
echo '<br>'.$_GET['b'];
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید :
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; $url = $_GET['url']; $url = explode('/', $url); print_r($url); ?>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر / و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; $url = $_GET['url']; $url = explode('/', $url); //print_r($url); if(!file_exists("Controllers/".$url[0].".php")) { echo "Not Found Page"; } ?>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; if(!isset($_GET['url'])) { $url = 'index'; } else { $url = $_GET['url']; } $url = explode('/', $url); //print_r($url); if(!file_exists("Controllers/".$url[0].".php")) { echo "Not Found Page"; } ?>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم .
توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<?php class Bootstrap { function __construct() { } }
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<?php class Bootstrap { function __construct() { if(!isset($_GET['url'])) { $url = 'index'; } else { $url = $_GET['url']; } $url = explode('/', $url); //print_r($url); if(!file_exists("Controllers/".$url[0].".php")) { echo "Not Found Page"; } } }
کدهای php صفحه index.php :
<?php require("libs/Bootstrap.php"); $app = new Bootstrap(); ?>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$ .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<?php class About { function __construct() { echo "<br>Page About "; } }
کد Index.php :
<?php class Index { function __construct() { echo "<br>Page Index "; } }
کد Login.php :
<?php class Login { function __construct() { echo "<br>Page Login "; } }
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
if(!file_exists("Controllers/".$url[0].".php")) { echo "Not Found Page"; } else { $file = "controllers/".$url[0].".php"; require($file); $controller = new $url[0](); }
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
else { $file = "controllers/".$url[0].".php"; require($file); $controller = new $url[0](); $controller->$url[1](); }
کد About :
<?php class About { function __construct() { echo "<br>Page About "; } function AboutMe() { echo '<br>........About Me..........<br>'; } }
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
else { $file = "controllers/".$url[0].".php"; require($file); $controller = new $url[0](); if(!empty($url[1])) { $method_name = $url[1]; if(method_exists($controller, $method_name)) { $controller->$method_name(); } else { echo "<br>method not found<br>"; } } }
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام methodname$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع methodexists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر "." میزاشتیم و بعد نام تابع، ولی اینجا به جای "." از "<-" استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
function AboutMe($str = false) { if($str == true) { echo '<br>........'.$str.'..........<br>'; } else { echo '<br>........About Me..........<br>'; } }
یا هم بصورت زیر :
function AboutMe($str = '') { if(empty($str) == false) { echo '<br>........'.$str.'..........<br>'; } else { echo '<br>........About Me..........<br>'; } }
کد Bootstrap :
if(!empty($url[1])) { $method_name = $url[1]; if(method_exists($controller, $method_name)) { if(!empty($url[2])) { $parametr = $url[2]; $controller->$method_name($parametr); } else { $controller->$method_name(); } } else { echo "<br>method not found<br>"; } }
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
امیدوارم از این قسمت هم استفاده لازم برده باشید .
خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :
<?php class Controller { function __construct() { echo "<br>Main Controller<br>"; } }
متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)
class Login extends Controller
توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :
<?php require("libs/Controller.php"); require("libs/Bootstrap.php"); $app = new Bootstrap(); ?>
فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه)
function __construct() { parent::__construct(); echo "<br>Page Login "; }
متونستیم بجای اینکه بنویسیم
parent::__construct();
این کد رو بنویسیم (هیچ فرقی نمیکنه)
Controller::__construct();
خوب حالا یه بار دیگه تست میکنیم :
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)
<?php class View { function __construct() { echo "<br>we are in page View"; } }
تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :
function __construct() { echo "<br>Main Controller<br>"; $this->view = new View(); }
یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :
<?php require("libs/Controller.php"); require("libs/view.php"); require("libs/Bootstrap.php"); $app = new Bootstrap(); ?>
و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> <div> <ul> <li> <label>نام کاربری : </label> <input type="text" id="txt_User" name="txt_User" /> </li> <li> <label>رمز عبور : </label> <input type="text" id="txt_Pass" name="txt_Pass" /> </li> <li> <input type="submit" id="btn_Login" name="btn_Login" /> </li> </ul> </div> </body> </html>
کد Index.php توی فولدر Index :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> ...........Page Index........... </body> </html>
کد Index.php توی فولدر About :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> ...........Page About........... </body> </html>
خوب حالا یه فایل Header.php و Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> <?php require("libs/Controller.php"); require("libs/view.php"); require("libs/Bootstrap.php"); $app = new Bootstrap(); ?> </body> </html>
کد Footer.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> <div id="Footer"> <div> ©Copyright </div> </div> </body> </html>
کد Header.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> <div id="Header"> <div id="MainMenu"> <ul> <li> <a href="Index">خانه</a> </li> <li> <a href="Login">ورود</a> </li> <li> <a href="About">درباره</a> </li> </ul> </div> </div> </body> </html>
حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
function __construct() { //echo "<br>Main Controller<br>"; $this->view = new View(); }
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<?php class View { function __construct() { //echo "<br>we are in page View"; } function Render($name) { require("Views/Header.php"); require("views/".$name.".php"); require("Views/Footer.php"); } }
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم .
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
function __construct() { parent::__construct(); //echo "<br>Page About "; $this->view->Render("About/index"); }
کد تابع سازنده کلاس Index :
function __construct() { parent::__construct(); //echo "<br>Page Index "; $this->view->Render("Index/index"); }
کد تابع سازنده کلاس Login :
function __construct() { parent::__construct(); //echo "<br>Page Login "; $this->view->Render("Login/index"); }
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .
یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟! در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="CSS/Login.css"/> <title>Login</title> </head> <body> <div id="SingUp"> <ul> <li id="title"> PHP-MVC </li> <li> <input type="button" id="Btn_SingUp" value="ثبت نام" name="Btn_SingUp" /> </li> </ul> </div> <br /><br /> <div id="Login"> <div id="textbox"> <ul> <li> <input type="text" id="txt_User" name="txt_User" /> </li> <li> <input type="text" id="txt_Pass" name="txt_Pass" /> </li> <li> <input type="submit" id="btn_Login" name="btn_Login" value="ورود" /> </li> </ul> </div> <div id="label"> <ul> <li> <label>نام کاربری : </label> </li> <li> <label>رمز عبور : </label> </li> </ul> </div> <ul> <li id="title"> <div> PHP-MVC Login </div> </li> </ul> </div> </body> </html>
با استفاده از کد زیر (که در بالا اومده)
<link rel="stylesheet" type="text/css" href="CSS/Login.css"/>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
کد Login.css :
#SingUp, #Login { border: 1px solid; margin: 0 auto; } #SingUp { height: 90px; } #Login { width: 550px; } #SingUp ul, #Login ul { list-style: none; } #SingUp li { float: left; }
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن )
و حالا یه خروجی دیگه میگیریم :
خوب حالا قسمت هایی رو باید تغییر بدیم :
#SingUp { height: 90px; background-color: #6260b6; } #Login { width: 550px; height: 200px; border: 1px solid; border-radius: 5px; border-color: #999; }
با استفاده از خاصیت border-radius میتونیم گوشه های کادر رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
#SingUp #title { font-size: 30px; font-weight: bold; color: #FFF; margin-right: 40px; margin-left: 100px; } #Login #textbox { position: absolute; margin: 45px 0 0 170px; } #Login #label { position: absolute; margin: 50px 0 0 80px; }
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).
یه خروجی میگیریم :
و حالا دوباره یه تغییر کوچیک میدیم :
#SingUp, #Login { /*border: 1px solid;*/ margin: 0 auto; }
خوب حالا این کدهارو هم اضافه میکنیم :
#SingUp #Btn_SingUp { background-color: #168500; border: 1px solid #999; width: 70px; height: 30px; color: #FFF; font-weight: bold; cursor: pointer; }
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست .
کد زیر به قسمت SingUp #title# اضافه میکینم :
text-shadow: 0.5px 0.5px 5px #000;
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
text-shadow: 0px 0px 10px #FFF;
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
#Login ul { padding: 0; }
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
خوب این تکه کد باید تغییر بدیم :
#SingUp li { float: left; margin-top: 20px; }
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
#Login #title { border-bottom: 1px solid #999; margin: 0 20px 30px 20px; } #Login #title div { color: #4d279c; font-weight: bold; padding-bottom: 5px; }
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن .
حالا یه خروجی دیگه میگیریم .
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
#Login label { color: #615f64; } #Login #label li { margin-bottom: 5px; } #Login #textbox #txt_Pass { margin-top: 5px; } #Login #textbox #btn_Login { margin-top: 12px; background-color: #005caa; border: 1px solid #000; color: #FFF; width: 50px; height: 27px; font-weight: bold; margin-left: 3px; }
حالا یه خروجی میگیریم ببینیم چطوری شد:
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
#SingUp, #Login { /*border: 1px solid;*/ margin: 0 auto; } #SingUp { height: 90px; background-color: #6260b6; } #SingUp #Btn_SingUp { background-color: #168500; border: 1px solid #999; width: 70px; height: 30px; color: #FFF; font-weight: bold; cursor: pointer; text-shadow: 0px 0px 10px #FFF; } #SingUp #title { font-size: 30px; font-weight: bold; color: #FFF; margin-right: 40px; margin-left: 100px; text-shadow: 0.5px 0.5px 5px #000; } #SingUp ul, #Login ul { list-style: none; } #SingUp li { float: left; margin-top: 20px; } #Login { width: 550px; height: 200px; border: 1px solid; border-radius: 5px; border-color: #999; } #Login #textbox { position: absolute; margin: 45px 0 0 170px; } #Login #label { position: absolute; margin: 50px 0 0 80px; } #Login ul { padding: 0; } #Login #title { border-bottom: 1px solid #999; margin: 0 20px 30px 20px; } #Login #title div { color: #4d279c; font-weight: bold; padding-bottom: 5px; } #Login label { color: #615f64; } #Login #label li { margin-bottom: 5px; } #Login #textbox #txt_Pass { margin-top: 5px; } #Login #textbox #btn_Login { margin-top: 12px; background-color: #005caa; border: 1px solid #000; color: #FFF; width: 50px; height: 27px; font-weight: bold; margin-left: 3px; }
خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
http:////localhost//phpmyadmin
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام LoginModel.php توی فولدر Models ایجاد میکنیم و کلاس LoginModel توش تعریف میکنیم :
کد Login_Model.php :
<?php class Login_Model { function __construct() { } function run() { $link = mysql_connect('localhost', 'root', 'mr_prog'); if (!$link) { die('Could not connect: ' . mysql_error()); } $db_selected = mysql_select_db('ITPro', $link); if (!$db_selected) { die ('Can\'t use user_pass : ' . mysql_error()); } $user = $_POST["txt_User"]; $pass = md5($_POST["txt_Pass"]); $sql = "select * from tlb_UserPass where username='{$user}' and password='{$pass}'"; $result = mysql_query($sql); if (!$result) { die ('Invalid query : ' . mysql_error()); } if($row = mysql_fetch_row($result)) { echo "<br>welcome"; } else { echo "<br>Invalid Username Or Password"; } die(); } }
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysqlconnect به phpmyadmin وصل میشیم (در اینجا root و mr_prog به ترتیب یوزر و پسورد اکانت من هست که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysqlselectdb هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysqlfetchrow نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysqlfetchrow تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<?php class Login extends Controller { function __construct() { parent::__construct(); $this->view->Render("Login/index"); } function run() { require("models/Login_Model.php"); $L_M = new Login_Model(); $L_M->run(); } }
که من یه تابع بنام run نوشتم و توش یه شی از کلاس LoginModel ایجاد کردم و تابع run توی کلاس LoginModel فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<form id="form_login" name="form_login" method="post" action="Login/run" > <div id="Login"> . . . </div> </form>
خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو admin' or '0'='1 و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو #'alaki' or '1'='1 و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .
خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه Login توی کل صفحات باشه به عنوان هدر سایت و در ادامه یه قالب واسه لیست منو ها مینویسیم .توی کد Index.php (توی فولدر Login) تگ div با id بنام SingUp داریم که این تگ رو انتقال میدیم به کدهای Header.php .البته به غیر از انتقال تگ ، یکمی هم کد header.php بصورت زیر تغییر میدیم .کد header.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="CSS/Header.css"/> <title>Untitled Document</title> </head> <body> <div id="Header"> <div id="SingUp"> <ul> <li id="title"> PHP-MVC </li> <li> <input type="button" id="Btn_SingUp" value="ثبت نام" name="Btn_SingUp" /> </li> </ul> </div> <div id="MainMenu"> <ul> <li> <a href="Index">خانه</a> </li> <li> <a href="Login">ورود</a> </li> <li> <a href="About">درباره</a> </li> </ul> </div> </div> </body> </html>
خوب حالا یه فایل بنام header.css توی فولدر CSS میسازیم و سپس کدهای CSS مربوط به تگ SingUp رو از فایل Login.css انتقال میدیم به فایل header.css (با کمی تغییرات) .
کد header.css :
#Header { margin: 0 auto; background-color: #6260b6; } #SingUp { margin: 0 auto; width: 1000px; height: 80px; background-color: #6260b6; } #SingUp ul { list-style: none; } #SingUp li { float: left; margin-top: 20px; } #SingUp #Btn_SingUp { background-color: #168500; border: 1px solid #999; width: 70px; height: 30px; color: #FFF; font-weight: bold; cursor: pointer; text-shadow: 0px 0px 10px #FFF; } #SingUp #title { font-size: 30px; font-weight: bold; color: #FFF; margin-right: 40px; margin-left: 100px; text-shadow: 0.5px 0.5px 5px #000; }
کد Login.css :
#Login { margin: 0 auto; width: 550px; height: 200px; border: 1px solid; border-radius: 5px; border-color: #999; } #Login #textbox { position: absolute; margin: 45px 0 0 170px; } #Login #label { position: absolute; margin: 50px 0 0 80px; } #Login ul { padding: 0; list-style: none; } #Login #title { border-bottom: 1px solid #999; margin: 0 20px 30px 20px; } #Login #title div { color: #4d279c; font-weight: bold; padding-bottom: 5px; } #Login label { color: #615f64; } #Login #label li { margin-bottom: 5px; } #Login #textbox #txt_Pass { margin-top: 5px; } #Login #textbox #btn_Login { margin-top: 12px; background-color: #005caa; border: 1px solid #000; color: #FFF; width: 50px; height: 27px; font-weight: bold; margin-left: 3px; }
حالا یه خروجی میگیریم :
خوب الان میایم یه قالب واسه منوها مینویسیم .
کد زیر رو به کدهای header.css اضافه میکنیم :
#MainMenu { margin: 0 auto; width: 1000px; background-color: #6260b6; border: 1px solid #000; height: 40px } #MainMenu li { float: right; margin: 0 10px; border: 1px solid #000; text-align: center; line-height: 30px; } #MainMenu ul { margin: 0 20px 0 0; padding: 0; list-style: none; }
خروجی رو باهم میبینیم :
حالا این کدهارو هم اضافه میکینم :
#MainMenu a { font: Arial, Helvetica, sans-serif; font-size: 16px; color: #bdbbbb; background-color: #3f44a0; text-decoration: none; display: block; width: 80px; height: 30px; }
خروجی :
خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :
این کد رو به header.css اضافه میکینم :
#MainMenu a:hover { color: #fff; background-color: #000676; text-shadow: 0px 0px 5px #fff; box-shadow: 0 0 20px #9b9b9b; -moz-box-shadow: 0 0 20px #9b9b9b; -webkit-box-shadow: 0 0 20px #9b9b9b; -ms-box-shadow: 0 0 20px #9b9b9b; -o-box-shadow: 0 0 20px #9b9b9b; }
خروجی :