مهدی رزمجویی
توسعه دهنده SQL و PHP علاقه مند به مهندسی معکوس

کاملترین آموزش MVC در PHP رایگان | برنامه نویسی MVC در PHP

آموزش MVC | دوره آموزشی MVC در PHP | آموزش PHP و نوشتن به زبان MVC | جزوه آموزشی MVC در PHP و ... همگی اسامی است که می توانید به محتوای این مقاله مرتبط کنید ، در این مقاله آموزشی جامع ما سعی می کنیم به بهترین شکل بصورت جزوه آموزشی به شما برنامه نویسی MVC در PHP را به زبان ساده آموزش بدهیم اما به شما پیشنهاد می کنیم برای یادگیری بهتر به قسمت دوره های آموزشی توسینسو و آموزش PHP بروید و بصورت اصولی و اساسی PHP و MVC را آموزش ببینید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

دوره آموزشی برنامه نویسی MVC در PHP قسمت اول

توی این آموزش میخوام 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 اسم برنامه خودتونو قرار بدید)

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب تگ body بصورت زیر تغییر میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید که توی browser کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خروجی بصورت زیر نمایش داده میشه .

  • خانه
  • ورود
  • درباره

حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد .

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

ولی الان به این شکل هست ،

توی این آموزش میخوام  MVC  از مبتدی تا جایی که بتونم بهتون آموزش بدم . واسه شروع یه توضیح کوتاه درباره MVC میدم .MVC یه چارچوب یا  Framework برای ساخت برنامه های کاربردی وب هست ، که با استفاده از MVC ، برنامه های کاربردی وب نوشته شده دارای قدرت و انعطاف بیشتری هستن و در ضمن پیچیدگی که قبلا توی کدنویسی ایجاد میشد با MVC خیلی کمتر میشه .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 اسم برنامه خودتونو قرار بدید)

||https://tosinso.com//files/get/7ee647c1-8f4e-41c5-899b-4bf1a75a7e68||

 بعدش روی دکمه save کلیک میکنیم و تو این قسمت تیک گزینه remote رو برمیداریم و تیک گزینه testing میزنیم حالا روی دکمه save کلیک کنید . بعد از این کارا  توی قسمت سمت راست (یعنی local file) روی برنامه راست کلیک و گزینه new file رو میزنیم و یه فایل ایجاد میکنیم به نام  index.php و سپس دوباره روی برنامه راست کلیک کرده و چهار تا فلودر به نامهای Models , Views , Controller , Libs ایجاد میکنیم . حالا صفحه index.php باز میکنیم که کدهای زیر بصرت پیشفرض توش هست .

||https://tosinso.com//files/get/39d83ad3-2604-443f-a169-45aa084ec0ae||

خوب تگ body بصورت زیر تغییر  میدیم و یه خروجی از برنامه میگیریم (با استفاده از دکمه F12 یه خروجی توی Browser برای ما نشون میده)

||https://tosinso.com//files/get/4db0b4ae-97e2-4b6b-9530-ab8c072dd7ed||

میبینید که توی browser  کلمه test نمایش داده شد،حالا تگ body بصورت زیر تغییر میدیم و توی فولدر controller ، سه فایل به نام های Login.php , Help.php , Index.php ایجاد میکنیم .

||https://tosinso.com//files/get/9336b72a-4e15-44b1-a49a-bb8d4c0a5398||

خروجی بصورت زیر نمایش داده میشه .
* _خانه_
* _ورود_
* _درباره_
حالا با استفاده از این لینکها میتونیم به صفحات دیگه بریم . خوب ما میخوایم موقعی که کاربر مثلاً روی لینک ورود کلیک میکنه URL بصورت زیر دربیاد . 
||https://tosinso.com//files/get/5f855cb2-c077-42a8-852e-a0951caed319||  ولی الان به این شکل هست ،
||https://tosinso.com//files/get/550bcbc0-0f4d-4ef9-abf9-b57cc6a76108||
  پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

پس ما باید یه فایل به نام .htaccess توی فولدر اصلی برنامه ایجاد کنیم . خوب حالا این فایل چیه و به چه درد میخوره توی قسمت بعد آموزش میدم .

دوره آموزشی برنامه نویسی MVC در PHP قسمت دوم

تو قسمت قبل یه توضیح کوتاه درباره 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 بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

کد page.php:

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

ادامه کد:

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

توی تگ style کدهای css هست (اگه شد بعداً یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .

خوب حالا میریم سر کدهای htaccess:

یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن .

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

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 :

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه

سلام به همگی دوستان، تو قسمت قبل یه توضیح کوتاه درباره MVC دادم و استارت برنامه وبمونو زدیم چندتا فایل هم ایجاد کردیم و رسیدیم به مبحث .htaccess ، خوب یه توضیح درباره این فایل میدم و بعد با این فایل نرم افزار Apache روی سرور تنظیم میکنیم .فایل .htaccess واسه کانفیگ سرورهایی کارایی داره که روی سرور ، Apache اجرا شده باشه و با این فایل میتونیم توابع و ویژگیهایی Apache فعال یا غیرفعال کنیم مثلا تغییر مسیر، محافظت از رمز عبور ، محدودیت IP و ... . زمانی که این فایل روی یه دایرکتوری میزاریم Apache به دنبال این فایل میگرده، پس باید این فایل به همین صورت یعنی .htaccess بنویسیم بدون چیزی کم یا زیاد . یه مثال میزنم، زمانی که برنامه وب ما به خاطر اشتباه کاربر یا برنامه نویس با خطا برخورد میکنه، Apache این خطا رو تو یه صفحه با شماره خطا و توضیح خطا به ما نشون میده و ما نمیخوایم هر وقت که با خطا روبرو میشیم این عمل صورت بگیره، حالا یا برنامه نویس صلاح میبینه که این خطا رو نشون بده با این تفاوت که خود برنامه نویس میاد یه صفحه خطا ایجاد میکنه و زمانی که خطا رخ میده صفحه خطایی که خودش تولید کرده بجای صفحه خطا Apache میزاره (یعنی مسیر URL تغییر میده) یا اینکه اصلا خطایی نمایش داده نمیشه، که این کار بوسیله ErrorDocument انجام میشه بصورت زیر.
<left>
ErrorDocument 401 http:////127.0.0.1//PHP-MVC//Index
<left>
خوب این کد باید توی فایل .htaccess بنویسیم، که در اینجا موقعی که خطای 401 رخ میده بجای نمایش صفحه خطا، برنامه Redirect (تغییر مسیر) میکنه به صفحه index برنامه و صفحه index نمایش داده میشه .خوب حالا واسه ابتدای کار یه فایل .htaccess توی پوشه اصلی برنامه وبمون میسازیم .نکته : زمانی که فایل .htaccess توی یه فولدر قرار میدیم هر تنطیمی که انجام داده باشیم روی فایل ها و زیرفولدرهای همان فولدر هم اعمال میشه . 
1) ErrorDocument : زمانی که خطا رخ میده کاربر به مسیر مورد نظر هدایت میکنه .
<left>
ErrorDocument 404 //error_pages//404.html
<left>
404 : موقعی که فایلی رو پیدا نمیکنه این خطا رخ میده .
403 : زمانی که خطای Forbidden رخ میده .
401 : Authorization Required
500 : Internal Server
400 : Bad request
2) Redirects : موقعی که بخوایم کاربر از یه مسیر به مسیر دیگه منتقل کنیم، مثلا قبلاً یه صفحه توی وب سایتمون داشتیم و بجای این صفحه یه صفحه جدید درست کردیم و حالا یه کاربری میخواد صفحه قدیمی باز کنه، با Redirects میتونیم کاربر به صفحه جدید انتقال بدیم .
<left>
Redirect //old_dir//  http:////www.yourdomain.com//new_dir//index.html
<left>
3)یکی از مهمترین کاربرد های فایل .htaccess قابلیت password protection (محافظت از رمزعبور) هست .
زمانی که میخوایم روی یه فولدر یا تعداد بیشتری فولدر رمزعبور بزاریم تا فقط افرادی که دارای رمز عبور هستند بتونن این فولدر باز کنن، این قابلیت بدرد بخور هست، بصورت زیر انجام میدیم .
یه مثال میزنم، من یه فولدر به نام private دارم که میخوام فقط یوزری بنام admin بتونه محتوای اونو ببینه . فعلا اگه بخوام این فولدر باز کنم راحت باز میشه .
||https://tosinso.com//files/get/2b033ea3-cd69-4bc9-b50e-f98fdb9ca9dd||
و یه فایل بنام page.php توی این فولدر ساختم که در واقع میخوایم از این فایل محافظت کنم .
||https://tosinso.com//files/get/7284314e-ff1b-4154-9599-67f29cf71dd1||
کد page.php:
||https://tosinso.com//files/get/1184c1db-f1d7-4354-a2c5-9e19194e397b||
ادامه کد:
||https://tosinso.com//files/get/d251f989-557d-466e-b829-82c8d24e4f98||
توی تگ style کدهای css هست (اگه شد بعداً  یه مقدار css هم توضیح میدم) و ادامه کد هم که آسونه چیزی نداره (دو تا label , textbox و یه button گذاشتم) .
خوب حالا میریم سر کدهای htaccess:
یه فایل بنام .htaccess توی فولدر private میسازیم که این فایل وظیفه محافظت از فولدر داره تا کاربرای دیگه (به غیر از کاربری با نام admin) نتونن توی فولدر ببینن . 
||https://tosinso.com//files/get/c69b4207-68d2-4ced-8b9e-cf3ecc0ea67c||
AuthType : نوع تشخیص هویت معلوم میکنه و ما اینجا basic براش ست کردیم چون داریم از احراز هویت http استفاده میکنیم .
AuthName : یه متن هست که توی صفحه ای که میخواییم رمزعبور وارد کنیم نمایش داده میشه (توی عکس معلومه)
AuthUserFile : مسیر فایل محتوای رمزعبور و نام کاربری (توصیه میشه فایل محتوای رمزعبور و نام کاربری توی فولدر برنامه وب نباشه، خارج از فلودرهای برنامه باشه)
require valid-user : یعنی فقط کاربرای مجاز محتویات این فولدر میبینند .
و حالا یه فایل دیگه هم میسازیم به نام .htpasswd و توش رمز عبور و نام کاربری هرکسی که میخوایم به این فولدر دسترسی داشته باشه، قرار میدیم (در اینجا ما فقط به admin اجازه دادیم)
<left>
username:password
<left>
اگه خواستید به چند نفر اجازه بدید این فولدر ببینن باید username و password ها رو زیر هم بنویسید اینجوری :
<left>
username:password
username:password
username:password
<left>
توی فایل .htpasswd میشه رمز عبور encrypt ذخیره کرد یا هم بصورت معمولی رمز عبور دخیره کنیم، اگه خواستید رمزعبورتون encrypt کنید برید توی این سایت :
<left>
http:////www.htaccesstools.com//htpasswd-generator
<left>
خوب من رمزعبور خودمو encrypt کردم و گذاشتم توی فایل .htpasswd :
||https://tosinso.com//files/get/3cd686d4-e136-4ba8-8503-f62e2149903d||
و حالا موقعی که میخواییم وارد page.php بشیم از ما نام کاربری و رمزعبور میپرسه .
||https://tosinso.com//files/get/551497ca-877e-4724-9482-3f54de0cfd12||
اگه روی دکمه cancel کلیک کنم این صفحه برام نشون داده میشه
||https://tosinso.com//files/get/9dcaebd7-12ce-40ea-8128-ca3f5143a348||
اگه رمزعبور یا نام کاربری غلط وارد کنم دوباره ازم نام کاربری و رمزعور میپرسه و اگه هم درست وارد کنم که صفحه ای که میخوایم برامون باز میکنه 
||https://tosinso.com//files/get/405eddde-ab98-4a5a-80f3-b943ee915c90||

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

اومیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی ادامه مباحث htaccess توضیح میدم .

دوره آموزشی برنامه نویسی MVC در PHP قسمت سوم

ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

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 مواجه میشه .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ،

من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه 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

و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا اگه کدمونو به این صورت نوشته بودیم

 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 میزنم .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)

IndexIgnore *.txt
سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم

IndexIgnore *.txt *.jpg
سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )

IndexIgnore *
سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .

Options +Indexes

اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .

Options -Indexes
سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .

خوب تا اینجا توضیحاتی که واسه .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 (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید بعد از 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'];	
?>

بصورت شکل زیر :

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .

[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .

echo '<br>'.$_GET['b'];
سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا میایم مقادیر 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 مقادیر آرایه رو چاپ میکنه .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای 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";
	}
?>

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

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .

سلام به همه دوستان گلم در ITPro ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects  و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC  . نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید . 
||https://tosinso.com//files/get/370a523a-186b-4d5a-b48f-5af01e053d2a||
4) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
<htm>
order allow,deny
deny from 123.45.6.
allow from all
<htm>
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که  سه اکتد آی پی شون این 123.45.6 هست اجازه بازدید از سایت ندارن .
<htm>
order allow,deny
allow from 162.1.1.1
deny from all
<htm>
کد بالایی هم فقط به کاربری با آی پی 162.1.1.1 اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
||https://tosinso.com//files/get/110262ac-52d4-466f-98ee-ab65f203e558||

5) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ، 
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود 
||https://tosinso.com//files/get/960448ad-c06f-433d-8c36-4aecd1c75ffb||
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم :-)
<htm>
<!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>
<htm>
و حالا این کد توی .htaccess مینویسم .
<htm>
DirectoryIndex index.html
<htm>
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
||https://tosinso.com//files/get/f8cf8f64-1222-4f5c-a0f5-13c2c60cc21f||
خوب حالا اگه کدمونو به این صورت نوشته بودیم
<htm>
 DirectoryIndex index.html index.cgi index.php
<htm>
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi  و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .

6) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره)  و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
||https://tosinso.com//files/get/c93ac99e-d6db-4197-be80-cbe624ea0723||
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
<htm>
IndexIgnore *.txt
<htm>
||https://tosinso.com//files/get/df7c03aa-0666-4a24-871c-81e767c61ae7||
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم 
<htm>
IndexIgnore *.txt *.jpg
<htm>
||https://tosinso.com//files/get/14ce8ba5-d20c-417b-9113-4ca6ea8f79ba||
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
<htm>
IndexIgnore *
<htm>
||https://tosinso.com//files/get/395d0ba6-8db8-4888-b2a9-f94c2e7e3161||
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
<htm>
Options +Indexes
<htm>
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
<htm>
Options -Indexes
<htm>
||https://tosinso.com//files/get/7ed0dba8-5af5-47f4-a797-5274439d0dab||
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
<left>
http://www.htaccess-guide.com
<left>
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
<htm>
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/
<htm>
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
||https://tosinso.com//files/get/279ca742-b8a9-4ca7-95d9-8cdb67bc8eae||
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
<htm>
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]

<htm>
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ،  $(*.)^  یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و 1$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
<php>
<?php
	echo $_GET['url'];	
?>
<php>
بصورت شکل زیر :
||https://tosinso.com//files/get/ffd5f0d8-0a96-4abd-91ab-0d0f55a33d3a||
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
||https://tosinso.com//files/get/b32fc5c9-fb42-4b57-9026-79b6e554f2e2||
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
<php>
echo '<br>'.$_GET['b'];
<php>
||https://tosinso.com//files/get/64267654-e9e2-4274-9fb4-98929d5b7035||
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
||https://tosinso.com//files/get/6d8880f7-936b-4984-b635-71f9b90b845f||
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید  :
<php>
<?php
	//echo $_GET['url'];
	//echo '<br>'.$_GET['b'];
	
	$url = $_GET['url'];
	$url = explode('/', $url);
	print_r($url);
?>
<php>
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر /  و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
||https://tosinso.com//files/get/fbb4c01c-984c-42ae-bada-455180885704|| 
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
||https://tosinso.com//files/get/e6e71890-0318-4572-bf4f-e2e72616ca21||
 حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
||https://tosinso.com//files/get/e76e2185-9c9a-4250-9a44-c1d94e4db402||
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
||https://tosinso.com//files/get/6ce34e29-c25f-41c9-8a57-3e9b357cb502||
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
<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;
	}
?>
<php>
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم . 


نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

بصورت زیر این باگ هم برطرف میشه . (کدهای 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 براش ست بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید . توی قسمت بعدی کلاسها رو توضیح میدم .

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه 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 ";
	}
}

خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :

سلام به همگی توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<php>
<?php
class Bootstrap
{
	function __construct()
	{
	}
}
<php>
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<php>
<?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>
کدهای php صفحه index.php :
<php>
<?php

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$  .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
}
<php>
کد Index.php :
<php>
<?php

class Index
{
	function __construct()
	{
		echo <br>Page Index ;
	}
}
<php>
کد Login.php :
<php>
<?php

class Login
{
	function __construct()
	{
		echo <br>Page Login ;
	}
}
<php>
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
||https://tosinso.com//files/get/521b30da-58fe-49d5-baf7-3b7e2f4e1884||
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
<php>
if(!file_exists(Controllers/.$url[0]..php))
{
	echo Not Found Page;
}
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
}
<php>
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
||https://tosinso.com//files/get/00994776-1b1a-4c34-8f02-39002764ba55||
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
<php>
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
	$controller->$url[1]();	
}
<php>
کد About :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
	
	function AboutMe()
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
||https://tosinso.com//files/get/190a82d5-3dbb-4dcd-8cc6-61f41aae3416||
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
||https://tosinso.com//files/get/43a0aea9-3686-495b-895b-522977930044||
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
<php>
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>;
		}
	}	
}
<php>
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام method_name$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع method_exists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای  method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر . میزاشتیم و بعد نام تابع، ولی اینجا به جای . از <- استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
<php>
function AboutMe($str = false)
{
	if($str == true)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
یا هم بصورت زیر :
<php>
function AboutMe($str = '')
{
	if(empty($str) == false)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
کد Bootstrap :
<php>
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>;
	}
}
<php>
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
||https://tosinso.com//files/get/319f56be-af64-4676-8628-66cc8c1c6d49||

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

طبق کدی که من توی کلاس 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 نمایش داده میشه .

سلام به همگی توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<php>
<?php
class Bootstrap
{
	function __construct()
	{
	}
}
<php>
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<php>
<?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>
کدهای php صفحه index.php :
<php>
<?php

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$  .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
}
<php>
کد Index.php :
<php>
<?php

class Index
{
	function __construct()
	{
		echo <br>Page Index ;
	}
}
<php>
کد Login.php :
<php>
<?php

class Login
{
	function __construct()
	{
		echo <br>Page Login ;
	}
}
<php>
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
||https://tosinso.com//files/get/521b30da-58fe-49d5-baf7-3b7e2f4e1884||
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
<php>
if(!file_exists(Controllers/.$url[0]..php))
{
	echo Not Found Page;
}
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
}
<php>
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
||https://tosinso.com//files/get/00994776-1b1a-4c34-8f02-39002764ba55||
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
<php>
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
	$controller->$url[1]();	
}
<php>
کد About :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
	
	function AboutMe()
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
||https://tosinso.com//files/get/190a82d5-3dbb-4dcd-8cc6-61f41aae3416||
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
||https://tosinso.com//files/get/43a0aea9-3686-495b-895b-522977930044||
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
<php>
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>;
		}
	}	
}
<php>
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام method_name$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع method_exists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای  method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر . میزاشتیم و بعد نام تابع، ولی اینجا به جای . از <- استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
<php>
function AboutMe($str = false)
{
	if($str == true)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
یا هم بصورت زیر :
<php>
function AboutMe($str = '')
{
	if(empty($str) == false)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
کد Bootstrap :
<php>
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>;
	}
}
<php>
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
||https://tosinso.com//files/get/319f56be-af64-4676-8628-66cc8c1c6d49||

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه 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 بصورت زیر وارد کنیم نتیجه اینجوری میشه :

سلام به همگی توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<php>
<?php
class Bootstrap
{
	function __construct()
	{
	}
}
<php>
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<php>
<?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>
کدهای php صفحه index.php :
<php>
<?php

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$  .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
}
<php>
کد Index.php :
<php>
<?php

class Index
{
	function __construct()
	{
		echo <br>Page Index ;
	}
}
<php>
کد Login.php :
<php>
<?php

class Login
{
	function __construct()
	{
		echo <br>Page Login ;
	}
}
<php>
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
||https://tosinso.com//files/get/521b30da-58fe-49d5-baf7-3b7e2f4e1884||
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
<php>
if(!file_exists(Controllers/.$url[0]..php))
{
	echo Not Found Page;
}
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
}
<php>
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
||https://tosinso.com//files/get/00994776-1b1a-4c34-8f02-39002764ba55||
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
<php>
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
	$controller->$url[1]();	
}
<php>
کد About :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
	
	function AboutMe()
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
||https://tosinso.com//files/get/190a82d5-3dbb-4dcd-8cc6-61f41aae3416||
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
||https://tosinso.com//files/get/43a0aea9-3686-495b-895b-522977930044||
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
<php>
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>;
		}
	}	
}
<php>
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام method_name$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع method_exists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای  method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر . میزاشتیم و بعد نام تابع، ولی اینجا به جای . از <- استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
<php>
function AboutMe($str = false)
{
	if($str == true)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
یا هم بصورت زیر :
<php>
function AboutMe($str = '')
{
	if(empty($str) == false)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
کد Bootstrap :
<php>
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>;
	}
}
<php>
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
||https://tosinso.com//files/get/319f56be-af64-4676-8628-66cc8c1c6d49||

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .

اگه این سری URL بصورت زیر وارد کنیم :

سلام به همگی توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<php>
<?php
class Bootstrap
{
	function __construct()
	{
	}
}
<php>
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<php>
<?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>
کدهای php صفحه index.php :
<php>
<?php

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$  .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
}
<php>
کد Index.php :
<php>
<?php

class Index
{
	function __construct()
	{
		echo <br>Page Index ;
	}
}
<php>
کد Login.php :
<php>
<?php

class Login
{
	function __construct()
	{
		echo <br>Page Login ;
	}
}
<php>
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
||https://tosinso.com//files/get/521b30da-58fe-49d5-baf7-3b7e2f4e1884||
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
<php>
if(!file_exists(Controllers/.$url[0]..php))
{
	echo Not Found Page;
}
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
}
<php>
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
||https://tosinso.com//files/get/00994776-1b1a-4c34-8f02-39002764ba55||
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
<php>
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
	$controller->$url[1]();	
}
<php>
کد About :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
	
	function AboutMe()
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
||https://tosinso.com//files/get/190a82d5-3dbb-4dcd-8cc6-61f41aae3416||
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
||https://tosinso.com//files/get/43a0aea9-3686-495b-895b-522977930044||
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
<php>
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>;
		}
	}	
}
<php>
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام method_name$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع method_exists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای  method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر . میزاشتیم و بعد نام تابع، ولی اینجا به جای . از <- استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
<php>
function AboutMe($str = false)
{
	if($str == true)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
یا هم بصورت زیر :
<php>
function AboutMe($str = '')
{
	if(empty($str) == false)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
کد Bootstrap :
<php>
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>;
	}
}
<php>
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
||https://tosinso.com//files/get/319f56be-af64-4676-8628-66cc8c1c6d49||

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

نتیجه اینه که کلی به ما خطا میده ، کدهای 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$ و به عنوان پارامتر تابع استفاده میشه .

سلام به همگی توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct___ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)
<php>
<?php
class Bootstrap
{
	function __construct()
	{
	}
}
<php>
حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :
<php>
<?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>
کدهای php صفحه index.php :
<php>
<?php

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>
اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$  .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
}
<php>
کد Index.php :
<php>
<?php

class Index
{
	function __construct()
	{
		echo <br>Page Index ;
	}
}
<php>
کد Login.php :
<php>
<?php

class Login
{
	function __construct()
	{
		echo <br>Page Login ;
	}
}
<php>
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
||https://tosinso.com//files/get/521b30da-58fe-49d5-baf7-3b7e2f4e1884||
طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :
<php>
if(!file_exists(Controllers/.$url[0]..php))
{
	echo Not Found Page;
}
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
}
<php>
کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .
||https://tosinso.com//files/get/00994776-1b1a-4c34-8f02-39002764ba55||
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :
<php>
else
{
	$file = controllers/.$url[0]..php;
	require($file);
	$controller = new $url[0]();
	$controller->$url[1]();	
}
<php>
کد About :
<php>
<?php

class About
{
	function __construct()
	{
		echo <br>Page About ;
	}
	
	function AboutMe()
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :
||https://tosinso.com//files/get/190a82d5-3dbb-4dcd-8cc6-61f41aae3416||
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
||https://tosinso.com//files/get/43a0aea9-3686-495b-895b-522977930044||
نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .
<php>
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>;
		}
	}	
}
<php>
تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام method_name$ تعریف کردم و مقدار [1]url$ داخل میریزم و بعد با تابع method_exists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای  method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر . میزاشتیم و بعد نام تابع، ولی اینجا به جای . از <- استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :
<php>
function AboutMe($str = false)
{
	if($str == true)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
یا هم بصورت زیر :
<php>
function AboutMe($str = '')
{
	if(empty($str) == false)
	{
		echo '<br>........'.$str.'..........<br>';
	}
	else
	{
		echo '<br>........About Me..........<br>';
	}
}
<php>
کد Bootstrap :
<php>
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>;
	}
}
<php>
یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .
||https://tosinso.com//files/get/319f56be-af64-4676-8628-66cc8c1c6d49||

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

امیدوارم از این قسمت هم استفاده لازم برده باشید .

دوره آموزشی برنامه نویسی MVC در PHP قسمت پنجم

خوب طبق توضیحاتی که در قسمت اول آموزش دادم 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 ارث میبره)

خوب حالا یه تست میکنیم :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<?php

	require("libs/Controller.php");

	require("libs/Bootstrap.php");	
	$app = new Bootstrap();
	
?>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه)

function __construct()
{
	parent::__construct();
	
	echo "<br>Page Login ";
}

متونستیم بجای اینکه بنویسیم

parent::__construct();

این کد رو بنویسیم (هیچ فرقی نمیکنه)

Controller::__construct();

خوب حالا یه بار دیگه تست میکنیم :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

دیدید که برامون پیغام 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) باز میکنیم بصورت زیر نمایش داده میشه :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت 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>&nbsp;
                <input type="text" id="txt_User" name="txt_User" />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
            &copy;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>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

حالا باید تابع سازنده کلاس 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 اجرا میشن .

خوب حالا یه اجرا میگیریم .

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور 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");
}

خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :

سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همگی دوستان خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View  و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم . در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

<php>
<?php

class Controller
{
	function __construct()
	{
		echo <br>Main Controller<br>;
	}
}
<php>

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

<php>
class Login extends Controller
<php>

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :
||https://tosinso.com//files/get/94e2fc3a-0457-4448-89a9-7d823756f156||
بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

<php>
<?php

	require(libs/Controller.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/6007aab2-dc9a-414b-a93f-4fab66ef7a81||
این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر  رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه) 

<php>
function __construct()
{
	parent::__construct();
	
	echo <br>Page Login ;
}
<php>

متونستیم بجای اینکه بنویسیم 

<php>
parent::__construct();
<php>

این کد رو بنویسیم (هیچ فرقی نمیکنه)

<php>
Controller::__construct();
<php>

خوب حالا یه بار دیگه تست میکنیم :
||https://tosinso.com//files/get/4e15de14-b3e6-4218-92b6-0f4b484c6f0a||
دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

<php>
<?php

class View
{
	function __construct()
	{
		echo <br>we are in page View;
	}
}
<php>

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

<php>
function __construct()
{
	echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

<php>

<?php

	require(libs/Controller.php);
	require(libs/view.php);

	require(libs/Bootstrap.php);	
	$app = new Bootstrap();
	
?>
<php>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :
||https://tosinso.com//files/get/43ee1298-cfbc-43ea-b640-00ef432131b1||
طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و ...) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

<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>
        <ul>
        	<li>
            	<label>نام کاربری : </label>&nbsp;
                <input type=text id=txt_User name=txt_User />
            </li>   
            <li>
            	<label>رمز عبور : </label>&nbsp;
                <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>
<php>

کد Index.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>

	...........Page Index...........

</body>
</html>
<php>

کد Index.php توی فولدر About :

<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>

	...........Page About...........

</body>
</html>
<php>

خوب حالا یه فایل Header.php  و  Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php  که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

<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>

<php>

کد Footer.php :

<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>
            &copy;Copyright
        </div>
    </div>

</body>
</html>
<php>

کد Header.php :

<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>
<php>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :
||https://tosinso.com//files/get/e2d63c97-597e-4529-968f-f8cfb97c26d4||
حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :
<php>
function __construct()
{
	//echo <br>Main Controller<br>;
	
	$this->view = new View();
}
<php>
و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :
<php>
<?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);
	}
		
}
<php>
یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم . 
||https://tosinso.com//files/get/7f081e79-f716-4eab-95d5-2cab2780d9c4||
باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page About ;
	
	$this->view->Render(About/index);
}
<php>
کد تابع سازنده کلاس Index :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Index ;
	
	$this->view->Render(Index/index);
}
<php>
کد تابع سازنده کلاس Login :
<php>
function __construct()
{
	parent::__construct();
	
	//echo <br>Page Login ;
	
	$this->view->Render(Login/index);
}
<php>
خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :
||https://tosinso.com//files/get/e7a4c7d4-836e-4f99-a5d6-73d9a54e3f18||
||https://tosinso.com//files/get/328491d3-270e-4430-a7e7-c5f765baec2d||
خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .امیدوارم از این قسمت هم استفاده لازم برده باشید، توی آموزش بعدی کار با دیتابیس آموزش میدم بهمراه ایجاد یه بخشی از قالب سایت با CSS و JQuery .

دوره آموزشی برنامه نویسی MVC در PHP قسمت ششم

یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های 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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </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 استفاده میکنیم .

در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

کد 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 تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن )

و حالا یه خروجی دیگه میگیریم :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا قسمت هایی رو باید تغییر بدیم :

#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}

با استفاده از خاصیت border-radius میتونیم گوشه های کادر رو هلال کنیم .

اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

که من مقدار 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 قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

و حالا دوباره یه تغییر کوچیک میدیم :

#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> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .

یه خروجی میگیریم ببینیم چطور شد :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب این تکه کد باید تغییر بدیم :

#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 و خط زیر متن .

حالا یه خروجی دیگه میگیریم .

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :

#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;
}

حالا یه خروجی میگیریم ببینیم چطوری شد:

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

تمام کد هایی که تا الان توی فایل 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 یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

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

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

سه ستون بنامهای 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 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟

یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!

یوزر رو admin' or '0'='1 و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)

امتحان میکنیم....

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :

یوزر رو #'alaki' or '1'='1 و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)

کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .

سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همگی دوستداران ITPro یه تغییر کوچولو توی روند آموزش ها دادم، از این به بعد در نظر دارم تو همین حین که آموزش های PHP جلو میره یه آموزش کوچیک هم درباره css و jquery  به کارمون اضافه کنم چون php کارا به غیر از اینکه باید به php مسلط باشن باید یه آشنایی خوبی هم با css و jquery داشته باشن . خوب تو این قسمت میخوایم یه دیتابیس با یه جدول واسه سایتمون ایجاد کنیم و با صفحه لاگین سایت وارد وب سایتمون بشیم و بعدش سایت رو از نظر امنیتی تست میکنیم ببینیم قابل نفوذ هست یا نه؟!  در ابتدا میایم یه فولدر بنام CSS توی پوشه اصلی وب سایتمون میسازیم و یه فایل بنام Login.css توش ایجاد میکنیم .کد Login.php (توی فولدر Login) بصورت زیر تغییر میدیم :
<htm>
<!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>&nbsp;
                </li>
                <li>
                    <label>رمز عبور : </label>&nbsp;
                </li>
            </ul>
        </div>
        
        <ul>
        	<li id=title>
                <div>
                    PHP-MVC  Login
                </div>
            </li>
        </ul>        
    </div>

</body>

</html>
<htm>
با استفاده از کد زیر (که در بالا اومده)
<htm>
<link rel=stylesheet type=text/css href=CSS/Login.css/>
<htm>
از کدهای Login.css توی Login.php استفاده میکنیم .
در ابتدا یه خروجی میگیریم (فعلاً هیچ قالبی ننوشتیم) :
||https://tosinso.com//files/get/baa4a88b-2da0-4fa1-8a3f-8d4587e0f8e3||
کد Login.css :
<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;
}
<css>
توی خط اول کد گفتم که یه کادر واسه دو تگ <div> بنامهای SingUp, #Login# بزاره و خط دوم هم margin برابر مقدار auto 0 قرار دادم چون میخوایم این دو تگ وسط صفحه قرار بگیرن .
زمانی که از تگ <ul> استفاده میکنیم، کنار مقادیر توی این تگ، یه مربع یا دایره قرار میگیره و چون نمیخوایم این مربع یا دایره نمایش داده بشن باید خاصیت list-style برابر none قرار بدیم .
اگه خواستیم مقادیر تگ <ul> بصورت افقی نمایش داده بشن باید خاصیت float تنظیم کنیم . ( که من این خاصیت برابر left تنظیم کردیم یعنی مقادیر از سمت چپ به راست بصورت افقی نمایش داده بشن ) 
و حالا یه خروجی دیگه میگیریم :
||https://tosinso.com//files/get/217befcb-8d0f-4f3c-bd43-06c9618cf017||
خوب حالا قسمت هایی رو باید تغییر بدیم :
<css>
#SingUp
{
	height: 90px;
	background-color: #6260b6;
}

#Login
{
	width: 550px;
	height: 200px;
	border: 1px solid;
	border-radius: 5px;
	border-color: #999;
}
<css>
با استفاده از خاصیت border-radius میتونیم گوشه های کادر  رو هلال کنیم .
اگه خواستید رنگهایی اختصاصی توی قالب سایت استفاده کنید میتونید برنامه فوتوشاپ باز کنید و رنگ خودتونو انتخاب کنید به صورت شکل زیر :
||https://tosinso.com//files/get/c38ce87b-4c19-49c1-b94b-50353575b8c2||
که من مقدار 6260b6 (که توی شکل معلومه) واسه خاصیت background-color قرار دادم .
سپس کدهای زیر رو اضافه میکنیم :
<css>
#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;
}
<css>
با استفاذه از خاصیت margin یه فاصله میزارم سمت راست و چپ متن PHP-MVC (مقدار PHP-MVC توی تگ <div> با id بنام title قرار داده، توی کدایی که نوشتین معلومه).

یه خروجی میگیریم :
||https://tosinso.com//files/get/1891caf3-cfb8-4bb0-8203-d4c2a2e78566||
و حالا دوباره یه تغییر کوچیک میدیم :
<css>
#SingUp, #Login
{
	/*border: 1px solid;*/
	margin: 0 auto;
}
<css>
خوب حالا این کدهارو هم اضافه میکنیم :
<css>
#SingUp #Btn_SingUp
{
	background-color: #168500;
	border: 1px solid #999;
	width: 70px;
	height: 30px;
	color: #FFF;
	font-weight: bold;
	cursor: pointer;
}
<css>
خط آخر کد واسه این هست که هر وقت کاربر اشاره گر موس روی دکمه ثبت نام بگیره شکل اشاره گر (از شکل پیشفرض خودش یعنی فلش) تغییر کنه به شکل دست . 
کد زیر به قسمت SingUp #title# اضافه میکینم :
<css>
text-shadow: 0.5px 0.5px 5px #000;
<css>
کد زیر به قسمت SingUp #Btn_SingUp# اضافه میکینم :
<css>
text-shadow: 0px 0px 10px #FFF;
<css>
زمانی که بخوایم واسه متن سایه بزاریم از text-shadow استفاده میکنیم .
این تکه کد به کدهامون اضافه میکنیم :
<css>
#Login ul
{
	padding: 0;
}
<css>
کد بالا تمام فاصله های درون تگ <ul> (فاصله از بالا ، پایین ، چپ و راست) صفر میکنه .
یه خروجی میگیریم ببینیم چطور شد :
||https://tosinso.com//files/get/b67f1d57-2b8d-4325-9887-8c6d1190e7a5||
خوب این تکه کد باید تغییر بدیم :
<css>
#SingUp li
{
	float: left;
	margin-top: 20px;
}
<css>
حالا کدهای زیرو هم به کدامون اضافه میکنیم :
<css>
#Login #title
{
	border-bottom: 1px solid #999;
	margin: 0 20px 30px 20px;
}

#Login #title div
{
	color: #4d279c;
	font-weight: bold;
	padding-bottom: 5px;
}
<css>
با استفاده از خط اول، یه خط زیر میزازیم واسه پایین متن  PHP-MVC Login . توی خط دوم میایم یه فاصله 20px میزاریم از چپ و راست و از بالا فاصله صفر میزاریم و از پایین هم فاصله 30px میزاریم .
بعدش با استفاده از خاصیت padding-bottom یه فاصله 5px میزاریم بین متن PHP-MVC Login و خط زیر متن . 
حالا یه خروجی دیگه میگیریم .
||https://tosinso.com//files/get/6efa6362-4b43-4889-a7ff-1620f2951d3c||
خوب حالا این کدهارو هم اضافه میکنیم به کدهایی که تا الان نوشتیم :
<css>
#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;
}
<css>
حالا یه خروجی میگیریم ببینیم چطوری شد:
||https://tosinso.com//files/get/4463dd9f-3b94-48e5-a867-a71de1752d18||
تمام کد هایی که تا الان توی فایل Login.css نوشتیم :
<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;
}
<css>

خوب تا اینجا یه قالب در حد معمولی واسه صفحه Login.php درست کردیم، حالا میایم کدهایی مینویسیم واسه وصل شدن به دیتابیس و استفاده از داده های جداول دیتابیس.
روی Wamp (کنار ساعت سیستم) کلیک میکنیم (البته اگه از برنامه Wamp استفاده میکنید) و PhpMyAdmin انتخاب میکنیم یا لینک زیر توی url وارد میکنیم و enter میزنیم .
<left>
http:////localhost//phpmyadmin 
<left>
یه دیتابیس به نام ITPro میسازیم و فعلاً یه جدول هم بنام tlb_UserPass هم واسه جدول نام کاربری و پسورد میسازیم بصورت زیر .
بعد از اینکه صفحه phpmyadmin باز کردیم به تب database میریم :
||https://tosinso.com//files/get/0b200874-4a14-4f6e-9f44-8051148ed0cc||
بصورت بالا یه دیتابیس به نام ITPro ایجاد میکنیم، سپس روی نام ITPro در سمت چپ کلیک میکنیم :
||https://tosinso.com//files/get/6b5df272-55c3-4ead-abd8-80a6aa6772fb||
جدولی به نام tlb_UserPass با سه ستون ایجاد میکنیم .
||https://tosinso.com//files/get/be0692d1-0208-428c-bee8-c905569bfeb1|| 
سه ستون بنامهای id , username , password ایجاد میکینم که چون میخوایم پسوردهایی که توی دیتابیس ذخیره میشه MD5 بشن بخاطر همین طولشو 32 گذاشتم و نام کاربری هم حداکثر باید 10 کاراکتر باشه (که این اختیاری هست) و مقدار collation هم گذاشتم utf8_persian، تا مقادیر فارسی هم بتونیم توی جدول وارد کنیم .  
خوب دیتابیس و جدولمونو ساختیم میریم سر وقت کدنویسی.
در ابتدا یه فایل بنام  Login_Model.php توی فولدر Models ایجاد میکنیم و کلاس Login_Model توش تعریف میکنیم :
کد Login_Model.php :
<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();
	}
}
<php>
یه تابع بنام run ایجاد میکنیم که توی خط اولش با استفاده از تابع mysql_connect به phpmyadmin وصل میشیم (در اینجا root و mr__prog به ترتیب یوزر و پسورد اکانت من هست  که باهاش وارد phpmyadmin میشم)
که توی خط بعدی گفتم اگه نتونیم به phpmyadmin وصل بشیم بهمون خطا بده، با استفاده از تابع mysql_select_db هم دیتابیس انتخاب می کنیم که توی خط بعد از اینم گفتم اگه مشکلی با  ارتباط به دیتابیس بوجود اومد بهمون خطا بده .
یورز و پسوردی که از کاربر میگیریم رو توی متغیر میریزیم و پسورد رو هم MD5 میکنیم . خط بعدی هم Query نوشتیم که گفتیم توی جدول بگرده و نسبت به ورودی ها (یعنی همون یوزر و پسورد) به ما نتیجه رو برگردونه که باز توی خط بعدی هم گفتیم اگه مشکلی توی Query بود و نتونست Query اجرا کنه بهمون خطا بده، سپس توی خط بعدی با استفاده از تابع mysql_fetch_row نتیجه Query رو توی یه متغیر بنام row$ میریزیم (خروجی آرایه هست) حالا اگه Query چیزی برامون برگردوند که تابع mysql_fetch_row تمام رکوردها رو توی متغیر row$ میریزه وگرنه چیزی توی متغیر ریخته نمیشه پس اگه یوزر و پسورد درست باشه به ما پیغام Welcome و اگه اشتباه باشه به ما پیغام Invalid Username Or Password میده حالا میایم یه تست میکینم البته قبلش باید یه تغییر توی کلاس Login بدیم :
کد Login.php (توی فولدر Controllers) :
<php>
<?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();
	}
}
<php>
که من یه تابع بنام run نوشتم و توش یه شی از کلاس Login_Model ایجاد کردم و تابع run توی کلاس  Login_Model  فراخوانی کردم .
حالا باید یه تغییراتی هم توی کد Index.php (که توی فولدر Login هست) بدیم، یه تگ <form> باز میکنیم و تگ <div> با id بنام Login رو توش قرار میدیم بصورت زیر :
<htm>
<form id=form_login name=form_login method=post action=Login/run >
	<div id=Login>
    		.
            .
            .
	</div>
</form>
<htm>
 خوب حالا کدهای کلاس Login_Model رو بصورت زیر تغییر میدیم :
دقت کنید زمانی که کاربر یوزر و پسورد خودشو وارد میکنه و روی دکمه ورود کلیک میکنه، تابع run از کلاس Login فراخوانی میشه یعنی اطلاعات (یوزر و پسورد) به این تابع فرستاده میشه .
در ضمن قبل از اجرای کدها، phpmyadmin رو باز کنید و توی جدول tlb_userpass یک یا چندتا یوزر و پسورد ذخیره کنید و پسوردی هم که ذخیره میکنید باید قبلش تبدیلش کنید به MD5 بعد ذخیرش کنید، خوب حالا میایم یه تست میکنیم ببینیم جواب میده یا نه ؟!!
||https://tosinso.com//files/get/23321b86-aa9e-48b8-8f4f-7f1026fb1600||
||https://tosinso.com//files/get/fc42ad59-c9e6-430a-9846-d0692a726583||
یوزر و پسورد وارد میکنیم و حالا میبینید که بهمون welcome داد پس یعنی همه چی درسته حالا پسورد اشتباه میدم ببینم چطور میشه :
||https://tosinso.com//files/get/1a927b12-9d7a-478d-8895-a306ac5fa5fd||
||https://tosinso.com//files/get/f827d3da-928b-4ee6-9fe1-68855d2aea0b||
میبینید که بهمون پیغام Invalid Username Or Password داد پس داره درست کار میکنه ولی اینجا یه سوالی پیش میاد که آیا این کدی که من الان نوشتم به درد بخور هست یا نه؟ 
یعنی یه هکر میتونه سایت منو هک کنه یا نمیتونه؟!!!!
یوزر رو   admin' or '0'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
امتحان میکنیم....
||https://tosinso.com//files/get/f156b2da-42f0-4274-825d-6f540e0d3388||
||https://tosinso.com//files/get/9bdda32e-4ff7-49dc-bb7d-c035b62b7def||
چی شد؟؟ هکر راحت تونست بدون اینکه پسورد منو بدونه تنها با در دست داشتن یوزر من وارد سایت بشه!! حتی هکر یه جور دیگه هم میتونه اطلاعات رو وارد کنه یعنی بدون اینکه یوزر منو داشته باشه وارد سایت بشه بصورت زیر :
یوزر رو   #'alaki' or '1'='1  و پسورد رو هرچی خواستید وارد کنید (مثلاً alaki)
کاراکتر # یعنی هرچی بعد از این کاراکتر میاد به عنوان Comment یا توضیحات در نظر بگیر .
||https://tosinso.com//files/get/ae993aee-e753-4251-8c47-0631d93b37c1||
||https://tosinso.com//files/get/ac397c09-4c88-422d-a2e3-31746122b0b6||
میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

میبییند که بازم وارد سایت شدیم حتی با اینکه نه یوزر داشتم نه پسورد، به این روش هک SqlInjection میگن که البته این یه نمونه از sqlinject بود که بهتون گفتم، راه های دیگه ای هم وجود داره که در آموزش های بعدی با باگهای دیگه هم آشنا میشیم و رفعشون میکنیم .امیدوارم از این قسمت هم استفاده لازم برده باشید، میخواستم تو این قسمت کمی درباره JQuery بگم ولی خوب آموزش خیلی طولانی شد، ایشالله توی آموزش بعدی هم این باگ رو برطرف میکنیم هم کمی درباره JQuery توضیح میدم .

دوره آموزشی برنامه نویسی MVC در PHP قسمت هفتم

خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه 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;
}

حالا یه خروجی میگیریم :

سلام به همه دوستان خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه Login توی کل صفحات باشه به عنوان هدر سایت و در ادامه یه قالب واسه لیست منو ها مینویسیم .توی کد Index.php (توی فولدر Login) تگ div با id بنام SingUp داریم که این تگ رو انتقال میدیم به کدهای Header.php .البته به غیر از انتقال تگ ، یکمی هم کد header.php بصورت زیر تغییر میدیم .کد header.php :
<htm>
<!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>
<htm>
خوب حالا یه فایل بنام header.css توی فولدر CSS میسازیم و سپس کدهای CSS مربوط به تگ SingUp رو از فایل Login.css انتقال میدیم به فایل header.css (با کمی تغییرات) .

کد header.css :
<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;
}
<css>

کد Login.css :
<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;
}
<css>

حالا یه خروجی میگیریم :
||https://tosinso.com//files/get/c12e6551-a622-4583-8498-b8102150e264||
||https://tosinso.com//files/get/779059f9-849e-47d2-8e5f-52d9ae879ee5||

خوب الان میایم یه قالب واسه منوها مینویسیم .
کد زیر رو به کدهای header.css اضافه میکنیم :
<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;
}
<css>
خروجی رو باهم میبینیم :
||https://tosinso.com//files/get/c7717d97-50bc-4218-a8a9-78eafeda9bfc||

حالا این کدهارو هم اضافه میکینم :
<css>
#MainMenu a
{
	font: Arial, Helvetica, sans-serif;
	font-size: 16px;
	color: #bdbbbb;
	background-color: #3f44a0;
	text-decoration: none;
	display: block;
	width: 80px;
	height: 30px;	
}
<css>
خروجی :
||https://tosinso.com//files/get/463ad652-3d1e-492e-9289-e1c8e7247776||
خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :
این کد رو به header.css اضافه میکینم :
<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;
}
<css>
خروجی :
||https://tosinso.com//files/get/d10618d1-d962-47bd-b62e-03c61fc1872c||
خوب میبینید که با موس روی منو خانه رفتیم و رنگ پس زمینه عوض شد همچنین با استفاده از کد box-shadow یه سایه هم دور دکمه منو ها گذاشتیم ، بخاطر اینکه box-shadow روی browser های مختلف کار کنه در نتیجه به اول این کد moz و webkit و ms و o اضافه میکنیم . (این کد جز کدهای CSS3 هست) ولی خوب این قضیه 100% جواب نمیده یعنی با اینکه به ابتدای کدها ms یا moz اضافه کردیم ولی ممکنه بازم روی بعضی از browser ها کار نکنه .
moz واسه mozila 
webkit واسه google chrome 
ms واسه Internet Explorer
o واسه Opera

حالا میایم کدهایی رو بصورت زیر تغییر میدیم :
<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 #9b9b9b;
	text-align: center;
	line-height: 30px;
}
<css>
خروجی میگیریم :
||https://tosinso.com//files/get/6f0e52b6-49af-4352-8f69-5516128b9056||

خوب توی قسمت قبلی دیدیم که کدمون اشکال داشت و یه هکر راحت میتونست بدون اینکه یوزر و پسورد داشته باشه به سایت نفوذ کنه حالا میایم این باگ رفع میکنیم .
میتونیم از تابعی به نام  mysql__real__escape__string استفاده کنیم ابتدا قبل استفاده از این تابع، کد Login__Model.php بصورت زیر تغییر میدیم ( فقط یه تابع die اضافه میکنیم تا ببینیم مقادیری که وارد میکنیم به چه صورتی میشه )
<php>
             .
             .
             .
$user = $_POST[txt_User];
$pass = md5($_POST[txt_Pass]);
$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		die($sql);
             .
             .
             .
<php>

خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/7f83a8f5-a715-43d1-b77a-8a973db1be50||
خوب توی عکس میبینید که با توجه به ورودی ما، برنامه زمانی خروجی برمیگردونه که یا یوزر برابر مقدار alaki باشه یا هم 1 برابر 1 ، پس همیشه نتیجه شرط درست میشه و هکر میتونه به سایت نفوذ کنه و بقیه دستورات بعد از کاراکتر # نیز نادیده گرفته میشه (یعنی بقیه دستورات بصورت کامنت یا توضیحات در نظر گرفته میشه)
حالا میایم یه مقدار کد تغییر میدیم و تابع mysql__real__escape__string اضافه میکنیم .
<php>
                  .
                  .
                  .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
$result = mysql_query($sql);
                  .
                  .
                  .
<php>
و خروجی میگیریم ببینیم بازم میتونیم به سایت نفوذ کنیم یا نه ؟؟
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/5f29e5df-c89e-4817-aaad-d7e74dd5f045||
خوب میبینید که دیگه اجازه نداد به سایت نفوذ کنیم، الان میایم از تابع die استفاده میکنیم ببینیم این تابع mysql__real__escape__string چه بلایی سر ورودی که ما بهش دادیم آورد که دیگه بهمون Welcome نداد (یعنی نتونستیم به سایت نفوذ کنیم)
کد بصورت زیر تغییر میدیم (فقط یه die بهش اضافه میکنیم) :
<php>
             .
             .
             .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
die($sql);
           .
           .
           .
<php>

خروجی :
||https://tosinso.com//files/get/6db43116-e261-404c-8bcc-86497d2d31b2||
خوب میبینید که کاراکتر های ' (تک کوتیشن) رو با استفاده از کاراکتر \ غیر فعال میکنه .

با این حال که باگ کد گرفتیم ولی بازم شاید یه هکر بتونه به سایت نفوذ کنه ، بهترین راه حل اینکه که از توابع PDO واسه اتصال به بانک اطلاعاتی و اجرای دستورات روی جداول استفاده کنیم اینجوری هم امنیت سایت بالا میره هم اینکه با استفاده از توابع PDO میتونیم به راحتی با تغییر خیلی کوچیک توی کدها، به انواع دیگه ای از بانکهای اطلاعاتی (مثلاً MSSql، SQLite و Oracle و...) متصل بشیم و ازشون استفاده کنیم ولی اگه از توابع PDO استفاده نکنیم زمانی که مثلاً دیگه نمیخوایم توی سایتمون از بانک Mysql استفاده کنیم و ترجیح میدیم از بانک Oracle استفاده کنیم در نتیجه مجبوریم خیلی از کدهایی که نوشتیمو تغییر بدیم که کلی دردسر داره و  وقت زیادی میبره ولی با استفاده از توابع PDO این کار خیلی راحت با تغییر چند خط کد انجام میشه ، پس حالا میایم یه تغییراتی توی کدهامون میدیم که بتونیم از توابع PDO استفاده کنیم .
یه فولدر میسازیم بنام Config و یه فایل بنام database.php توش میسازیم ، حالا این کدهارو توش مینویسیم .
<php>
<?php
define(DB_TYPE, mysql);
define(DB_HOST, localhost);
define(DB_NAME, ITPro);
define(DB_USER, root);
define(DB_PASS, mehdi!1230);
<php>
تابع define یه متغیر میسازه و یه مقدار داخلش میزاره، که میتونیم همه جای سایت به این متغیر دسترسی داشته باشیم و مقدارش هم ثابت هست (یعنی قابل تغییر نیست) .
الان میایم یه فایل دیگه بنام Database.php توی فولدر Libs میسازیم و کدهای زیر توش قرار میدیم (میخوایم یه کلاس بنام Database ایجاد کنیم که از PDO ارث میبره و میتونیم از توابع PDO استفاده کنیم توی سایتمون)
<php>
<?php
class Database extends PDO
{
	function __construct()
	{
		parent::__construct(DB_TYPE.:host=.DB_HOST.;dbname=.DB_NAME, DB_USER, DB_PASS);
	}
}
<php>
ورودی تابع سازنده PDO به ترتیب نوع بانک اطلاعاتی، هاست، نام دیتابیس، یوزر و پسورد هست که با استفاده از متغیرهایی که ساختیم مقدار دهی کردیم .
الان با این خط کد به بانک اطلاعاتی متصل شدیم حالا از این کلاس استفاده میکنیم توی فایل Login_Model.php  .
ابتدا یه کلاس دیگه هم تولید میکنیم و کدهایی که مشترک هستن واسه کار با دیتابیس رو اونجا مینویسیم و سپس بقیه کلاس ها از این کلاس ارث میبرن .
یه فایل بنام Model.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم (میخوایم کلاس Model ایجاد کنیم تا بقیه کلاسها که عملیاتی روی دیتابیس انجام میدن از این کلاس ارث ببرن)
<php>
<?php

class Model
{
	function __construct()
	{
		$this->db = new Database();
	}
}
<php>
یه شی از نوع کلاس Database میسازه (و تابع سازنده اش فراخوانی میشه) و مقدار برگشتی رو توی یه متغیر به نام db میریزه که بعداً از این متغیر استفاده میکنیم .
حالا میایم کد Login_Model.php کمی تغییر میدیم بصورت زیر (فقط کاری میکنیم که این کلاس از کلاس Model ارث ببره و تابع سازنده کلاس Model فراخوانی میکنیم)، در ضمن کدهای اتصال به دیتابیس و MYSql غیر فعال میکنیم (یا بهتر که حذفشون بکنیم) چون دیگه این کدهارو توی کلاس Databese نوشتیم و دیگه نیازی بهشون نداریم .
کد Login_Model.php :
<php>
<?php

class Login_Model extends Model
{
	function __construct()
	{
		parent::__construct();
	}
	
	function run()
	{
		/*$link = mysql_connect('localhost', 'root', 'mehdi!1230');
		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 = $_POST[txt_Pass];
		
		//$user = mysql_real_escape_string($_POST[txt_User]);
		//$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));
		
		//$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		//$result = mysql_query($sql);
		
		$qurey = $this->db->prepare(select * from tlb_UserPass where 
										username = :userlogin and password = md5(:passlogin));
		
		$qurey->execute(array(:userlogin => $user, :passlogin => $pass));
		
		//die($sql);
		
		$count = $qurey->rowcount();
		
		/*if (!$result) {
			die ('Invalid query : ' . mysql_error());
		}
		if($row = mysql_fetch_row($result))
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
		die();*/
		
		if($count > 0)
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
	}
}
<php>
توضیح کدهای بالا، Query که مینویسیم رو توی تابع prepare قرار میدیم و تابع execute میاد Query که نوشتیمو اجرا میکنه و اگه این Query باید ورودی بگیره توی تابع execute ورودی هارو بصورت آرایه بهش میدیم (که اینجا من ورودی هارو بصورت آرایه به Query دادم) و سپس با تابع rowcount چک میکنیم که اگه بزرگتر از صفر بود یعنی Query با موفقیت اجرا شده و یه رکورد برای ما (به عنوان خروجی) برگردونده ولی اگه کمتر از صفر باشه یعنی نتونست نسبت به شرط و مقداری که به Query دادیم رکوردی برای ما برگردونده .
||https://tosinso.com//files/get/097a2b03-9f31-4553-9319-c376c0a773e4||
||https://tosinso.com//files/get/89b1c566-a9d5-4fcd-8c64-8a477a273417||
خطا میده ، میگه نتونست کلاس Model پیدا کنه ، پس ما باید با دستور require این خطا رو برطرف کنیم، کد زیر رو اضافه میکنیم به فایل Index.php (توی پوشه اصلی سایت)  .
کد Index.php :
<php>
             .
             .
             .
require(libs/view.php);
	
require(libs/Model.php);

require(libs/Bootstrap.php);
             .
             .
             .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Index.php هست)
یه بار دیگه که امتحان کنیم به این خطا برخورد میکنیم :
||https://tosinso.com//files/get/7b93b03e-c632-417a-89dc-053407360393||
این سری کلاس Database پیدا نکرد در نتیجه همون کاری که بالا انجام دادیم واسه کلاس Database هم انجام میدیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Libs/Database.php);
<php>

همین جوری هی خروجی میگیریم تا ببینیم به چه خطاهایی برخورد میکنیم و اونارو رفع کنیم :
||https://tosinso.com//files/get/27493487-3c66-496f-8f84-84a24b7764d8||
این خطا هم میگه که نتونست اون متغیرهایی که با دستور define تعریف کردیمو پیدا کنه پس این خطا رو هم مثل بالا رفعش میکنیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Config/database.php);
<php>
خروجی میگیریم :
||https://tosinso.com//files/get/5bbc2f64-e4ce-45b4-803b-ce302cff829f||
میبینید که الان جواب داد ، حالا میایم یه تغییرات دیگه هم به کدهای سایتمون میدیم .
در ابتدا کد Bootstrap.php بصورت زیر تغییر میدیم .
<php>
                 .
                 .
                 .
$controller = new $url[0]();
$controller->loadModel($url[0]);

if(!empty($url[1]))
                 .
                 .
                 .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Bootstrap.php هست)، یه تابع فراخوانی میکنیم بنام loadModel و مقدار [0]url$ بهش میدیم (در ادامه این تابع توی کلاس Controller تعریف میکنیم)
کد Controller.php بصورت زیر تغییر میدیم :
<php>
<?php

class Controller
{
	function __construct()
	{
		//echo <br>Main Controller<br>;
		
		$this->view = new View();
	}
	
	function loadModel($name)
	{
		$path = models/.$name._model.php;
		
		if(file_exists($path))
		{
			require($path);
			
			$ModelName = $name._model;
			$this->model = new $ModelName();
		}
	}	
}
<php>
تابع loadModel یه ورودی میگیره که این ورودی اولین خانه آرایه url هست (یعنی [0]url$) و این ورودی رو به model.php__ و /models میچسبونه و یه مقدار جدید (که میشه یه فایل بهمراه مسیرش) درست میشه و توی متغیر path$ قرار میگیره و سپس چک میکنه که اگه این فایل با همچین مسیری وجود داشت که یه شی ازش میسازه (که در نتیجه تابع سازندش فراخوانی میشه) و سپس نتیجه رو توی متغیر model میریزه که بعداً توی کلاس Login ازش استفاده میکنیم . (این کد رو واسه این نوشتیم چون در آینده توی فولدر Models یا Controllers کلاس های دیگه ای به غیر از Login__Model یا Login اضافه میکنیم و بخاطر اینکه از تعداد خط های کد اضافی بکاهیم این تابع رو نوشتیم اگه این تابع رو نمی نوشتیم باید توی هر کلاسی که (در آینده) توی فولدر Models یا Controlers تعریف میکنیم چند خط کد بنویسیم (مثلاً همین کدی که توی تابع run از کلاس Login نوشتیم) و اینجوری هم تعداد خط کد بالا میره هم بیشتر پیچیده میشه در نتیجه خطا یابیش مشکل تر میشه) .
خوب طبق چیزایی که در بالا گفتم باید تابع ()run توی کلاس Login بصورت زیر تغییر بدیم :
<php>
function run()
{
	//require(models/Login_Model.php);
	
	//$L_M = new Login_Model();
	//$L_M->run();
	
	$this->model->run();
}
<php>
کدهای قبلی رو غیر فعال کردم و بجاش فقط خط آخر اضافه میکنم . (که پیچیدگی کمتر بشه و خطایابیش سریع تر انجام بگیره)
خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/e14ef9a0-04c2-46fe-97b9-4a380c1c6c2a||
میبینید که داره درست جواب میده .

امیدوارم این آموزش هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
سلام به همه دوستان خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه Login توی کل صفحات باشه به عنوان هدر سایت و در ادامه یه قالب واسه لیست منو ها مینویسیم .توی کد Index.php (توی فولدر Login) تگ div با id بنام SingUp داریم که این تگ رو انتقال میدیم به کدهای Header.php .البته به غیر از انتقال تگ ، یکمی هم کد header.php بصورت زیر تغییر میدیم .کد header.php :
<htm>
<!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>
<htm>
خوب حالا یه فایل بنام header.css توی فولدر CSS میسازیم و سپس کدهای CSS مربوط به تگ SingUp رو از فایل Login.css انتقال میدیم به فایل header.css (با کمی تغییرات) .

کد header.css :
<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;
}
<css>

کد Login.css :
<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;
}
<css>

حالا یه خروجی میگیریم :
||https://tosinso.com//files/get/c12e6551-a622-4583-8498-b8102150e264||
||https://tosinso.com//files/get/779059f9-849e-47d2-8e5f-52d9ae879ee5||

خوب الان میایم یه قالب واسه منوها مینویسیم .
کد زیر رو به کدهای header.css اضافه میکنیم :
<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;
}
<css>
خروجی رو باهم میبینیم :
||https://tosinso.com//files/get/c7717d97-50bc-4218-a8a9-78eafeda9bfc||

حالا این کدهارو هم اضافه میکینم :
<css>
#MainMenu a
{
	font: Arial, Helvetica, sans-serif;
	font-size: 16px;
	color: #bdbbbb;
	background-color: #3f44a0;
	text-decoration: none;
	display: block;
	width: 80px;
	height: 30px;	
}
<css>
خروجی :
||https://tosinso.com//files/get/463ad652-3d1e-492e-9289-e1c8e7247776||
خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :
این کد رو به header.css اضافه میکینم :
<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;
}
<css>
خروجی :
||https://tosinso.com//files/get/d10618d1-d962-47bd-b62e-03c61fc1872c||
خوب میبینید که با موس روی منو خانه رفتیم و رنگ پس زمینه عوض شد همچنین با استفاده از کد box-shadow یه سایه هم دور دکمه منو ها گذاشتیم ، بخاطر اینکه box-shadow روی browser های مختلف کار کنه در نتیجه به اول این کد moz و webkit و ms و o اضافه میکنیم . (این کد جز کدهای CSS3 هست) ولی خوب این قضیه 100% جواب نمیده یعنی با اینکه به ابتدای کدها ms یا moz اضافه کردیم ولی ممکنه بازم روی بعضی از browser ها کار نکنه .
moz واسه mozila 
webkit واسه google chrome 
ms واسه Internet Explorer
o واسه Opera

حالا میایم کدهایی رو بصورت زیر تغییر میدیم :
<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 #9b9b9b;
	text-align: center;
	line-height: 30px;
}
<css>
خروجی میگیریم :
||https://tosinso.com//files/get/6f0e52b6-49af-4352-8f69-5516128b9056||

خوب توی قسمت قبلی دیدیم که کدمون اشکال داشت و یه هکر راحت میتونست بدون اینکه یوزر و پسورد داشته باشه به سایت نفوذ کنه حالا میایم این باگ رفع میکنیم .
میتونیم از تابعی به نام  mysql__real__escape__string استفاده کنیم ابتدا قبل استفاده از این تابع، کد Login__Model.php بصورت زیر تغییر میدیم ( فقط یه تابع die اضافه میکنیم تا ببینیم مقادیری که وارد میکنیم به چه صورتی میشه )
<php>
             .
             .
             .
$user = $_POST[txt_User];
$pass = md5($_POST[txt_Pass]);
$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		die($sql);
             .
             .
             .
<php>

خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/7f83a8f5-a715-43d1-b77a-8a973db1be50||
خوب توی عکس میبینید که با توجه به ورودی ما، برنامه زمانی خروجی برمیگردونه که یا یوزر برابر مقدار alaki باشه یا هم 1 برابر 1 ، پس همیشه نتیجه شرط درست میشه و هکر میتونه به سایت نفوذ کنه و بقیه دستورات بعد از کاراکتر # نیز نادیده گرفته میشه (یعنی بقیه دستورات بصورت کامنت یا توضیحات در نظر گرفته میشه)
حالا میایم یه مقدار کد تغییر میدیم و تابع mysql__real__escape__string اضافه میکنیم .
<php>
                  .
                  .
                  .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
$result = mysql_query($sql);
                  .
                  .
                  .
<php>
و خروجی میگیریم ببینیم بازم میتونیم به سایت نفوذ کنیم یا نه ؟؟
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/5f29e5df-c89e-4817-aaad-d7e74dd5f045||
خوب میبینید که دیگه اجازه نداد به سایت نفوذ کنیم، الان میایم از تابع die استفاده میکنیم ببینیم این تابع mysql__real__escape__string چه بلایی سر ورودی که ما بهش دادیم آورد که دیگه بهمون Welcome نداد (یعنی نتونستیم به سایت نفوذ کنیم)
کد بصورت زیر تغییر میدیم (فقط یه die بهش اضافه میکنیم) :
<php>
             .
             .
             .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
die($sql);
           .
           .
           .
<php>

خروجی :
||https://tosinso.com//files/get/6db43116-e261-404c-8bcc-86497d2d31b2||
خوب میبینید که کاراکتر های ' (تک کوتیشن) رو با استفاده از کاراکتر \ غیر فعال میکنه .

با این حال که باگ کد گرفتیم ولی بازم شاید یه هکر بتونه به سایت نفوذ کنه ، بهترین راه حل اینکه که از توابع PDO واسه اتصال به بانک اطلاعاتی و اجرای دستورات روی جداول استفاده کنیم اینجوری هم امنیت سایت بالا میره هم اینکه با استفاده از توابع PDO میتونیم به راحتی با تغییر خیلی کوچیک توی کدها، به انواع دیگه ای از بانکهای اطلاعاتی (مثلاً MSSql، SQLite و Oracle و...) متصل بشیم و ازشون استفاده کنیم ولی اگه از توابع PDO استفاده نکنیم زمانی که مثلاً دیگه نمیخوایم توی سایتمون از بانک Mysql استفاده کنیم و ترجیح میدیم از بانک Oracle استفاده کنیم در نتیجه مجبوریم خیلی از کدهایی که نوشتیمو تغییر بدیم که کلی دردسر داره و  وقت زیادی میبره ولی با استفاده از توابع PDO این کار خیلی راحت با تغییر چند خط کد انجام میشه ، پس حالا میایم یه تغییراتی توی کدهامون میدیم که بتونیم از توابع PDO استفاده کنیم .
یه فولدر میسازیم بنام Config و یه فایل بنام database.php توش میسازیم ، حالا این کدهارو توش مینویسیم .
<php>
<?php
define(DB_TYPE, mysql);
define(DB_HOST, localhost);
define(DB_NAME, ITPro);
define(DB_USER, root);
define(DB_PASS, mehdi!1230);
<php>
تابع define یه متغیر میسازه و یه مقدار داخلش میزاره، که میتونیم همه جای سایت به این متغیر دسترسی داشته باشیم و مقدارش هم ثابت هست (یعنی قابل تغییر نیست) .
الان میایم یه فایل دیگه بنام Database.php توی فولدر Libs میسازیم و کدهای زیر توش قرار میدیم (میخوایم یه کلاس بنام Database ایجاد کنیم که از PDO ارث میبره و میتونیم از توابع PDO استفاده کنیم توی سایتمون)
<php>
<?php
class Database extends PDO
{
	function __construct()
	{
		parent::__construct(DB_TYPE.:host=.DB_HOST.;dbname=.DB_NAME, DB_USER, DB_PASS);
	}
}
<php>
ورودی تابع سازنده PDO به ترتیب نوع بانک اطلاعاتی، هاست، نام دیتابیس، یوزر و پسورد هست که با استفاده از متغیرهایی که ساختیم مقدار دهی کردیم .
الان با این خط کد به بانک اطلاعاتی متصل شدیم حالا از این کلاس استفاده میکنیم توی فایل Login_Model.php  .
ابتدا یه کلاس دیگه هم تولید میکنیم و کدهایی که مشترک هستن واسه کار با دیتابیس رو اونجا مینویسیم و سپس بقیه کلاس ها از این کلاس ارث میبرن .
یه فایل بنام Model.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم (میخوایم کلاس Model ایجاد کنیم تا بقیه کلاسها که عملیاتی روی دیتابیس انجام میدن از این کلاس ارث ببرن)
<php>
<?php

class Model
{
	function __construct()
	{
		$this->db = new Database();
	}
}
<php>
یه شی از نوع کلاس Database میسازه (و تابع سازنده اش فراخوانی میشه) و مقدار برگشتی رو توی یه متغیر به نام db میریزه که بعداً از این متغیر استفاده میکنیم .
حالا میایم کد Login_Model.php کمی تغییر میدیم بصورت زیر (فقط کاری میکنیم که این کلاس از کلاس Model ارث ببره و تابع سازنده کلاس Model فراخوانی میکنیم)، در ضمن کدهای اتصال به دیتابیس و MYSql غیر فعال میکنیم (یا بهتر که حذفشون بکنیم) چون دیگه این کدهارو توی کلاس Databese نوشتیم و دیگه نیازی بهشون نداریم .
کد Login_Model.php :
<php>
<?php

class Login_Model extends Model
{
	function __construct()
	{
		parent::__construct();
	}
	
	function run()
	{
		/*$link = mysql_connect('localhost', 'root', 'mehdi!1230');
		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 = $_POST[txt_Pass];
		
		//$user = mysql_real_escape_string($_POST[txt_User]);
		//$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));
		
		//$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		//$result = mysql_query($sql);
		
		$qurey = $this->db->prepare(select * from tlb_UserPass where 
										username = :userlogin and password = md5(:passlogin));
		
		$qurey->execute(array(:userlogin => $user, :passlogin => $pass));
		
		//die($sql);
		
		$count = $qurey->rowcount();
		
		/*if (!$result) {
			die ('Invalid query : ' . mysql_error());
		}
		if($row = mysql_fetch_row($result))
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
		die();*/
		
		if($count > 0)
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
	}
}
<php>
توضیح کدهای بالا، Query که مینویسیم رو توی تابع prepare قرار میدیم و تابع execute میاد Query که نوشتیمو اجرا میکنه و اگه این Query باید ورودی بگیره توی تابع execute ورودی هارو بصورت آرایه بهش میدیم (که اینجا من ورودی هارو بصورت آرایه به Query دادم) و سپس با تابع rowcount چک میکنیم که اگه بزرگتر از صفر بود یعنی Query با موفقیت اجرا شده و یه رکورد برای ما (به عنوان خروجی) برگردونده ولی اگه کمتر از صفر باشه یعنی نتونست نسبت به شرط و مقداری که به Query دادیم رکوردی برای ما برگردونده .
||https://tosinso.com//files/get/097a2b03-9f31-4553-9319-c376c0a773e4||
||https://tosinso.com//files/get/89b1c566-a9d5-4fcd-8c64-8a477a273417||
خطا میده ، میگه نتونست کلاس Model پیدا کنه ، پس ما باید با دستور require این خطا رو برطرف کنیم، کد زیر رو اضافه میکنیم به فایل Index.php (توی پوشه اصلی سایت)  .
کد Index.php :
<php>
             .
             .
             .
require(libs/view.php);
	
require(libs/Model.php);

require(libs/Bootstrap.php);
             .
             .
             .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Index.php هست)
یه بار دیگه که امتحان کنیم به این خطا برخورد میکنیم :
||https://tosinso.com//files/get/7b93b03e-c632-417a-89dc-053407360393||
این سری کلاس Database پیدا نکرد در نتیجه همون کاری که بالا انجام دادیم واسه کلاس Database هم انجام میدیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Libs/Database.php);
<php>

همین جوری هی خروجی میگیریم تا ببینیم به چه خطاهایی برخورد میکنیم و اونارو رفع کنیم :
||https://tosinso.com//files/get/27493487-3c66-496f-8f84-84a24b7764d8||
این خطا هم میگه که نتونست اون متغیرهایی که با دستور define تعریف کردیمو پیدا کنه پس این خطا رو هم مثل بالا رفعش میکنیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Config/database.php);
<php>
خروجی میگیریم :
||https://tosinso.com//files/get/5bbc2f64-e4ce-45b4-803b-ce302cff829f||
میبینید که الان جواب داد ، حالا میایم یه تغییرات دیگه هم به کدهای سایتمون میدیم .
در ابتدا کد Bootstrap.php بصورت زیر تغییر میدیم .
<php>
                 .
                 .
                 .
$controller = new $url[0]();
$controller->loadModel($url[0]);

if(!empty($url[1]))
                 .
                 .
                 .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Bootstrap.php هست)، یه تابع فراخوانی میکنیم بنام loadModel و مقدار [0]url$ بهش میدیم (در ادامه این تابع توی کلاس Controller تعریف میکنیم)
کد Controller.php بصورت زیر تغییر میدیم :
<php>
<?php

class Controller
{
	function __construct()
	{
		//echo <br>Main Controller<br>;
		
		$this->view = new View();
	}
	
	function loadModel($name)
	{
		$path = models/.$name._model.php;
		
		if(file_exists($path))
		{
			require($path);
			
			$ModelName = $name._model;
			$this->model = new $ModelName();
		}
	}	
}
<php>
تابع loadModel یه ورودی میگیره که این ورودی اولین خانه آرایه url هست (یعنی [0]url$) و این ورودی رو به model.php__ و /models میچسبونه و یه مقدار جدید (که میشه یه فایل بهمراه مسیرش) درست میشه و توی متغیر path$ قرار میگیره و سپس چک میکنه که اگه این فایل با همچین مسیری وجود داشت که یه شی ازش میسازه (که در نتیجه تابع سازندش فراخوانی میشه) و سپس نتیجه رو توی متغیر model میریزه که بعداً توی کلاس Login ازش استفاده میکنیم . (این کد رو واسه این نوشتیم چون در آینده توی فولدر Models یا Controllers کلاس های دیگه ای به غیر از Login__Model یا Login اضافه میکنیم و بخاطر اینکه از تعداد خط های کد اضافی بکاهیم این تابع رو نوشتیم اگه این تابع رو نمی نوشتیم باید توی هر کلاسی که (در آینده) توی فولدر Models یا Controlers تعریف میکنیم چند خط کد بنویسیم (مثلاً همین کدی که توی تابع run از کلاس Login نوشتیم) و اینجوری هم تعداد خط کد بالا میره هم بیشتر پیچیده میشه در نتیجه خطا یابیش مشکل تر میشه) .
خوب طبق چیزایی که در بالا گفتم باید تابع ()run توی کلاس Login بصورت زیر تغییر بدیم :
<php>
function run()
{
	//require(models/Login_Model.php);
	
	//$L_M = new Login_Model();
	//$L_M->run();
	
	$this->model->run();
}
<php>
کدهای قبلی رو غیر فعال کردم و بجاش فقط خط آخر اضافه میکنم . (که پیچیدگی کمتر بشه و خطایابیش سریع تر انجام بگیره)
خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/e14ef9a0-04c2-46fe-97b9-4a380c1c6c2a||
میبینید که داره درست جواب میده .

امیدوارم این آموزش هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب الان میایم یه قالب واسه منوها مینویسیم .

کد زیر رو به کدهای 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;
}

خروجی رو باهم میبینیم :

سلام به همه دوستان خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه Login توی کل صفحات باشه به عنوان هدر سایت و در ادامه یه قالب واسه لیست منو ها مینویسیم .توی کد Index.php (توی فولدر Login) تگ div با id بنام SingUp داریم که این تگ رو انتقال میدیم به کدهای Header.php .البته به غیر از انتقال تگ ، یکمی هم کد header.php بصورت زیر تغییر میدیم .کد header.php :
<htm>
<!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>
<htm>
خوب حالا یه فایل بنام header.css توی فولدر CSS میسازیم و سپس کدهای CSS مربوط به تگ SingUp رو از فایل Login.css انتقال میدیم به فایل header.css (با کمی تغییرات) .

کد header.css :
<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;
}
<css>

کد Login.css :
<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;
}
<css>

حالا یه خروجی میگیریم :
||https://tosinso.com//files/get/c12e6551-a622-4583-8498-b8102150e264||
||https://tosinso.com//files/get/779059f9-849e-47d2-8e5f-52d9ae879ee5||

خوب الان میایم یه قالب واسه منوها مینویسیم .
کد زیر رو به کدهای header.css اضافه میکنیم :
<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;
}
<css>
خروجی رو باهم میبینیم :
||https://tosinso.com//files/get/c7717d97-50bc-4218-a8a9-78eafeda9bfc||

حالا این کدهارو هم اضافه میکینم :
<css>
#MainMenu a
{
	font: Arial, Helvetica, sans-serif;
	font-size: 16px;
	color: #bdbbbb;
	background-color: #3f44a0;
	text-decoration: none;
	display: block;
	width: 80px;
	height: 30px;	
}
<css>
خروجی :
||https://tosinso.com//files/get/463ad652-3d1e-492e-9289-e1c8e7247776||
خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :
این کد رو به header.css اضافه میکینم :
<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;
}
<css>
خروجی :
||https://tosinso.com//files/get/d10618d1-d962-47bd-b62e-03c61fc1872c||
خوب میبینید که با موس روی منو خانه رفتیم و رنگ پس زمینه عوض شد همچنین با استفاده از کد box-shadow یه سایه هم دور دکمه منو ها گذاشتیم ، بخاطر اینکه box-shadow روی browser های مختلف کار کنه در نتیجه به اول این کد moz و webkit و ms و o اضافه میکنیم . (این کد جز کدهای CSS3 هست) ولی خوب این قضیه 100% جواب نمیده یعنی با اینکه به ابتدای کدها ms یا moz اضافه کردیم ولی ممکنه بازم روی بعضی از browser ها کار نکنه .
moz واسه mozila 
webkit واسه google chrome 
ms واسه Internet Explorer
o واسه Opera

حالا میایم کدهایی رو بصورت زیر تغییر میدیم :
<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 #9b9b9b;
	text-align: center;
	line-height: 30px;
}
<css>
خروجی میگیریم :
||https://tosinso.com//files/get/6f0e52b6-49af-4352-8f69-5516128b9056||

خوب توی قسمت قبلی دیدیم که کدمون اشکال داشت و یه هکر راحت میتونست بدون اینکه یوزر و پسورد داشته باشه به سایت نفوذ کنه حالا میایم این باگ رفع میکنیم .
میتونیم از تابعی به نام  mysql__real__escape__string استفاده کنیم ابتدا قبل استفاده از این تابع، کد Login__Model.php بصورت زیر تغییر میدیم ( فقط یه تابع die اضافه میکنیم تا ببینیم مقادیری که وارد میکنیم به چه صورتی میشه )
<php>
             .
             .
             .
$user = $_POST[txt_User];
$pass = md5($_POST[txt_Pass]);
$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		die($sql);
             .
             .
             .
<php>

خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/7f83a8f5-a715-43d1-b77a-8a973db1be50||
خوب توی عکس میبینید که با توجه به ورودی ما، برنامه زمانی خروجی برمیگردونه که یا یوزر برابر مقدار alaki باشه یا هم 1 برابر 1 ، پس همیشه نتیجه شرط درست میشه و هکر میتونه به سایت نفوذ کنه و بقیه دستورات بعد از کاراکتر # نیز نادیده گرفته میشه (یعنی بقیه دستورات بصورت کامنت یا توضیحات در نظر گرفته میشه)
حالا میایم یه مقدار کد تغییر میدیم و تابع mysql__real__escape__string اضافه میکنیم .
<php>
                  .
                  .
                  .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
$result = mysql_query($sql);
                  .
                  .
                  .
<php>
و خروجی میگیریم ببینیم بازم میتونیم به سایت نفوذ کنیم یا نه ؟؟
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/5f29e5df-c89e-4817-aaad-d7e74dd5f045||
خوب میبینید که دیگه اجازه نداد به سایت نفوذ کنیم، الان میایم از تابع die استفاده میکنیم ببینیم این تابع mysql__real__escape__string چه بلایی سر ورودی که ما بهش دادیم آورد که دیگه بهمون Welcome نداد (یعنی نتونستیم به سایت نفوذ کنیم)
کد بصورت زیر تغییر میدیم (فقط یه die بهش اضافه میکنیم) :
<php>
             .
             .
             .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
die($sql);
           .
           .
           .
<php>

خروجی :
||https://tosinso.com//files/get/6db43116-e261-404c-8bcc-86497d2d31b2||
خوب میبینید که کاراکتر های ' (تک کوتیشن) رو با استفاده از کاراکتر \ غیر فعال میکنه .

با این حال که باگ کد گرفتیم ولی بازم شاید یه هکر بتونه به سایت نفوذ کنه ، بهترین راه حل اینکه که از توابع PDO واسه اتصال به بانک اطلاعاتی و اجرای دستورات روی جداول استفاده کنیم اینجوری هم امنیت سایت بالا میره هم اینکه با استفاده از توابع PDO میتونیم به راحتی با تغییر خیلی کوچیک توی کدها، به انواع دیگه ای از بانکهای اطلاعاتی (مثلاً MSSql، SQLite و Oracle و...) متصل بشیم و ازشون استفاده کنیم ولی اگه از توابع PDO استفاده نکنیم زمانی که مثلاً دیگه نمیخوایم توی سایتمون از بانک Mysql استفاده کنیم و ترجیح میدیم از بانک Oracle استفاده کنیم در نتیجه مجبوریم خیلی از کدهایی که نوشتیمو تغییر بدیم که کلی دردسر داره و  وقت زیادی میبره ولی با استفاده از توابع PDO این کار خیلی راحت با تغییر چند خط کد انجام میشه ، پس حالا میایم یه تغییراتی توی کدهامون میدیم که بتونیم از توابع PDO استفاده کنیم .
یه فولدر میسازیم بنام Config و یه فایل بنام database.php توش میسازیم ، حالا این کدهارو توش مینویسیم .
<php>
<?php
define(DB_TYPE, mysql);
define(DB_HOST, localhost);
define(DB_NAME, ITPro);
define(DB_USER, root);
define(DB_PASS, mehdi!1230);
<php>
تابع define یه متغیر میسازه و یه مقدار داخلش میزاره، که میتونیم همه جای سایت به این متغیر دسترسی داشته باشیم و مقدارش هم ثابت هست (یعنی قابل تغییر نیست) .
الان میایم یه فایل دیگه بنام Database.php توی فولدر Libs میسازیم و کدهای زیر توش قرار میدیم (میخوایم یه کلاس بنام Database ایجاد کنیم که از PDO ارث میبره و میتونیم از توابع PDO استفاده کنیم توی سایتمون)
<php>
<?php
class Database extends PDO
{
	function __construct()
	{
		parent::__construct(DB_TYPE.:host=.DB_HOST.;dbname=.DB_NAME, DB_USER, DB_PASS);
	}
}
<php>
ورودی تابع سازنده PDO به ترتیب نوع بانک اطلاعاتی، هاست، نام دیتابیس، یوزر و پسورد هست که با استفاده از متغیرهایی که ساختیم مقدار دهی کردیم .
الان با این خط کد به بانک اطلاعاتی متصل شدیم حالا از این کلاس استفاده میکنیم توی فایل Login_Model.php  .
ابتدا یه کلاس دیگه هم تولید میکنیم و کدهایی که مشترک هستن واسه کار با دیتابیس رو اونجا مینویسیم و سپس بقیه کلاس ها از این کلاس ارث میبرن .
یه فایل بنام Model.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم (میخوایم کلاس Model ایجاد کنیم تا بقیه کلاسها که عملیاتی روی دیتابیس انجام میدن از این کلاس ارث ببرن)
<php>
<?php

class Model
{
	function __construct()
	{
		$this->db = new Database();
	}
}
<php>
یه شی از نوع کلاس Database میسازه (و تابع سازنده اش فراخوانی میشه) و مقدار برگشتی رو توی یه متغیر به نام db میریزه که بعداً از این متغیر استفاده میکنیم .
حالا میایم کد Login_Model.php کمی تغییر میدیم بصورت زیر (فقط کاری میکنیم که این کلاس از کلاس Model ارث ببره و تابع سازنده کلاس Model فراخوانی میکنیم)، در ضمن کدهای اتصال به دیتابیس و MYSql غیر فعال میکنیم (یا بهتر که حذفشون بکنیم) چون دیگه این کدهارو توی کلاس Databese نوشتیم و دیگه نیازی بهشون نداریم .
کد Login_Model.php :
<php>
<?php

class Login_Model extends Model
{
	function __construct()
	{
		parent::__construct();
	}
	
	function run()
	{
		/*$link = mysql_connect('localhost', 'root', 'mehdi!1230');
		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 = $_POST[txt_Pass];
		
		//$user = mysql_real_escape_string($_POST[txt_User]);
		//$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));
		
		//$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		//$result = mysql_query($sql);
		
		$qurey = $this->db->prepare(select * from tlb_UserPass where 
										username = :userlogin and password = md5(:passlogin));
		
		$qurey->execute(array(:userlogin => $user, :passlogin => $pass));
		
		//die($sql);
		
		$count = $qurey->rowcount();
		
		/*if (!$result) {
			die ('Invalid query : ' . mysql_error());
		}
		if($row = mysql_fetch_row($result))
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
		die();*/
		
		if($count > 0)
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
	}
}
<php>
توضیح کدهای بالا، Query که مینویسیم رو توی تابع prepare قرار میدیم و تابع execute میاد Query که نوشتیمو اجرا میکنه و اگه این Query باید ورودی بگیره توی تابع execute ورودی هارو بصورت آرایه بهش میدیم (که اینجا من ورودی هارو بصورت آرایه به Query دادم) و سپس با تابع rowcount چک میکنیم که اگه بزرگتر از صفر بود یعنی Query با موفقیت اجرا شده و یه رکورد برای ما (به عنوان خروجی) برگردونده ولی اگه کمتر از صفر باشه یعنی نتونست نسبت به شرط و مقداری که به Query دادیم رکوردی برای ما برگردونده .
||https://tosinso.com//files/get/097a2b03-9f31-4553-9319-c376c0a773e4||
||https://tosinso.com//files/get/89b1c566-a9d5-4fcd-8c64-8a477a273417||
خطا میده ، میگه نتونست کلاس Model پیدا کنه ، پس ما باید با دستور require این خطا رو برطرف کنیم، کد زیر رو اضافه میکنیم به فایل Index.php (توی پوشه اصلی سایت)  .
کد Index.php :
<php>
             .
             .
             .
require(libs/view.php);
	
require(libs/Model.php);

require(libs/Bootstrap.php);
             .
             .
             .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Index.php هست)
یه بار دیگه که امتحان کنیم به این خطا برخورد میکنیم :
||https://tosinso.com//files/get/7b93b03e-c632-417a-89dc-053407360393||
این سری کلاس Database پیدا نکرد در نتیجه همون کاری که بالا انجام دادیم واسه کلاس Database هم انجام میدیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Libs/Database.php);
<php>

همین جوری هی خروجی میگیریم تا ببینیم به چه خطاهایی برخورد میکنیم و اونارو رفع کنیم :
||https://tosinso.com//files/get/27493487-3c66-496f-8f84-84a24b7764d8||
این خطا هم میگه که نتونست اون متغیرهایی که با دستور define تعریف کردیمو پیدا کنه پس این خطا رو هم مثل بالا رفعش میکنیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Config/database.php);
<php>
خروجی میگیریم :
||https://tosinso.com//files/get/5bbc2f64-e4ce-45b4-803b-ce302cff829f||
میبینید که الان جواب داد ، حالا میایم یه تغییرات دیگه هم به کدهای سایتمون میدیم .
در ابتدا کد Bootstrap.php بصورت زیر تغییر میدیم .
<php>
                 .
                 .
                 .
$controller = new $url[0]();
$controller->loadModel($url[0]);

if(!empty($url[1]))
                 .
                 .
                 .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Bootstrap.php هست)، یه تابع فراخوانی میکنیم بنام loadModel و مقدار [0]url$ بهش میدیم (در ادامه این تابع توی کلاس Controller تعریف میکنیم)
کد Controller.php بصورت زیر تغییر میدیم :
<php>
<?php

class Controller
{
	function __construct()
	{
		//echo <br>Main Controller<br>;
		
		$this->view = new View();
	}
	
	function loadModel($name)
	{
		$path = models/.$name._model.php;
		
		if(file_exists($path))
		{
			require($path);
			
			$ModelName = $name._model;
			$this->model = new $ModelName();
		}
	}	
}
<php>
تابع loadModel یه ورودی میگیره که این ورودی اولین خانه آرایه url هست (یعنی [0]url$) و این ورودی رو به model.php__ و /models میچسبونه و یه مقدار جدید (که میشه یه فایل بهمراه مسیرش) درست میشه و توی متغیر path$ قرار میگیره و سپس چک میکنه که اگه این فایل با همچین مسیری وجود داشت که یه شی ازش میسازه (که در نتیجه تابع سازندش فراخوانی میشه) و سپس نتیجه رو توی متغیر model میریزه که بعداً توی کلاس Login ازش استفاده میکنیم . (این کد رو واسه این نوشتیم چون در آینده توی فولدر Models یا Controllers کلاس های دیگه ای به غیر از Login__Model یا Login اضافه میکنیم و بخاطر اینکه از تعداد خط های کد اضافی بکاهیم این تابع رو نوشتیم اگه این تابع رو نمی نوشتیم باید توی هر کلاسی که (در آینده) توی فولدر Models یا Controlers تعریف میکنیم چند خط کد بنویسیم (مثلاً همین کدی که توی تابع run از کلاس Login نوشتیم) و اینجوری هم تعداد خط کد بالا میره هم بیشتر پیچیده میشه در نتیجه خطا یابیش مشکل تر میشه) .
خوب طبق چیزایی که در بالا گفتم باید تابع ()run توی کلاس Login بصورت زیر تغییر بدیم :
<php>
function run()
{
	//require(models/Login_Model.php);
	
	//$L_M = new Login_Model();
	//$L_M->run();
	
	$this->model->run();
}
<php>
کدهای قبلی رو غیر فعال کردم و بجاش فقط خط آخر اضافه میکنم . (که پیچیدگی کمتر بشه و خطایابیش سریع تر انجام بگیره)
خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/e14ef9a0-04c2-46fe-97b9-4a380c1c6c2a||
میبینید که داره درست جواب میده .

امیدوارم این آموزش هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

حالا این کدهارو هم اضافه میکینم :

#MainMenu a
{
	font: Arial, Helvetica, sans-serif;
	font-size: 16px;
	color: #bdbbbb;
	background-color: #3f44a0;
	text-decoration: none;
	display: block;
	width: 80px;
	height: 30px;	
}

خروجی :

سلام به همه دوستان خوب در ابتدا یه تغییراتی انجام میدیم، میخوایم این کادر بالای صفحه Login توی کل صفحات باشه به عنوان هدر سایت و در ادامه یه قالب واسه لیست منو ها مینویسیم .توی کد Index.php (توی فولدر Login) تگ div با id بنام SingUp داریم که این تگ رو انتقال میدیم به کدهای Header.php .البته به غیر از انتقال تگ ، یکمی هم کد header.php بصورت زیر تغییر میدیم .کد header.php :
<htm>
<!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>
<htm>
خوب حالا یه فایل بنام header.css توی فولدر CSS میسازیم و سپس کدهای CSS مربوط به تگ SingUp رو از فایل Login.css انتقال میدیم به فایل header.css (با کمی تغییرات) .

کد header.css :
<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;
}
<css>

کد Login.css :
<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;
}
<css>

حالا یه خروجی میگیریم :
||https://tosinso.com//files/get/c12e6551-a622-4583-8498-b8102150e264||
||https://tosinso.com//files/get/779059f9-849e-47d2-8e5f-52d9ae879ee5||

خوب الان میایم یه قالب واسه منوها مینویسیم .
کد زیر رو به کدهای header.css اضافه میکنیم :
<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;
}
<css>
خروجی رو باهم میبینیم :
||https://tosinso.com//files/get/c7717d97-50bc-4218-a8a9-78eafeda9bfc||

حالا این کدهارو هم اضافه میکینم :
<css>
#MainMenu a
{
	font: Arial, Helvetica, sans-serif;
	font-size: 16px;
	color: #bdbbbb;
	background-color: #3f44a0;
	text-decoration: none;
	display: block;
	width: 80px;
	height: 30px;	
}
<css>
خروجی :
||https://tosinso.com//files/get/463ad652-3d1e-492e-9289-e1c8e7247776||
خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :
این کد رو به header.css اضافه میکینم :
<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;
}
<css>
خروجی :
||https://tosinso.com//files/get/d10618d1-d962-47bd-b62e-03c61fc1872c||
خوب میبینید که با موس روی منو خانه رفتیم و رنگ پس زمینه عوض شد همچنین با استفاده از کد box-shadow یه سایه هم دور دکمه منو ها گذاشتیم ، بخاطر اینکه box-shadow روی browser های مختلف کار کنه در نتیجه به اول این کد moz و webkit و ms و o اضافه میکنیم . (این کد جز کدهای CSS3 هست) ولی خوب این قضیه 100% جواب نمیده یعنی با اینکه به ابتدای کدها ms یا moz اضافه کردیم ولی ممکنه بازم روی بعضی از browser ها کار نکنه .
moz واسه mozila 
webkit واسه google chrome 
ms واسه Internet Explorer
o واسه Opera

حالا میایم کدهایی رو بصورت زیر تغییر میدیم :
<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 #9b9b9b;
	text-align: center;
	line-height: 30px;
}
<css>
خروجی میگیریم :
||https://tosinso.com//files/get/6f0e52b6-49af-4352-8f69-5516128b9056||

خوب توی قسمت قبلی دیدیم که کدمون اشکال داشت و یه هکر راحت میتونست بدون اینکه یوزر و پسورد داشته باشه به سایت نفوذ کنه حالا میایم این باگ رفع میکنیم .
میتونیم از تابعی به نام  mysql__real__escape__string استفاده کنیم ابتدا قبل استفاده از این تابع، کد Login__Model.php بصورت زیر تغییر میدیم ( فقط یه تابع die اضافه میکنیم تا ببینیم مقادیری که وارد میکنیم به چه صورتی میشه )
<php>
             .
             .
             .
$user = $_POST[txt_User];
$pass = md5($_POST[txt_Pass]);
$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		die($sql);
             .
             .
             .
<php>

خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/7f83a8f5-a715-43d1-b77a-8a973db1be50||
خوب توی عکس میبینید که با توجه به ورودی ما، برنامه زمانی خروجی برمیگردونه که یا یوزر برابر مقدار alaki باشه یا هم 1 برابر 1 ، پس همیشه نتیجه شرط درست میشه و هکر میتونه به سایت نفوذ کنه و بقیه دستورات بعد از کاراکتر # نیز نادیده گرفته میشه (یعنی بقیه دستورات بصورت کامنت یا توضیحات در نظر گرفته میشه)
حالا میایم یه مقدار کد تغییر میدیم و تابع mysql__real__escape__string اضافه میکنیم .
<php>
                  .
                  .
                  .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
$result = mysql_query($sql);
                  .
                  .
                  .
<php>
و خروجی میگیریم ببینیم بازم میتونیم به سایت نفوذ کنیم یا نه ؟؟
||https://tosinso.com//files/get/cdef762c-38a4-45b0-a8ff-2f780d265331||
||https://tosinso.com//files/get/5f29e5df-c89e-4817-aaad-d7e74dd5f045||
خوب میبینید که دیگه اجازه نداد به سایت نفوذ کنیم، الان میایم از تابع die استفاده میکنیم ببینیم این تابع mysql__real__escape__string چه بلایی سر ورودی که ما بهش دادیم آورد که دیگه بهمون Welcome نداد (یعنی نتونستیم به سایت نفوذ کنیم)
کد بصورت زیر تغییر میدیم (فقط یه die بهش اضافه میکنیم) :
<php>
             .
             .
             .
//$user = $_POST[txt_User];
//$pass = md5($_POST[txt_Pass]);
$user = mysql_real_escape_string($_POST[txt_User]);
$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));

$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
die($sql);
           .
           .
           .
<php>

خروجی :
||https://tosinso.com//files/get/6db43116-e261-404c-8bcc-86497d2d31b2||
خوب میبینید که کاراکتر های ' (تک کوتیشن) رو با استفاده از کاراکتر \ غیر فعال میکنه .

با این حال که باگ کد گرفتیم ولی بازم شاید یه هکر بتونه به سایت نفوذ کنه ، بهترین راه حل اینکه که از توابع PDO واسه اتصال به بانک اطلاعاتی و اجرای دستورات روی جداول استفاده کنیم اینجوری هم امنیت سایت بالا میره هم اینکه با استفاده از توابع PDO میتونیم به راحتی با تغییر خیلی کوچیک توی کدها، به انواع دیگه ای از بانکهای اطلاعاتی (مثلاً MSSql، SQLite و Oracle و...) متصل بشیم و ازشون استفاده کنیم ولی اگه از توابع PDO استفاده نکنیم زمانی که مثلاً دیگه نمیخوایم توی سایتمون از بانک Mysql استفاده کنیم و ترجیح میدیم از بانک Oracle استفاده کنیم در نتیجه مجبوریم خیلی از کدهایی که نوشتیمو تغییر بدیم که کلی دردسر داره و  وقت زیادی میبره ولی با استفاده از توابع PDO این کار خیلی راحت با تغییر چند خط کد انجام میشه ، پس حالا میایم یه تغییراتی توی کدهامون میدیم که بتونیم از توابع PDO استفاده کنیم .
یه فولدر میسازیم بنام Config و یه فایل بنام database.php توش میسازیم ، حالا این کدهارو توش مینویسیم .
<php>
<?php
define(DB_TYPE, mysql);
define(DB_HOST, localhost);
define(DB_NAME, ITPro);
define(DB_USER, root);
define(DB_PASS, mehdi!1230);
<php>
تابع define یه متغیر میسازه و یه مقدار داخلش میزاره، که میتونیم همه جای سایت به این متغیر دسترسی داشته باشیم و مقدارش هم ثابت هست (یعنی قابل تغییر نیست) .
الان میایم یه فایل دیگه بنام Database.php توی فولدر Libs میسازیم و کدهای زیر توش قرار میدیم (میخوایم یه کلاس بنام Database ایجاد کنیم که از PDO ارث میبره و میتونیم از توابع PDO استفاده کنیم توی سایتمون)
<php>
<?php
class Database extends PDO
{
	function __construct()
	{
		parent::__construct(DB_TYPE.:host=.DB_HOST.;dbname=.DB_NAME, DB_USER, DB_PASS);
	}
}
<php>
ورودی تابع سازنده PDO به ترتیب نوع بانک اطلاعاتی، هاست، نام دیتابیس، یوزر و پسورد هست که با استفاده از متغیرهایی که ساختیم مقدار دهی کردیم .
الان با این خط کد به بانک اطلاعاتی متصل شدیم حالا از این کلاس استفاده میکنیم توی فایل Login_Model.php  .
ابتدا یه کلاس دیگه هم تولید میکنیم و کدهایی که مشترک هستن واسه کار با دیتابیس رو اونجا مینویسیم و سپس بقیه کلاس ها از این کلاس ارث میبرن .
یه فایل بنام Model.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم (میخوایم کلاس Model ایجاد کنیم تا بقیه کلاسها که عملیاتی روی دیتابیس انجام میدن از این کلاس ارث ببرن)
<php>
<?php

class Model
{
	function __construct()
	{
		$this->db = new Database();
	}
}
<php>
یه شی از نوع کلاس Database میسازه (و تابع سازنده اش فراخوانی میشه) و مقدار برگشتی رو توی یه متغیر به نام db میریزه که بعداً از این متغیر استفاده میکنیم .
حالا میایم کد Login_Model.php کمی تغییر میدیم بصورت زیر (فقط کاری میکنیم که این کلاس از کلاس Model ارث ببره و تابع سازنده کلاس Model فراخوانی میکنیم)، در ضمن کدهای اتصال به دیتابیس و MYSql غیر فعال میکنیم (یا بهتر که حذفشون بکنیم) چون دیگه این کدهارو توی کلاس Databese نوشتیم و دیگه نیازی بهشون نداریم .
کد Login_Model.php :
<php>
<?php

class Login_Model extends Model
{
	function __construct()
	{
		parent::__construct();
	}
	
	function run()
	{
		/*$link = mysql_connect('localhost', 'root', 'mehdi!1230');
		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 = $_POST[txt_Pass];
		
		//$user = mysql_real_escape_string($_POST[txt_User]);
		//$pass = md5(mysql_real_escape_string($_POST[txt_Pass]));
		
		//$sql = select * from tlb_UserPass where username='{$user}' and password='{$pass}';
		//$result = mysql_query($sql);
		
		$qurey = $this->db->prepare(select * from tlb_UserPass where 
										username = :userlogin and password = md5(:passlogin));
		
		$qurey->execute(array(:userlogin => $user, :passlogin => $pass));
		
		//die($sql);
		
		$count = $qurey->rowcount();
		
		/*if (!$result) {
			die ('Invalid query : ' . mysql_error());
		}
		if($row = mysql_fetch_row($result))
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
		die();*/
		
		if($count > 0)
		{
			echo <br>welcome;
		}
		else
		{
			echo <br>Invalid Username Or Password;
		}
	}
}
<php>
توضیح کدهای بالا، Query که مینویسیم رو توی تابع prepare قرار میدیم و تابع execute میاد Query که نوشتیمو اجرا میکنه و اگه این Query باید ورودی بگیره توی تابع execute ورودی هارو بصورت آرایه بهش میدیم (که اینجا من ورودی هارو بصورت آرایه به Query دادم) و سپس با تابع rowcount چک میکنیم که اگه بزرگتر از صفر بود یعنی Query با موفقیت اجرا شده و یه رکورد برای ما (به عنوان خروجی) برگردونده ولی اگه کمتر از صفر باشه یعنی نتونست نسبت به شرط و مقداری که به Query دادیم رکوردی برای ما برگردونده .
||https://tosinso.com//files/get/097a2b03-9f31-4553-9319-c376c0a773e4||
||https://tosinso.com//files/get/89b1c566-a9d5-4fcd-8c64-8a477a273417||
خطا میده ، میگه نتونست کلاس Model پیدا کنه ، پس ما باید با دستور require این خطا رو برطرف کنیم، کد زیر رو اضافه میکنیم به فایل Index.php (توی پوشه اصلی سایت)  .
کد Index.php :
<php>
             .
             .
             .
require(libs/view.php);
	
require(libs/Model.php);

require(libs/Bootstrap.php);
             .
             .
             .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Index.php هست)
یه بار دیگه که امتحان کنیم به این خطا برخورد میکنیم :
||https://tosinso.com//files/get/7b93b03e-c632-417a-89dc-053407360393||
این سری کلاس Database پیدا نکرد در نتیجه همون کاری که بالا انجام دادیم واسه کلاس Database هم انجام میدیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Libs/Database.php);
<php>

همین جوری هی خروجی میگیریم تا ببینیم به چه خطاهایی برخورد میکنیم و اونارو رفع کنیم :
||https://tosinso.com//files/get/27493487-3c66-496f-8f84-84a24b7764d8||
این خطا هم میگه که نتونست اون متغیرهایی که با دستور define تعریف کردیمو پیدا کنه پس این خطا رو هم مثل بالا رفعش میکنیم، کد زیر به Index.php اضافه میکنیم :
<php>
require(Config/database.php);
<php>
خروجی میگیریم :
||https://tosinso.com//files/get/5bbc2f64-e4ce-45b4-803b-ce302cff829f||
میبینید که الان جواب داد ، حالا میایم یه تغییرات دیگه هم به کدهای سایتمون میدیم .
در ابتدا کد Bootstrap.php بصورت زیر تغییر میدیم .
<php>
                 .
                 .
                 .
$controller = new $url[0]();
$controller->loadModel($url[0]);

if(!empty($url[1]))
                 .
                 .
                 .
<php>
فقط خط دوم به کدها اضافه میکنیم (مابقی خطها توی Bootstrap.php هست)، یه تابع فراخوانی میکنیم بنام loadModel و مقدار [0]url$ بهش میدیم (در ادامه این تابع توی کلاس Controller تعریف میکنیم)
کد Controller.php بصورت زیر تغییر میدیم :
<php>
<?php

class Controller
{
	function __construct()
	{
		//echo <br>Main Controller<br>;
		
		$this->view = new View();
	}
	
	function loadModel($name)
	{
		$path = models/.$name._model.php;
		
		if(file_exists($path))
		{
			require($path);
			
			$ModelName = $name._model;
			$this->model = new $ModelName();
		}
	}	
}
<php>
تابع loadModel یه ورودی میگیره که این ورودی اولین خانه آرایه url هست (یعنی [0]url$) و این ورودی رو به model.php__ و /models میچسبونه و یه مقدار جدید (که میشه یه فایل بهمراه مسیرش) درست میشه و توی متغیر path$ قرار میگیره و سپس چک میکنه که اگه این فایل با همچین مسیری وجود داشت که یه شی ازش میسازه (که در نتیجه تابع سازندش فراخوانی میشه) و سپس نتیجه رو توی متغیر model میریزه که بعداً توی کلاس Login ازش استفاده میکنیم . (این کد رو واسه این نوشتیم چون در آینده توی فولدر Models یا Controllers کلاس های دیگه ای به غیر از Login__Model یا Login اضافه میکنیم و بخاطر اینکه از تعداد خط های کد اضافی بکاهیم این تابع رو نوشتیم اگه این تابع رو نمی نوشتیم باید توی هر کلاسی که (در آینده) توی فولدر Models یا Controlers تعریف میکنیم چند خط کد بنویسیم (مثلاً همین کدی که توی تابع run از کلاس Login نوشتیم) و اینجوری هم تعداد خط کد بالا میره هم بیشتر پیچیده میشه در نتیجه خطا یابیش مشکل تر میشه) .
خوب طبق چیزایی که در بالا گفتم باید تابع ()run توی کلاس Login بصورت زیر تغییر بدیم :
<php>
function run()
{
	//require(models/Login_Model.php);
	
	//$L_M = new Login_Model();
	//$L_M->run();
	
	$this->model->run();
}
<php>
کدهای قبلی رو غیر فعال کردم و بجاش فقط خط آخر اضافه میکنم . (که پیچیدگی کمتر بشه و خطایابیش سریع تر انجام بگیره)
خوب الان یه خروجی میگیریم :
||https://tosinso.com//files/get/e14ef9a0-04c2-46fe-97b9-4a380c1c6c2a||
میبینید که داره درست جواب میده .

امیدوارم این آموزش هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی
منبع : |جزیره طراحی و توسعه وب وب سایت توسینسو::https://tosinso.com/web|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

خوب حالا میخوایم زمانی که کاربر نشانگر موس رو روی منو ها میبره، رنگ پس زمینه منو ها عوض بشه :

این کد رو به 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;
}

خروجی :