مشخصات مقاله
-
3246
-
0.0
-
2793
-
0
-
0
آموزش عملی پروژه محور PHP
مقدمه
در آموزش حاضر نحوه ی ساخت یک اپلیکیشن تحت وب با زبان PHP را از 0 تا 100 به شما می آموزیم. این اپلیکیشن تحت وب دارای قابلیت هایی نظیر ورود / خروج (login / logout) به سایت، ایجاد (درج)، خواندن، بروز رسانی یا حذف (CRUD) رکورد در دیتابیس خواهد بود. تمامی مفاهیم را به تفصیل شرح خواهیم داد. چنانچه تازه پا به عرصه ی برنامه نویسی تحت وب سمت سرور (backend) گذاشته اید، این آموزش ویژه ی شما می باشد. لازم به ذکر است که در مبحث جاری از فریم ورک و چارچوب نرم افزاری تحت وب استفاده نمی کنیم و همه چیز را با php خالص از 0 می نویسیم. همچنین تمرکز بر روی پیاده سازی قابلیت ها و رفتار سایت خواهد بود و طراحی ظاهر آن در این آموزش تحت پوشش قرار نمی گیرد. ظاهر اپلیکیشن شما صرفا یک لیست ساده از آیتم ها می باشد که به هنگام ورود کاربر به سایت، این لیست از آیتم ها را نمایش می دهد.
پیش نیازهای این آموزش
در این آموزش هدف ساخت و پیاده سازی یک سرویس سمت سرور (backend) ویژه ی وب سایت می باشد و برای آن لازم است با مباحث زیر آشنایی داشته باشید:
- HTML/CSS برای طراحی ظاهر اپلیکیشن.
- زبان برنامه نویسی سمت سرویس گیرنده یا کلاینت JavaScript. در حال حاضر نیازی به jQuery نیست.
- آشنایی با دیتابیس MySQL. از دانش کار با این دیتابیس برای ساخت سطر در جدول، خواندن، بروز رسانی و حذف رکورد از دیتابیس (پیاده سازی قابلیت های CRUD) استفاده می شود.
- Text Editor – توصیه می کنیم از Sublime Text/Notepad++ استفاده نمایید. داخل این نرم افزارها کدهای اپلیکیشن خود را می نویسیم و در واقع نقش محیط کدنویسی را برای توسعه دهنده ایفا می کنند.
- نرم افزار XAMPP – این نرم افزار نقش سرویس دهنده وب و محیطی که اپلیکیشن در آن مستقر می شود را برای شما ایفا خواهد کرد. در واقع فایل های وب سایت و داده هایی که در دیتابیس درج می شوند، داخل محیط XAMPP ذخیره می گردند.
- مرورگر وب – می توانید از هر مرورگری که حافظه ی (RAM) زیادی را اشغال نمی کنند، استفاده نمایید.
1. تنظیم و راه اندازی سرویس دهنده (Server)
آموزش را با نوشتن یک برنامه ی ساده در سمت سرور که متن "hello world" را برای کاربر نمایش می دهد، شروع می کنیم.
ابتدا به پوشه ای که XAMPP را در آن نصب کردید (در پوشه ی C:\xampp) مراجعه نمایید. از آنجا به پوشه ی htdocs مراجعه کرده (مستقر در آدرس C:\xampp\htdocs) و یک پوشه به نام "MyFirstWebsite" ایجاد نمایید.
در این بخش یک URL محلی (Local) برای وب سایت خود ایجاد کرده اید. این پوشه برای ارائه ی تمامی فایل های وب سایت (.html، .php، .css، .js و غیره ...) مورد استفاده قرار می گیرد. حال text editor یا محیط کدنویسی را راه اندازی نمایید.
در این آموزش از نرم افزار sublime به عنوان محیط کدنویسی استفاده می کنیم. در صورت تمایل می توانید از نرم افزار Notepad++ یا هر نرم افزار دیگر استفاده نمایید.
در زیر یک صفحه ی ساده HTML ایجاد می کنیم و متن "hello world" را به وسیله ی کد PHP از سرویس دهنده برای کاربر نمایش می دهیم.
< html>
My first PHP Website
< ?php
echo "Hello World!
";
? >
< /html>
فایل فوق را در پوشه ی "MyFirstWebSite" ذخیره نموده و آن را "index.php" نام گذاری نمایید (آدرس و پوشه ای که در بالای صفحه قابل مشاهده می باشد).
پس از ایجاد فایل، پنل کنترل XAMPP را باز نمایید. چنانچه بر روی صفحه ی دسکتاپ قابل مشاهده نمی باشد، در آن صورت بایستی پوشه ی XAMPP را جهت دسترسی به آن جستجو نمایید.
پس از دستیابی به کنترل پنل، Apache و MySQL را با کلیک بر روی دکمه ی "Start" در ستون actions اجرا نمایید. با کلیک بر روی دکمه ی Start یک شماره شناسایی فرایند (PID) تصادفی و شماره ی درگاه (port number) پیش فرض به نمایش در می آید. Apache اسم سرویس دهنده ی وب (web server) است که در آن فایل های اپلیکیشن تحت وب و تعامل با مرورگر مدیریت شده و MySQL دیتابیسی است که داده های اپلیکیشن مورد نظر در آن ذخیره می شوند.
مروگر خود را باز کرده و در نوار آدرس آن، Localhost را وارد نمایید. بلافاصله منوی XAMMP نمایان می شود.
اگر اولین بار است که آن را اجرا می کنید، از شما می خواهد که زبان دلخواه را انتخاب نمایید و سپس شما را به منوی مورد نظر هدایت می کند. همان طور که مشاهده می کنید پوشه یا آدرس مربوطه localhost/xampp می باشد. این صفحه ی پیش فرض است که با تایپ کردن localhost در نوار آدرس کاربر به آن هدایت می شود.
اگر این صفحه نمایش داده شد، بدین معنی است که سرویس دهنده ی XAMPP فعال شده و در حال اجرا می باشد. حال وب سایت جدید خود را که در XAMPP مستقر کردید، اجرا نمایید. در نوار آدرس localhost/MyFirstWebsite را تایپ نمایید.
همان طور که مشاهده می کنید، URL قابل مشاهده در نوار آدرس MyFirstWebsite می باشد. این نشانی از پوشه ی htdocs گرفته شده و به طور خودکار فایل هایی که "index" نام داشته (نظیر index.html، index.aspx و غیره ...) و به عنوان صفحه ی اصلی و پیش فرض سایت ایفای نقش می کند را می خواند. اگر در نوار آدرس مرورگر localhost/MyfirstWebsite/index.php را نیز وارد نمایید، همین صفحه ی پیش فرض به نمایش در می آید. در صورت تمایل می توانید با تغییر اسم پوشه، URL دلخواه خود را تنظیم نمایید. اما در این آموزش ما از MyFirstWebsite به عنوان اسم پوشه ی فایل صفحات سایت استفاده می کنیم.
چنانچه URL نام برده را در نوار آدرس مرورگر وارد کنید، در حالی که فایلی به نام index در آن وجود نداشته باشد، آنگاه (به دلیل عدم وجود فایل مورد درخواست در سرور) با خطای 404 مواجه می شوید.
اگر فایل صفحه ی اصلی اپلیکیشن شما غیر از (index.
در مرحله ی حاضر می خواهیم وب سایت خود را ویرایش کرده و یک لینک ثبت نام (registration) به آن اضافه کنیم که کاربر بتواند بلافاصله پس از ثبت نام در سایت وارد (log-in) شود. با کد زیر صفحه ی اصلی وب سایت خود را ویرایش می کنیم: Hello World! همان طور که از کد بالا مشاهده می کنید، 2 لینک به صفحه ی اصلی اضافه کردیم که یکی برای Login و دیگری برای register در سایت تعبیه شده است. ابتدا به ساخت صفحه ی ثبت نام کاربر می پردازیم. همان طور که می بینید، در مثال بالا فقط یک فرم ساده طراحی کردیم که کاربر می تواند از طریق آن نام کاربری و گذرواژه (credentials) را وارد کند. اکنون به ساخت صفحه ی ورود به سایت می پردازیم. کافی است همان کد را کپی و جایگذاری نمایید تا کار شما سریع تر پیش رود.
2. ایجاد صفحات Public HTML
< html>
< html>
Registration Page
Click here to go back< br />
< /html>
< html>
Login Page
Click here to go back
< /html>
همان طور که می بینید برنامه ی حاضر همان کد سازنده ی صفحه ی ثبت نام است که در زیر تغییرات جدید آن خط کشیده شده است.
آدرس localhost/MyFirstWebsite را در نوار آدرس وارد کنید. صفحات مربوطه هر یک به ترتیب ظاهری مشابه زیر خواهند داشت:
3. ایجاد دیتابیس و جداول آن
حال که صفحه های اصلی سایت را برای کاربران سایت با موفقیت طراحی کردیم، به شرح طراحی و تعامل با دیتابیس می پردازیم. در مرحله ی اول localhost/phpmyadmin را در نوار آدرس مرورگر وارد نمایید. این url شما را به صفحه ی اصلی سایت phpmyadmin هدایت می کند:
حال بر روی تب Databases واقع در بالای صفحه کلیک کنید، سپس داخل کادر مقیم در وسط صفحه first_db را وارد نمایید. بر روی دکمه ی Create کلیک نمایید. گزینه ی تنظیم زبان یا Collation را تغییر ندهید.
داخل جدول مورد نظر فیلدهای زیر را به ترتیب ایجاد کرده و نوع آن ها را بر اساس مشخصات عنوان شده تنظیم نمایید. سپس بر روی دکمه ی Save جهت ذخیره ی تنظیمات کلیک کنید:
- قالب و ساختار کلی جدول: (اسم ستون) Column Name، (نوع داده ای) Type، (طول یا حجم مقدار) Length، (فیلد null پذیر) Null Property، سایر Property ها.
- id - INT - N/A - Not Null - Auto Increment
- username - varchar - 50 - Not null
- password - varchar - 50 - Not null
سایر تنظیمات را تغییر ندهید.
بایستی جهت مشاهده ی فلید auto_increment می بایست به سمت راست صفحه پیمایش نمایید. جهت نمایش فیلد A_I در صفحه، تصویر فوق کمی ویرایش شده است.
در مرحله ی بعد، یک جدول دیگر به نام list به همراه 7 ستون ایجاد نمایید. ساختار کلی جدولی به صورت زیر خواهد بود:
- id - INT - N/A - Not Null - Auto Increment
- details - text - Not null
- date_posted - varchar - 30 - Not null
- time_posted - Time - Not null
- date_edited - varchar - 30 - Not null
- time_edited - Time - Not null
- public -varchar - 5 - Not null
4. افزودن اطلاعات کاربران و ذخیره ی آن ها در دیتابیس
پس از ایجاد جداول دیتابیس، به تکمیل و فعال سازی صفحه ی ثبت نام (registration) سایت و افزودن قابلیت های لازم به آن می پردازیم. داخل صفحه ی registration.php، کد مورد نظر را در زیر دستورات html خود درج نمایید:
< html>My first PHP Website Registration Page
Click here to go back
< /html>
در زیر شرح کد داده شده است:
- $_SERVER["REQUEST_METHOD"] == "POST" – بررسی می کند آیا داده های فرم به هنگام کلیک بر روی دکمه ی submit به وسیله ی POST به سرویس دهنده ارسال شده اند یا خیر. متد POST داخل تگ form فایل HTML به وسیله ی دستور method="POST" تعریف می شود.
- $_POST[''] – مقدار ویژگی name که به وسیله ی متد POST به سرور ارسال می شود را دریافت می نماید. این دستور صرفا ورودی را بر اساس مقدار ویژگی name از سرویس دهنده دریافت می کند. در مثال جاری منظور همان مقادیر username و password می باشد.
- متد mysql_real_escape_string() – ورودی کاربر را داخل یک رشته کپسوله سازی کرده و آن را در برابر حمله ی SQL Injections محافظت می کند. این دستور کاراکترهای ناامن موجود در رشته را ایمن کرده و ایمن بودن درخواست sql را تضمین می کند.
حال به فایل register.php مراجعه کرده و پس از ورود مقادیر دلخواه، بر روی دکمه ی "Register" کلیک کنید. در مثال جاری، می بینید که مقادیر xtian و 123456 هر یک به ترتیب به عنوان نام کاربری و گذرواژه وارد شده اند. بایستی مقادیر ورودی در زیر دکمه ی Register نمایش داده شوند. مثال:
تا به اینجای آموزش، نحوه ی دریافت ورودی از فرم را آموختید. حال ورودی ها کاربر را داخل دیتابیس ذخیره می کنیم. داخل فایل register.php، کد زیر را درج نمایید:
< html>My first PHP Website Registration Page
Click here to go back
alert("Username has been taken!");'; // Prompts the user Print ''; // redirects to register.php } } if($bool) { mysql_query("INSERT INTO users (username, password) VALUES ('$username', 'password')"); // inserts value into table users Print ''; // Prompts the user Print ''; // redirects to register.php } } ? >
در زیر شرح کد را مشاهده می کنید:
- mysql_connect("Server name","Server Username","Server Password") – به وسیله ی این دستور (تابع) به سرویس دهنده ی XAMPP متصل شده و به دیتابیس دسترسی پیدا می کنیم. پارامتر localhost یا 127.0.0.1 اسم سرویس دهنده است. نام کاربری (username) پیش فرض root بوده و گذرواژه ای برای دسترسی به دیتابیس انتخاب نمی شود.
- or die('Message') - چنانچه شرط برقرار و صحیح نبود، پیغام خطا را نشان می دهد.
- mysql_query('sql query') – کوئری های SQL را به دیتابیس فعال در سرویس دهنده ارسال می کند.
- mysql_fetch_array('query') - سطر خروجی یا نتیجه ی کوئری را در قالب آرایه ی متناظر (associative)، عددی یا هر دو از دیتابیس بازیابی می نماید. این دستور داخل یک حلقه ی while قرار داده می شود تا بدین وسیله از تمامی سطرها کوئری بگیرد. در هر بار اجرای حلقه یک سطر واکشی می شود. به همین جهت نیز لازم است از حلقه ی while استفاده شود.
- $row['row name'] – مقدار ستون در کوئری جاری. خروجی در قالب یک آرایه نمایش داده می شود. در این مثال، $row اسم متغیر row در حلقه است.
ورودی هایی که قبلا به سرور ارسال شده اند را امتحان کنید و ببینید چه اتفاقی رخ می دهد. بلافاصله بایستی پیغامی برای کاربر نمایش داده شود که ثبت نام و عضویت در سایت با موفقیت انجام شده است. می توانید به صفحه ی phpmyadmin مراجعه کرده و محتوای جدول users را مشاهده نمایید:
تا به اینجا آموختید که چگونه داده هایی را همراه با اعتبارسنجی و بررسی صحت آن ها در دیتابیس درج کنید.
5. ورود کاربر به سایت (User log-in): احراز هویت و پیاده سازی قابلیت Authentication
اکنون به صفحه ی ورود به سایت می پردازیم. برای این صفحه یک فایل جدید به نام checklogin.php ایجاد می کنیم که هویت کاربر را برای ورود به سایت می سنجد. اگر به کد فایل login.php نگاهی بیاندازید، متوجه می شوید که در تگ Form آن ویژگی action برابر "checklogin.php" قرار داده شده است. حال کاربر در صورت وارد کردن نام کاربری و گذرواژه ی ناصحیح بار دیگر به صفحه ی login.php هدایت می شود.
حال کد صفحه ی checklogin.php را به صورت زیر می نویسیم:
< ? >
شرح کد بالا را در زیر مشاهده می کنید:
– یک متغیر session جهت نگهداری اطلاعات کاربر در حافظه ی سرور ایجاد می کند. به عبارت دیگر یک session در سرور ایجاد می کند. این متد غالبا در صفحات احرازهویت شده (authenticated pages) فراخوانی می شود. علت استفاده از متد مزبور در کد فوق این است که آرایه ی متناظر $_SESSION[''] به آن احتیاج دارد. - mysql_num_rows – خروجی این تابع یک عدد صحیح int می باشد. این تابع تعداد تمامی سطرها را با توجه به کوئری (تعداد سطرهای موجود در نتیجه یا خروجی کوئری) بازمی گرداند.
- $_SESSION['name'] – این آرایه اسم متغیر session را تعیین می کند. این دستور کاربردی مشابه متغیرهای سراسری در تکنیک برنامه نویسی شی گرا دارد. از این کد برای کسب اطمینان از این که کاربر قبلا احراز هویت شده است یا خیر، استفاده می شود.
حال سعی کنید نام کاربری و گذرواژه ی ناصحیح را وارد فرم کرده و اپلیکیشن را تست نمایید. بایستی پیغام دلخواه را برگرداند. سپس مقادیر صحیح را وارد فرم کرده و به سرور ارسال نمایید. کد شما را به صفحه ی اصلی سایت home.php هدایت می کند.
در حال حاضر صفحه ای به نام home.php وجود ندارد، به همین جهت خطای 404 به نمایش در می آید.
6. ایجاد و تنظیم صفحه ی اصلی سایت home page برای کاربران احرازهویت و ثبت نام شده (logged-in) و پیاده سازی قابلیت خروج (log-out) از آن
پس از پیاده سازی قابلیت احراز هویت کاربر جهت ورود به سایت، صفحه ی اصلی سایت (home.php) را با کد زیر تعریف می کنیم:
< html>My first PHP Website < ?php//starts the session< if($_SESSION['user']){ // checks if the user is logged in } else{ header("location: index.php"); // redirects if user is not logged in } $user = $_SESSION['user']; //assigns user value ? > Home Page
! Click here to go logout < /html>
My list
شرح کد:
- یک session ایجاد می کند. جهت آرایه ی متناظر $_SESSION[''] فراخوانی می شود. - header – کاربر را به آدرس مشخص شده هدایت می کند (redirect).
حال صفحه ی فعلی مرورگر را بروز آوری (refresh) کنید. ظاهری مشابه زیر خواهد داشت:
حال که صفحه ی اصلی سایت (home) را پیاده سازی کردیم، جهت خروج کاربر از سایت (log out) صفحه ی logout.php را ایجاد کرده و بررسی می کنیم آیا session کاربر غیرفعال شده (از حافظه ی سرور حذف شده) یا خیر.
در واقع در فایل مزبور بررسی می کنیم که آیا کاربر از سایت خارج شده یا خیر (log-out). چنانچه کاربر log-out کرده باشد، طبیعتا دیگر نباید به صفحه ی اصلی سایت home.php دسترسی داشته باشد. در زیر محتوای فایل logout.php را مشاهده می کنید:
< ?php
? >
همان طور که می بینید کد این صفحه بسیار ساده است. تابعsession_destroy() مقدار $_SESSION[''] و کلیه ی اطلاعات مربوط به session جاری را از حافظه حذف می کند. تابع header() نیز صرفا کاربر را به صفحه ی index.php هدایت (redirect) می کند.
7. پیاده سازی مکانیزیمی ساده جهت تضمین امنیت صفحه (security)
اکنون صفحه ی اصلی سایت، home.php، را در مروگر بروز رسانی (مجدد بارگذاری) کنید و بعد بر روی لینک logout کلیک نمایید. حال سعی کنید به صفحه ی قبلی (home.php) برگردید. چه اتفاقی رخ می دهد؟
همان طور که مشاهده می کنید، اپلیکیشن دیگر شما را به صفحه ی home.php بازگشت (redirect) نمی دهد چرا که با کلیک بر روی logout قبلا از سایت خارج شده اید. حال سعی کنید نشانی localhost/MyFirstWebsite/home.php را به صورت دستی در نوار آدرس مرورگر وارد کنید. خواهید دید که همین اتفاق تکرار می شود و ورود دستی آدرس فایل نیز اجازه ی دسترسی به صفحه ای که قبلا مجوزدهی شده (و کاربر وارد آن شده) را نمی دهد. قابلیتی که در اینجا پیاده سازی کردیم یک مکانیزم امنیتی ساده است که کاربران مجوزدهی نشده را به یک صفحه ی عمومی سایت هدایت می کند.
اکنون بار دیگر وارد سایت شده (login) و به صفحه ی home.php مراجعه نمایید.
8. پیاده سازی قابلیت افزودن آیتم جدید به لیست – user access only
در گام بعدی، می خواهیم قابلیت اضافه و درج آیتم جدید در لیست را به اپلیکیشن تحت وب خود اضافه کنیم. اگر به کد فرم html نگاهی بیاندازید متوجه می شوید که مقدار ویژگی action در تگ form برابر "add.php" قرار داده شده است. در واقع با این کد html، درخواست کاربر با متد post به صفحه ی add.php در سرور هدایت می شود. در زیر محتوای فایل add.php را مشاهده می کنید:
< ?php
if($_SESSION['user']){
}
else{
header("location:index.php");
}
$details = mysql_real_escape_string($_POST['details']);
$time = strftime("%X"); //time
$date = strftime("%B %d, %Y"); //date
Print "$time - $date - $details";
? >
لازم به ذکر است که اسکریپت بالا نسخه ی کامل و نهایی فایل add.php نیست. در این کد صرفا مقدار زمان و تاریخ را با فرمت صحیح نشان می دهیم و ورودی کاربر را دریافت می کنیم. مجددا به صفحه ی home.php مراجعه کرده و پس از افزودن آیتم جدید بر روی "Add to list" کلیک نمایید.
خروجی در صفحه ی add.php به صورت خواهد بود:
همان طور که می بینید، زمان، تاریخ و مقدار ورودی شما در صفحه ی add.php نمایش داده شده است. در زیر به شرح کد می پردازیم:
- strftime() – مقدار زمان جاری را بر اساس فرمت تعیین شده بازیابی می کند.
- %X - زمان جاری سیستم
- %B - مقدار ماه جاری را بر اساس محل جغرافیایی (مقدار ماه سیستم)
- %d – مقدار روز جاری سیستم
- %Y – مقدار سال جاری سیستم
حال زمان آن رسیده که محتوای فایل add.php خود را ویرایش کرده و داده های زیر را همراه با ورودی checkbox داخل جدول دیتابیس ذخیره کنیم:
< ?php
if($_SESSION['user']){
}
else{
header("location:index.php");
}
if($_SERVER['REQUEST_METHOD'] == "POST")
{
$details = mysql_real_escape_string($_POST['details']);
$time = strftime("%X"); //time
$date = strftime("%B %d, %Y"); //date
$decision = "no";
mysql_connect("localhost","root","") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Conect to database
foreach($_POST['public'] in $each_check) //gets the data from the checkbox
{
if($each_check != null){ //checks if checkbox is checked
$decision = "yes"; // sets the value
}
}
mysql_query("INSERT INTO list(details, date_posted, time_posted, public) VALUES ('$details','$date','$time','$decision')"); //SQL query
header("location:home.php");
}
else
{
header("location:home.php");
}
? >
شرح کد:
- foreach() – این تابع مقدار المان checkbox را بازیابی می کند. همان طور که می بینید، فرمت checkbox در فرم به این صورت است : name="checkbox []". بدین معنی که جهت دریافت مقدار از checkbox، باید به صورت یک آرایه از آن نمونه سازی شود. با این کار می توان همزمان از چندین checkbox مقدار دریافت کرد.
حال تعدادی داده وارد کرده و سپس بر روی لینک "Add to list" کلیک می نماییم. در این مثال بار دیگر مقدار fish را وارد می کنیم. حال به صفحه ی phpmyadmin مراجعه کرده و مطمئن می شویم که اطلاعات جدید اضافه شده اند. خروجی مثال ما به صورت زیر می باشد:
localhost/phpmyadmin:
9. نمایش داده ها در صفحه ی اصلی سایت (home page)
پس از کسب اطمینان از اضافه شدن موفقیت آمیز داده های مورد نظر در دیتابیس، می خواهیم داده ها را در صفحه ی اصلی سایت برای کاربر به نمایش بگذاریم. برای این منظور محتوای home.php را ویرایش کرده و تعدادی ستون جدید برای تاریخ درج داده ها به جدول جاری اضافه می کنیم:
home.php:
< html>My first PHP Website //starts the session if($_SESSION['user']){ // checks if the user is logged in } else{ header("location: index.php"); // redirects if user is not logged in } $user = $_SESSION['user']; //assigns user value ?>Home Page
! Click here to go logout
My list
'; Print '"; Print '"; Print '"; Print '"; Print ''; Print ''; Print ''; Print ''; } ? >
< /body> < /html>
شرح کد فوق بسیار ساده می باشد. این کد صرفا داده هایی که حلقه ی while از لیست می خواند را داخل جدول و با فرمت فوق نمایش می دهد. حال مرورگر را باز کرده و صفحه ی home.php را مجددا بارگذاری نمایید. چه اتفاقی رخ می دهد؟
همان طور که در تصویر مشاهده می کنید، داده های مورد نظر در صفحه نمایش داده می شوند. تا به اینجای آموزش نحوه ی پیاده سازی عملیات Create و Read در دیتابیس را آموختیم. در جدول حاضر می بینید که ستون هایی ویژه ی update (ویرایش سطرهای جدول) و delete (حذف رکورد از جدول) در نظر گرفته شده است. برای شرح نحوه ی پیاده سازی این قابلیت ها یک آیتم دیگر (tuna) را به لیست اضافه می کنیم و این بار مقدار آیتم را در ستون public post بر روی no تنظیم می نماییم:
10. بروز رسانی و ویرایش داده ها در دیتابیس
اکنون قصد داریم داده های موجود در دیتابیس را بروز رسانی کنیم و برای نیل به این هدف از امکانی به نام GET بهره می گیریم. اگر به خاطر داشته باشید در مثال های قبلی از متد POST برای ارسال درخواست HTTP به سرور استفاده می کردیم. اما این بار از متد GET برای ویرایش داده های اپلیکیشن و حذف رکورد از دیتابیس کمک می گیریم. در شروع به ویرایش کد موجود در فایل home.php پرداخته و مقداری کد به دو ستون اضافه می کنیم:
< html>
My first PHP Website
< ?php
//starts the session
if($_SESSION['user']){ // checks if the user is logged in
}
else{
header("location: index.php"); // redirects if user is not logged in
}
$user = $_SESSION['user']; //assigns user value
? >
Home Page
!
Click here to go logout
My list
';
Print '";
Print '";
Print '";
Print '";
Print '';
Print '';
Print '';
Print '';
}
? >
قطعا متوجه شده اید که فقط پارامترهایی را به URL (پارامتر id) برای ویرایش و حذف لینک ها به کد اضافه کردیم. بعدا از این پارامتر برای مدیریت داده ها استفاده خواهیم کرد. علت استفاده از پارامتر id این است که یک شناسه ی منحصر بفرد محسوب می شود. از آنجایی که کاربر می تواند مقدار تکراری را وارد ستون Details کند، توصیه نمی کنیم از ستون details به عنوان راهی برای ویرایش آتی داده ها استفاده نمایید.
اگر اشاره گر موس را بر روی لینک edit معلق نگه دارید، مقدار id در پایین، سمت چپ صفحه ی جاری به نمایش در می آید:
اکنون زمان آن رسیده که صفحه ی edit.php را ایجاد و منطق آن را پیاده سازی کنیم:
edit.php:
< html>
My first PHP Website
//starts the session
if($_SESSION['user']){ // checks if the user is logged in
}
else{
header("location: index.php"); // redirects if user is not logged in
}
$user = $_SESSION['user']; //assigns user value
? >
Home Page
!
Click here to go logout
Return to home page
Currently Selected
0)
{
while($row = mysql_fetch_array($query))
{
شرح کد:
- !empty() - این متد اطمینان حاصل می کند که مقدار پارامتر id تهی نباشد. می توان با حذف عملگر ! از ابتدای متد، سینتکس را معکوس کرده و اطمینان حاصل کرد که مقدار پارامتر تهی باشد.
- $_GET[''] – مقدار پارامتر را بازیابی می کند. در مثال حاضر از id به عنوان پارامتر URL استفاده شده است. بنابراین دستور لازم برای بازیابی مقدار ارسالی به عنوان پارامتر URL، $_GET['id'] می باشد.
- $id_exists - متغیری که بررسی می کند آیا id در دیتابیس وجود دارد یا خیر.
- $_SESSION['id'] - مقدار پارمتر id را داخل متغیر session قرار می دهیم تا بتوانیم از آن در فایل دیگری استفاده کنیم.
Print ""; Print ' "; Print '"; Print '"; Print '"; Print '"; Print ""; } } else { $id_exists = false; } } ? >
Enter new detail:
public post? '; } else {There is not data to be edited.
} ?> < /html> Click here for the complete edit.php code (Only refer to the front-end part. Github Sourced)
علت بررسی مقدار متغیر $id_exists این است که اگر کاربر مقدار پارامتر را به مقدار عددی ناموجودی (غیر از 1 یا 2) تغییر داد (در مثال جاری تنها دو rows/id)، بتوانیم یک پیغام مبنی بر عدم وجود داده ی مورد نظر برای کاربر نمایش دهیم.
حال بر روی لینک edit در سطر اول کلیک نمایید. خروجی زیر را نمایش خواهد داد:
محتوای فایل edit.php را به صورت کامل در زیر مشاهده می کنید:
< html>
My first PHP Website
< ?php
//starts the session
if($_SESSION['user']){ // checks if the user is logged in
}
else{
header("location: index.php"); // redirects if user is not logged in
}
$user = $_SESSION['user']; //assigns user value
? >
Home Page
!
Click here to go logout
Return to home page
Currently Selected
0)
{
while($row = mysql_fetch_array($query))
{
Print "";
Print '";
Print '";
Print '";
Print '";
Print '";
Print "";
}
}
else
{
$id_exists = false;
}
}
? >
Enter new detail:
public post? '; } else {There is not data to be edited.
} ?> < /html> Click here for the complete edit.php code (Only refer to the front-end code. Github sourced)
اکنون پارامتر url را با حذف متغیر ?id=1 ویرایش نمایید.پس از حذف متغیر نام برده، url ظاهری مشابه زیر خواهد داشت: localhost/MyFirstWebsite/edit.php. این url را در نوار آدرس مرورگر مشاهده می کنید:
حال مقداری بزرگتر از مقدار id تنظیم می کنیم. در این مثال، 5 را به عنوان پارامتر به متغیر query string (id) ارسال می کنیم. با ارسال مقدار ذکر شده به پارامتر id، url در نوار آدرس مرورگر ظاهری مشابه زیر خواهد داشت:
پس از تنظیم پارامترهای URL، دستور ویرایش داده ها در دیتابیس را می نویسیم. فایل edit.php را باز کرده و کد یا منطق لازم برای بروز رسانی داده ها در جدول را به صورت زیر در آن درج نمایید:
edit.php:
< ?php
if($_SERVER['REQUEST_METHOD'] == "POST")
{
mysql_connect("localhost", "root", "") or die (mysql_error()); //Connect to server
mysql_select_db("first_db") or die ("Cannot connect to database"); //Connect to database
$details = mysql_real_escape_string($_POST['details']);
$public = "no";
$id = $_SESSION['id'];
$time = strftime("%X"); //time
$date = strftime("%B %D, %Y"); //date
foreach($_POST['public'] as $list)
{
if($list != null)
{
$public = "yes";
}
}
mysql_query("UPDATE list SET details='$details', public='$public', date_edited='$date', time_edited='$time' WHERE id='$id'");
header("location:home.php");
}
? >
صفحه ی کنونی مرورگر را مجددا بارگذاری کرده (refresh) و به صفحه ی edit.php بازگردید. حال جدول را با داده های جدید بروز رسانی می کنیم. ما در این مثال از مقدار "Salmon" استفاده کرده (مقدار سطری با id=1 را به Salmon تغییر داده) و مقدار ستون Public Post را بر روی no تنظیم می کنیم:
edit.php?id=1:
بر روی دکمه ی Update List کلیک نمایید. اپلیکیشن کاربر را به صفحه ی home.php هدایت کرده و لیست ویرایش شده را نمایش می دهد.
همان طور که می بینید در این جدول زمان و تاریخ ویرایش داده ها در ستون Edit Time نمایش داده شده است. مقدار ستون Public Post بر روی no تنظیم شده و اولین فیلد ستون Details مقدار Salmon را نمایش می دهد.
قابلیت ویرایش و بروز رسانی داده ها در دیتابیس را با موفقیت پیاده سازی کردیم. حال به شرح نحوه ی حذف داده از جدول مورد نظر می پردازیم.
11. پیاده سازی قابلیت حذف رکورد از جدول (Delete)
پیاده سازی قابلیت Delete مشابه کدنویسی عملیات ویرایش و بروز رسانی داده ها است و تنها دستور SQL ای که بر روی دیتابیس اجرا می شود متفاوت است. بجای دستور UPDATE از دستور DELETE استفاده می کنیم.
لازم است به هنگام حذف دائمی یک رکورد از جدول، از کاربر پرسیده شود که آیا در این خصوص اطمینان کامل دارد یا خیر. برای این منظور از کمی کد جاوا اسکریپت در فایل home.php استفاده می کنیم.
کد فایل مذکور را به صورت زیر ویرایش می کنیم:
< table border="1px" width="100%">
Id
Details
Post Time
Edit Time
Edit
Delete
Public Post
';
Print ''. $row['id'] . "";
Print ''. $row['details'] . "";
Print ''. $row['date_posted'] . " - " . $row['time_posted'] . "";
Print ''. $row['date_edited'] . " - " . $row['time_edited'] ."";
Print 'edit';
Print 'delete';
Print ''. $row['public'] . '';
Print '';
}
? >
< script>
function myFunction(id)
{
var r = confirm("Are you sure you want to delete this record?");
if(r == true)
{
window.location.assign("delete.php?id=" + id);
}
}
< /script>
تغییراتی که در کد اعمال شده اند به شرح زیر می باشند:
- لینک delete را ویرایش کردیم.
- مقدار ویژگی href از تگ a را برابر "#" قرار دادیم
- با افزودن ویژگی onclick و تنظیم آن بر روی مقدار myFunction، یک تابع JavaScript که id سطر مورد نظر به عنوان پارامتر به آن ارسال می شود را صدا زده و از کاربر می پرسیم آیا از حذف رکورد اطمینان کامل دارد یا خیر.
در زیر کد html، قطعه کد javascript را مشاهده می کنید که به هنگام حذف پاک کردن رکورد از دیتابیس از کاربر می پرسد آیا از حذف آن اطمینان کامل دارد یا خیر. زمانی که کاربر بر روی دکمه ی ok در کادر محاوره ای کلیک می کند، اپلیکیشن کاربر را به صفحه ی delete.php ارجاع داده و مقدار id سطر را به عنوان پارامتر ارسال می کند. در زیر به ایجاد صفحه ی delete.php و پیاده سازی منطق delete می پردازیم:
< ?php
//starts the session
if($_SESSION['user']){ //checks if user is logged in
}
else {
header("location:index.php"); //redirects if user is not logged in.
}
if($_SERVER['REQUEST_METHOD'] == "GET")
{
mysql_connect("localhost", "root", "") or die(mysql_error()); //connect to server
mysql_select_db("first_db") or die("cannot connect to database"); //Connect to database
$id = $_GET['id'];
mysql_query("DELETE FROM list WHERE id='$id'");
header("location:home.php");
}
? >
کد پیچیدگی چندانی ندارد و دستور کلی همانی است که در نمونه ی قبلی بکار بردیم. تنها تفاوت در استفاده از متد GET بجای POST برای ارسال درخواست HTTP است. به این خاطر از متد GET استفاده می کنیم که قصد داریم همراه با درخواست HTTP یک پارامتر URL به سرور ارسال نماییم. اکنون صفحه ی home.php را از نو بارگذاری کرده و رکورد اول از جدول را حذف می کنیم.
خروجی:
نتیجه ی نهایی:
12. نمایش داده هایی که مقدار ستون public post آن ها بر روی yes تنظیم شده است (نمایش داده های عمومی)
تنها بخشی که مانده نمایش داده هایی است که در جدول (صفحه ی index.php) مقدار ستون public post آن ها بر روی yes تنظیم شده است. اگر به خاطر داشته باشید در وب سایت خود یک صفحه به نام index.php داریم که کاربران احراز هویت نشده به آن هدایت می شوند. پیاده سازی این قابلیت بسیار ساده است. کافی سات محتوای صفحه ی index.php را ویرایش کرده و مقداری کد php و یک جدول html به آن اضافه کنیم. در زیر صفحه ی index.php بروز رسانی شده ی خود را مشاهده می کنیم:
حال از سایت خارج شده (logout) تا اپلیکیشن شما را به صفحه ی پیش فرض سایت (index.php که برای کاربران ثبت نام و احراز هویت نشده نیز قابل دسترسی است) هدایت نماید. این صفحه ظاهری مشابه زیر خواهد داشت:
در این مرحله هنوز هیچ محتوایی برای شما قابل مشاهده نمی باشد چرا که هیچ رکوردی در جدول بر روی public تنظیم نشده است.
حال بار دیگر وارد سایت شده و این بار مقداری داده اضافه می کنیم. در این مثال ما مقادیر زیر را وارد جدول دیتابیس می کنیم:
- Salad - public
- Corn - non-public
- Pasta - public
- Chicken - public
- Spaghetti - non-public
در کل 6 آیتم جدید به جدول اضافه کردیم که 3 تای آن ها برای عموم و کاربران احراز هویت نشده قابل مشاهده می باشد:
حال با کلیک بر روی لینک مربوطه از سایت خارج شده (logout) و سپس به صفحه ی پیش فرض سایت (index.php) مراجعه نمایید. اکنون بایستی ظاهری مشابه زیر داشته باشد:
همان طور که می بینید تنها داده هایی که بر روی public تنظیم شده اند (مقدار ستون public post آن ها بر روی yes تنظیم شده) در این صفحه قابل مشاهده می باشند.
در پایان شما بایستی فایل های زیر را در پروژه ی php خود داشته باشید: