27-03-1394، 05:39 ب.ظ
ارتباط با کاربر
تاکنون هر دستوری که نوشته ایم، کارهای خاصی را انجام می داد اما کاربر (کسی که صفحه وب را مشاهده می کند)، هیچ کنترلی روی برنامه نداشت. درواقع تاکنون برنامه های ما به همان صورت ایستا (Static) که در HTML وجود داشت، طراحی می شدند (باز هم برای تغییر خروجی باید کد را تغییر می دادیم). حال می خواهیم روش ارتباط با کاربر را توضیح دهیم تا بتوانیم از کاربر اطلاعات دلخواه را دریافت کرده و بر اساس آن، صفحاتی طراحی کنیم که بدون نیاز به بازنویسی کد، اطلاعات مختلفی را (بسته به ورودی های کاربر) نمایش دهد.
فرم ها در زبان HTML
برای برقراری ارتباط با کاربر، از فرم ها استفاده می شود. یک فرم می تواند شامل موارد مختلفی همچون کادرهای متن معمولی، کادرهای متن رمز عبور و... باشد. از آنجا که این سری مقالات درمورد آموزش HTML نیست، پیشنهاد می کنیم HTML را با کمک آموزش های موجود در سایت، بیاموزید. به فرم HTML زیر دقت کنید:
[attachment=56]
وقتی کاربر برروی دکمه Send کلیک کند، صفحه result.php باز شده و مقادیری که کاربر در فرم وارد کرده است، در آدرس مشاهده می شود:
اگر به این آدرس دقت کنید، بخش های مختلفی را در آن می توان تشخیص داد:
بخش اول، آدرس صفحه مقصد را مشخص می کند. در ادامه، یک علامت سؤال درج شده که نماد Query String محسوب می شود. مقادیر در روش Get (به قسمت method در تگ form دقت کنید)، ازطریق آدرس ارسال می شوند که به بخشی از آدرس که حاوی مقادیر ارسالی است، Query String می گویند. بعد از علامت سؤال، مقادیر وارد شده توسط کاربر همراه با نام آنها (خاصیت name عنصر مربوطه در فرم) ذکر می شوند. اگر بیش از یک مقدار توسط فرم ارسال شود، با علامت & از هم جدا می شوند.
نکته اصلی در آدرس فوق آن است که امنیت در روش Get بسیار ضعیف است زیرا هر آنچه کاربر وارد کرده است، مستقیماً در آدرس صفحه قابل مشاهده است. این مسأله درصورتی که اطلاعات ارسال شده محرمانه باشد (مثل رمز عبور کاربر)، باعث کاهش امنیت می شود. در چنین مواردی بهتر است که از متد Post استفاده شود که در ادامه توضیح داده خواهد شد.
قبل از آنکه به سراغ متد Post برویم، خوب است با مزایای روش Get نیز آشنا شویم. فرض کنید یک وبلاگ طراحی کرده اید که شامل مطالب متنوع درمورد نجوم، کامپیوتر، الکترونیک، هواشناسی، سرگرمی و... است. حال اگر مطلب خاصی داشته باشید که بخواهید لینک مشاهده آنرا برای یکی از دوستانتان ارسال کنید، باید صفحه وبلاگ خود را به نحوی طراحی کنید که درصورت دریافت یک پارامتر (مثلاً post_id) مستقیماً همان مطلب را نمایش دهد و کاربر مجبور نباشد در بین مطالب وبلاگ (یا در آرشیو) به دنبال مطلب موردنظر بگردد. در چنین مواردی باید از متد Get استفاده کنید زیرا به سادگی، امکان مشخص کردن post_id را در آدرس صفحه به شما می دهد. برای مثال، اگرشماره مطلب موردنظر شما 153 باشد، کافی است آدرس زیر را برای دوستانتان بفرستید:
بدین ترتیب، دوست شما با کلیک کردن روی لینک فوق مستقیماً به مطلب شماره 153 هدایت خواهد شد. به این عمل، نشانه گذاری (Bookmark) می گویند و فقط با استفاده از متد Get امکان پذیر است (علت عدم امکان Bookmark با استفاده از متد Post در ادامه توضیح خواهیم داد). یکی دیگر از کاربردهای متد Get، بالابردن آمار بازدید سایت ازطریق موتورهای جستجو است. برای درک این قابلیت، فرض کنید همان وبلاگ را طوری طراحی کرده اید که اگر پارامتر category را دریافت کند، مطالب مرتبط با همان دسته بندی را نمایش دهد. برای مثال، اگر کاربر آدرس زیر را باز کند:
تمامی مطالب مرتبط با کامپیوتر که در وبلاگ شما موجود است، نمایش داده می شود. با استفاده از متد Get اگرچه آدرس سایت شما ثابت است، اما به دلیل وجود پارامتر category با مقادیر مختلف مثل computer و... در لینکهای موجود در سایت شما، درصورتی که کاربر در موتورهای جستجو به دنبال عبارت computer بگردد، سایت شما نیز در نتایج جستجو ظاهر خواهد شد.
حال ببینیم متد Post چه تفاوتهایی دارد. کد فرم قبل را ویرایش کرده و بجای متد GET از متد POST استفاده کنید و مجدداً روی دکمه Send کلیک کنید. مشاهده خواهید کرد که به این آدرس هدایت خواهید شد:
متوجه شدید که در اینجا، مقادیر واردشده توسط کاربر در آدرس ذکر نمی شوند؟ بلکه هم زمان با درخواست صفحه مقصد از سرور، مقادیر واردشده توسط کاربر نیز برای سرور در بدنه درخواست HTTP ارسال می شود. درنتیجه، این روش برای ارسال اطلاعات محرمانه، بهتر است. بطور خلاصه، همیشه از متد Get استفاده کنید، مگر اینکه یکی از دو محدودیت زیر وجود داشته باشد:
بنابراین در مثال فوق، با توجه به محدودیت دوم، از متد Post استفاده می کنیم.
پردازش اطلاعات دریافت شده در صفحه مقصد
تا اینجا آموختیم که چگونه اطلاعات را ارسال کنیم اما بخش مهم کار مانده است: پردازش ورودی کاربر. برای این کار، می خواهیم صفحه result.php را به نحوی پیاده سازی کنیم که اگر کاربر عبارت Ali رادر کادر Username و عبارت 1234 را در کادر Password وارد کرده باشد، با پیغام !!!Welcome و درغیر اینصورت با پیغام !Invalid User و لینکی به صفحه فرم مواجه شود.
دسترسی به ورودی های کاربر در PHP
در PHP چند آرایه سراسری از قبل تعریف شده است که به شما امکان کار با ورودی های دریافت شده از کاربر را می دهد:
تمامی آرایه های فوق، از اندیس رشته ای برای مشخص کردن مقادیر استفاده می کنند که اندیس هر عنصر، همان خاصیت name کنترل مربوطه در صفحه مبدأ فرم است. برای مثال، مقادیر واردشده توسط کاربر در فرم قبل را می توان به این شکل نمایش داد:
با توجه به توضیحات فوق، کد فایل result.php را به این صورت بنویسید:
دقت کنید که اگر کاربر بجای Ali عبارت ali را در کادر Username وارد کند، باز هم با پیغام خطا مواجه می شود اما در اکثر فرم های استاندارد، نام کاربری نسبت به بزرگی یا کوچکی حروف حساس نیست. برای اینکه در فرم ما نیز این ویژگی پشتیبانی شود، باید ابتدا متغیر $_POST['user'] را به حروف کوچک یا بزرگ تبدیل کرده و سپس، آنرا با 'ali' یا "ALI" مقایسه کنیم. درنتیجه دستور if را باید به یکی از دو صورت زیر بنویسیم:
نکته: تابع strtolower یک رشته را به حروف کوچک و تابع strtoupper آنرا به حروف بزرگ تبدیل می کند.
تاکنون هر دستوری که نوشته ایم، کارهای خاصی را انجام می داد اما کاربر (کسی که صفحه وب را مشاهده می کند)، هیچ کنترلی روی برنامه نداشت. درواقع تاکنون برنامه های ما به همان صورت ایستا (Static) که در HTML وجود داشت، طراحی می شدند (باز هم برای تغییر خروجی باید کد را تغییر می دادیم). حال می خواهیم روش ارتباط با کاربر را توضیح دهیم تا بتوانیم از کاربر اطلاعات دلخواه را دریافت کرده و بر اساس آن، صفحاتی طراحی کنیم که بدون نیاز به بازنویسی کد، اطلاعات مختلفی را (بسته به ورودی های کاربر) نمایش دهد.
فرم ها در زبان HTML
برای برقراری ارتباط با کاربر، از فرم ها استفاده می شود. یک فرم می تواند شامل موارد مختلفی همچون کادرهای متن معمولی، کادرهای متن رمز عبور و... باشد. از آنجا که این سری مقالات درمورد آموزش HTML نیست، پیشنهاد می کنیم HTML را با کمک آموزش های موجود در سایت، بیاموزید. به فرم HTML زیر دقت کنید:
<form action="result.php" method="get"> <label for="un">Username: </label> <input id="un" name="user" type="text" /> <br /> <label for="pw">Password: </label> <input id="pw" name="pass" type="password" /> <br /> <input type="submit" value="Send" /> </form>
[attachment=56]
وقتی کاربر برروی دکمه Send کلیک کند، صفحه result.php باز شده و مقادیری که کاربر در فرم وارد کرده است، در آدرس مشاهده می شود:
http://localhost/learning/result.php?user=Ali&pass=1234
اگر به این آدرس دقت کنید، بخش های مختلفی را در آن می توان تشخیص داد:
http://localhost/learning/result.php ? user=Ali & pass=1234
بخش اول، آدرس صفحه مقصد را مشخص می کند. در ادامه، یک علامت سؤال درج شده که نماد Query String محسوب می شود. مقادیر در روش Get (به قسمت method در تگ form دقت کنید)، ازطریق آدرس ارسال می شوند که به بخشی از آدرس که حاوی مقادیر ارسالی است، Query String می گویند. بعد از علامت سؤال، مقادیر وارد شده توسط کاربر همراه با نام آنها (خاصیت name عنصر مربوطه در فرم) ذکر می شوند. اگر بیش از یک مقدار توسط فرم ارسال شود، با علامت & از هم جدا می شوند.
نکته اصلی در آدرس فوق آن است که امنیت در روش Get بسیار ضعیف است زیرا هر آنچه کاربر وارد کرده است، مستقیماً در آدرس صفحه قابل مشاهده است. این مسأله درصورتی که اطلاعات ارسال شده محرمانه باشد (مثل رمز عبور کاربر)، باعث کاهش امنیت می شود. در چنین مواردی بهتر است که از متد Post استفاده شود که در ادامه توضیح داده خواهد شد.
قبل از آنکه به سراغ متد Post برویم، خوب است با مزایای روش Get نیز آشنا شویم. فرض کنید یک وبلاگ طراحی کرده اید که شامل مطالب متنوع درمورد نجوم، کامپیوتر، الکترونیک، هواشناسی، سرگرمی و... است. حال اگر مطلب خاصی داشته باشید که بخواهید لینک مشاهده آنرا برای یکی از دوستانتان ارسال کنید، باید صفحه وبلاگ خود را به نحوی طراحی کنید که درصورت دریافت یک پارامتر (مثلاً post_id) مستقیماً همان مطلب را نمایش دهد و کاربر مجبور نباشد در بین مطالب وبلاگ (یا در آرشیو) به دنبال مطلب موردنظر بگردد. در چنین مواردی باید از متد Get استفاده کنید زیرا به سادگی، امکان مشخص کردن post_id را در آدرس صفحه به شما می دهد. برای مثال، اگرشماره مطلب موردنظر شما 153 باشد، کافی است آدرس زیر را برای دوستانتان بفرستید:
http://localhost/learning/blog?post_id=153
بدین ترتیب، دوست شما با کلیک کردن روی لینک فوق مستقیماً به مطلب شماره 153 هدایت خواهد شد. به این عمل، نشانه گذاری (Bookmark) می گویند و فقط با استفاده از متد Get امکان پذیر است (علت عدم امکان Bookmark با استفاده از متد Post در ادامه توضیح خواهیم داد). یکی دیگر از کاربردهای متد Get، بالابردن آمار بازدید سایت ازطریق موتورهای جستجو است. برای درک این قابلیت، فرض کنید همان وبلاگ را طوری طراحی کرده اید که اگر پارامتر category را دریافت کند، مطالب مرتبط با همان دسته بندی را نمایش دهد. برای مثال، اگر کاربر آدرس زیر را باز کند:
http://localhost/learning/blog?category=computer
تمامی مطالب مرتبط با کامپیوتر که در وبلاگ شما موجود است، نمایش داده می شود. با استفاده از متد Get اگرچه آدرس سایت شما ثابت است، اما به دلیل وجود پارامتر category با مقادیر مختلف مثل computer و... در لینکهای موجود در سایت شما، درصورتی که کاربر در موتورهای جستجو به دنبال عبارت computer بگردد، سایت شما نیز در نتایج جستجو ظاهر خواهد شد.
حال ببینیم متد Post چه تفاوتهایی دارد. کد فرم قبل را ویرایش کرده و بجای متد GET از متد POST استفاده کنید و مجدداً روی دکمه Send کلیک کنید. مشاهده خواهید کرد که به این آدرس هدایت خواهید شد:
http://localhost/learning/result.php
متوجه شدید که در اینجا، مقادیر واردشده توسط کاربر در آدرس ذکر نمی شوند؟ بلکه هم زمان با درخواست صفحه مقصد از سرور، مقادیر واردشده توسط کاربر نیز برای سرور در بدنه درخواست HTTP ارسال می شود. درنتیجه، این روش برای ارسال اطلاعات محرمانه، بهتر است. بطور خلاصه، همیشه از متد Get استفاده کنید، مگر اینکه یکی از دو محدودیت زیر وجود داشته باشد:
- درصورت استفاده از متد Get، آدرس تولیدشده بیشتر از 255 کارکتر می شود (مرورگرها از آدرسهای طولانی تر از 255 کارکتر پشتیبانی نمی کنند.
- اطلاعات ارسال شده، محرمانه باشد.
بنابراین در مثال فوق، با توجه به محدودیت دوم، از متد Post استفاده می کنیم.
پردازش اطلاعات دریافت شده در صفحه مقصد
تا اینجا آموختیم که چگونه اطلاعات را ارسال کنیم اما بخش مهم کار مانده است: پردازش ورودی کاربر. برای این کار، می خواهیم صفحه result.php را به نحوی پیاده سازی کنیم که اگر کاربر عبارت Ali رادر کادر Username و عبارت 1234 را در کادر Password وارد کرده باشد، با پیغام !!!Welcome و درغیر اینصورت با پیغام !Invalid User و لینکی به صفحه فرم مواجه شود.
دسترسی به ورودی های کاربر در PHP
در PHP چند آرایه سراسری از قبل تعریف شده است که به شما امکان کار با ورودی های دریافت شده از کاربر را می دهد:
- GET_$ : این آرایه حاوی پارامترهایی است که با متد Get برای صفحه مقصد ارسال شده اند.
- POST_$ : اگر پارامترها با متد Post به صفحه مقصد ارسال شوند، در این آرایه قرار می گیرند.
- REQUEST_$ : این آرایه پارامترهای ارسال شده با هر دو روش Get و Post را در خود ذخیره می کند که به دلیل کاهش امنیت، از آن استفاده نمی کنیم (ممکن است در برنامه خود برای امنیت بیشتر از متد Post استفاده کرده باشید ولی با استفاده از این آرایه، مقادیر ارسالی با روش Get نیز دریافت می شود و درنتیجه امکان امتحان کردن مقادیر مختلف با دستکاری کردن آدرس وجود دارد که به این نوع حمله، Bruteforce می گویند).
تمامی آرایه های فوق، از اندیس رشته ای برای مشخص کردن مقادیر استفاده می کنند که اندیس هر عنصر، همان خاصیت name کنترل مربوطه در صفحه مبدأ فرم است. برای مثال، مقادیر واردشده توسط کاربر در فرم قبل را می توان به این شکل نمایش داد:
echo "<p>{$_POST['user']}</p>" . PHP_EOL; echo "<p>{$_POST['pass']}</p>" . PHP_EOL;
نقل قول:نکته: PHP درمورد نام توابع و متغیرها نسبت به بزرگی و کوچکی حروف حساس است. آنها را به همان شکلی که در این آموزش ملاحظه می کنید، وارد نمایید.
با توجه به توضیحات فوق، کد فایل result.php را به این صورت بنویسید:
if($_POST['user'] == 'Ali' && $_POST['pass'] == 1234) { echo '<p>Welcome!!!</p>' . PHP_EOL; } else { echo '<p>Invalid User!</p>' . PHP_EOL; echo '<p>Click <a href="formdemo.php">here</a> to retry.</p>' . PHP_EOL; }
دقت کنید که اگر کاربر بجای Ali عبارت ali را در کادر Username وارد کند، باز هم با پیغام خطا مواجه می شود اما در اکثر فرم های استاندارد، نام کاربری نسبت به بزرگی یا کوچکی حروف حساس نیست. برای اینکه در فرم ما نیز این ویژگی پشتیبانی شود، باید ابتدا متغیر $_POST['user'] را به حروف کوچک یا بزرگ تبدیل کرده و سپس، آنرا با 'ali' یا "ALI" مقایسه کنیم. درنتیجه دستور if را باید به یکی از دو صورت زیر بنویسیم:
if(strtolower($_POST['user'] == 'ali' && $_POST['pass'] == 1234) if(strtoupper($_POST['user'] == 'ALI' && $_POST['pass'] == 1234)
نکته: تابع strtolower یک رشته را به حروف کوچک و تابع strtoupper آنرا به حروف بزرگ تبدیل می کند.