ارسال و پردازش پارامترهای درخواست HTTP با استفاده از PHP. رسیدگی به درخواست ها با PHP رسیدگی به درخواست های http با php

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

اگر در دایرکتوری های دنور به خوبی آشنا هستید، می توانید هر فایل PHP را در دایرکتوری مناسب خود ایجاد کنید و مستقیماً به نوشتن کد ادامه دهید. برای کسانی که هنوز به توانایی های خود اطمینان ندارند، به شما توصیه می کنم کارهای زیر را انجام دهید: در یک دیسک مجازی با Denver (معمولاً Z است) در پوشه اصلی، یک پوشه درس ایجاد کنید. بعد، در این پوشه، یک پوشه دیگر ایجاد کنید - www. مال توست پوشه کارپروژه، که از نوار آدرس مرورگر در دسترس خواهد بود. Denver را ریبوت کنید تا هاست ایجاد شده در سیستم ثبت شود. در نهایت در پوشه www یک فایل index.php ایجاد کنید. این فایل اصلی با کد شما خواهد بود.

همانطور که می بینید، این نشانه گذاری معمولی HTML است، اما ما نام فایل را index.php گذاشتیم، به این معنی که اکنون می توانیم هر دستورالعمل PHP را در سند وارد کنیم.

اگر اکنون از http://lessons/ در مرورگر بازدید کنید، نتیجه زیر را مشاهده خواهید کرد:

فیلدها را پر کنید (به عنوان مثال: نام - Vasya، سال تولد - 1990) و روی دکمه "ارسال" کلیک کنید. چی میبینی؟ و هیچی! باز هم همان فرم، فقط خالی. با این حال، برای ناراحت شدن عجله نکنید - به نوار آدرس مرورگر نگاهی بیندازید. تغییر کرده است و اکنون چیزی شبیه به این است:

Http://lessons/index.php?user_name=Vasya&user_year=1990&submit_form=submit

و این بدان معنی است که سرور هنوز اطلاعات شما را دریافت کرده است!

حالا بیایید بفهمیم

روش GET

اول، به هر حال فرم HTML چیست؟ این رابطی است که به شما امکان می دهد هر داده ای را از مرورگر مشتری به سرور ارسال کنید. به ویژگی های فرم خود نگاهی بیندازید:

ویژگی action مسئول آدرس گیرنده داده ارسالی است. در مورد ما، فرم به همان آدرس ارسال می شود، یعنی. در درس/index.php.

ویژگی متد سزاوار توجه ویژه است که روش ارسال درخواست به سرور را مشخص می کند. چندین روش وجود دارد، اما رایج ترین (و کاربردی) روش ها GET و POST هستند. اکنون به روش GET علاقه مند خواهیم شد.

درخواست GET به این معنی است که داده ها مستقیماً از طریق نوار آدرس به سرور ارسال می شود. شما قبلاً با ارسال فرم از این موضوع مطمئن شدید - داده های خاصی به نوار آدرس اضافه شد. این اطلاعات از کجا آمده؟ به تگ های ورودی در فرم HTML توجه کنید. همه آنها دارای یک ویژگی نام هستند که نام فیلد داده شده را تعیین می کند.

با متد GET کاراکتر "?" به آدرس اصلی اضافه می شود. (علامت سوال) تا سرور متوجه شود که برخی از داده ها رسیده است. بعد از "؟" خود داده مستقیماً به فرم name=value می رود. اگر بیش از یک داده وجود داشته باشد، آنها با نماد اتحادیه "&" از هم جدا می شوند. فرم را با مقادیر مختلف فیلد ارسال کنید و آن را بررسی کنید.

وقت آن است که یاد بگیرید چگونه داده های دریافتی را "گرفتن" و پردازش کنید. از آنجایی که ویژگی action به فایل کنونی index.php، بنابراین داده ها به اینجا می آیند، بنابراین در همان فایل کد پردازش درخواست GET را می نویسیم.

پس درست بعد از تگ این کد پی اچ پی را اضافه کنید:

فایل را ذخیره کنید، دوباره به http://lessons/ مراجعه کنید، فرم را ارسال کنید و وای! - چی میبینی؟

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

کد PHP پروژه ما را در نظر بگیرید که یک شرط است:

اگر (isset($_GET["submit_form"])) ( )

سرور بررسی می کند که آیا یک متغیر درخواست GET با نام submit_form دریافت شده است؟ یعنی به بیان ساده آیا اصلا فرم ارسال شده بود؟ اگر چنین است، کد php سمت سرور یک نشانه گذاری HTML جدید با پاسخ آن به طور مستقیم به مرورگر کاربر با استفاده از دستور echo ارسال می کند. اگر کد کنترل کننده نوشته شده را به دقت مطالعه کنید، همه چیز بلافاصله برای شما روشن می شود!

این روش GET جالب است! برای مثال نوار آدرس را به این تغییر دهید:

http://lessons/index.php?user_name=myname&user_year=1900&submit_form=submit

و دکمه "Enter" را فشار دهید. سرور با پذیرش داده های دیگر، دوباره به شما پاسخ می دهد! من فکر می کنم این همه روشن است.

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

روش POST

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

فایل خود را با جایگزین کردن نام متغیرهای $_GET با $_POST در کد PHP تغییر دهید و روش "POST" را در فرم بنویسید. صفحه را رفرش کنید و دوباره فرم را ارسال کنید. با این حال، نتیجه مشابه با روش GET خواهد بود نوار آدرسبدون تغییر باقی ماند، به این معنی که داده ها به صورت ایمن در بدنه خود درخواست ارسال شده است.

برای ادغام مطالب، یک برنامه وب کوچک ایجاد می کنیم که برای ورود به سایت، نام کاربری و رمز عبور را درخواست می کند. کد مثال نسبتاً پیچیده خواهد بود و به توجه و تمایل شما برای درک عملکرد برنامه PHP نیاز دارد.

فایل index.php:

مثال را اجرا کنید و ببینید چه اتفاقی می افتد. ابتدا نام کاربری و رمز عبور درخواست می شود (در کدی که آنها را به عنوان "admin" و "secret" تعریف کرده ایم)، اگر همه چیز درست باشد، به صفحه نخستسایت، اگر داده ها نادرست باشد، اخطار مربوطه نمایش داده می شود.

پیاده سازی این فناوری را در نظر بگیرید.

لطفاً توجه داشته باشید که ما تمام کدهای فرم HTML را مستقیماً نمایش نمی دهیم، بلکه آن را در متغیر $form ذخیره می کنیم.

مراقب نقل قول ها باشید! تمام کدهای HMTL داخل گیومه های تکی هستند، بنابراین نقل قول های داخلی آن باید دو کوتیوم باشند. اگر نوشتی

$form = "...کد شما..."،

سپس کد داخلی حاوی عکس - نقل قول های تکی است.

بعد، خط 27 بررسی می کند که آیا فرم ارسال شده است (شرط 1 در شکل)، اگر نه، فرم HTML نمایش داده می شود و اسکریپت کار را متوقف می کندتابع ()die است. هیچ چیز دیگری به جز فرم در مرورگر نمایش داده نمی شود.

اگر داده ها دریافت شده باشد، متغیرهای POST برای انطباق با موارد مشخص شده بررسی می شوند (شرط 2 در شکل). اگر مطابقت نداشته باشند، یک پیام هشدار نمایش داده می شود، یک فرم ورود به سیستم HTML، و اسکریپت دوباره خارج می شود (die()).

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

این ساده ترین مثال. به طور طبیعی، در پروژه های واقعی، چنین بررسی های مستقیمی انجام نمی شود - ورود و رمز عبور به صورت رمزگذاری شده در فایل ها یا در پایگاه داده ذخیره می شوند. بنابراین، این مقاله به توصیف فناوری تعامل بین مشتری و سرور بر اساس درخواست‌های GET و POST می‌پردازد. برای ایجاد برنامه های کاربردی کامل، باید دانش کاملی از پایگاه های داده و برنامه نویسی شی گرا داشته باشید. بیشتر در این مورد در مقالات بعدی.

مشتریان مرورگر می توانند اطلاعات را به یک وب سرور ارسال کنند.

قبل از اینکه مرورگر اطلاعات را ارسال کند، آن را با استفاده از طرحی به نام رمزگذاری URL رمزگذاری می کند. در این طرح، جفت‌های نام/مقدار با علامت‌های مساوی به هم متصل می‌شوند و جفت‌های مختلف با یک علامت از هم جدا می‌شوند.

Name1=value1&name2=value2&name3=value3

فاصله ها حذف می شوند و با یک کاراکتر + جایگزین می شوند و هر کاراکتر غیر الفبایی دیگر با مقادیر هگزا دسیمال جایگزین می شود. پس از کدگذاری اطلاعات به سرور ارسال می شود.

روش GET

متد GET اطلاعات کاربر رمزگذاری شده ضمیمه شده به درخواست صفحه را ارسال می کند. صفحات و اطلاعات کدگذاری شده از یکدیگر جدا شده اند؟ علامت سوال.

http://www.test.com/index.htm?name1=value1&name2=value2

  • متد GET یک رشته طولانی ایجاد می‌کند که در گزارش‌های سرور شما در قسمت «مکان» مرورگر ظاهر می‌شود.
  • روش GET محدود به ارسال تا 1024 کاراکتر است.
  • اگر رمز عبور یا غیره دارید، هرگز از روش GET استفاده نکنید اطلاعات محرمانهبرای ارسال به سرور
  • از GET نمی توان برای ارسال داده های باینری، مانند تصاویر یا اسناد متنی، به سرور استفاده کرد.
  • داده های ارسال شده با روش GET با استفاده از متغیر محیطی QUERY_STRING قابل دسترسی است.
  • PHP آرایه انجمنی $_GET را برای دسترسی به تمام اطلاعات ارسال شده با استفاده از متد GET فراهم می کند.

if($_GET["name"] || $_GET[" سن"]) ( echo "Welcome ". $_GET["name"]; echo "You are ". $_GET[" سن"]. " ساله "; exit();) نام: سن:

روش POST

روش پستاطلاعات را از طریق هدرهای HTTP منتقل می کند. اطلاعات همانطور که در مورد روش توضیح داده شده است کدگذاری می شود گرفتن، و در هدر قرار می گیرد QUERY_STRING.

  • روش POST هیچ محدودیتی در اندازه داده هایی که باید ارسال شوند ندارد.
  • از روش POST می توان برای ارسال ASCII و همچنین داده های باینری استفاده کرد.
  • داده های ارسال شده با روش POST از طریق هدر HTTP می گذرد، بنابراین امنیت به پروتکل HTTP بستگی دارد. با استفاده از Secure HTTP، می توانید از امنیت اطلاعات خود اطمینان حاصل کنید.
  • PHP آرایه انجمنی $_POST را برای دسترسی به تمام اطلاعات ارسال شده با استفاده از روش POST فراهم می کند.

مثال زیر را با قرار دادن امتحان کنید منبعبه اسکریپت test.php.

if($_POST["name"] || $_POST["سن"]) ( if (preg_match("[^A-Za-z"-]",$_POST["name"])) ( مرگ (" نام و نام نامعتبر باید آلفا باشد"؛ ) echo "خوش آمدید ". $_POST["name"]؛ echo "شما ". $_POST["سن"] هستید. "سال"؛ exit(); )

نام: سن:

متغیر $_REQUEST

متغیر PHP $_REQUESTحاوی مطالبی مانند $_GET, $_POST، و $_COOKIE. در مورد متغیر بحث خواهیم کرد $_COOKIEوقتی در مورد کوکی ها صحبت می کنیم

متغیر $_REQUEST PHP را می توان برای به دست آوردن نتیجه از داده های فرم ارسال شده با استفاده از روش های GET و POST استفاده کرد.

برای روش POST

محتوای فرم به همان روشی که برای متد GET کدگذاری می شود (به بالا مراجعه کنید)، اما به جای افزودن یک رشته به URL، محتوای درخواست به عنوان یک بلوک داده به عنوان بخشی از عملیات POST ارسال می شود. اگر مشخصه ACTION وجود داشته باشد، مقدار URL موجود در آنجا تعیین می کند که این بلوک داده به کجا ارسال شود. این روش همانطور که قبلا ذکر شد برای انتقال بلوک های داده بزرگ توصیه می شود.

اطلاعات وارد شده توسط کاربر و ارسال به سرور با استفاده از روش POST به عنوان ورودی استاندارد به برنامه مشخص شده در ویژگی action یا در صورت حذف این ویژگی به اسکریپت فعلی ارائه می شود. طول فایل آپلود شده در متغیر محیطی CONTENT_LENGTH و نوع داده در متغیر CONTENT_TYPE ارسال می شود.

شما فقط می توانید داده ها را با استفاده از روش POST با استفاده از یک فرم HTML ارسال کنید، زیرا داده ها در بدنه درخواست ارسال می شوند، و نه در هدر، مانند GET. بر این اساس، تنها با تغییر مقدار وارد شده در فرم، می توانید مقدار پارامترها را تغییر دهید. هنگام استفاده از POST، کاربر داده های ارسال شده به سرور را نمی بیند.

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

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

  • REMOTE_ADDR - آدرس IP میزبان (رایانه) ارسال کننده درخواست؛
  • REMOTE_HOST - نام میزبانی که درخواست از آن ارسال شده است.
  • HTTP_REFERER - آدرس صفحه ای که به اسکریپت فعلی اشاره دارد.
  • REQUEST_METHOD - روشی که هنگام ارسال درخواست استفاده شد.
  • QUERY_STRING - اطلاعاتی که در URL بعد از علامت سوال یافت می شود.
  • SCRIPT_NAME - مسیر مجازی به برنامه ای که باید اجرا شود.
  • HTTP_USER_AGENT - اطلاعات مربوط به مرورگری که مشتری از آن استفاده می کند

تا اینجا فقط اشاره کردیم که درخواست های مشتری با استفاده از سرور روی سرور پردازش می شوند برنامه ویژه. در واقع می توانیم این برنامه را خودمان بنویسیم از جمله در PHP و هر کاری که بخواهیم با داده های دریافتی انجام می دهد. برای نوشتن این برنامه باید با برخی از قوانین و ابزارهای ارائه شده برای این منظور توسط PHP آشنا شوید.



در یک اسکریپت PHP، راه های مختلفی برای دسترسی به داده های ارسال شده توسط یک کلاینت از طریق HTTP وجود دارد. قبل از PHP 4.1.0، دسترسی به چنین داده‌هایی با نام متغیرهای ارسال شده انجام می‌شد (به یاد بیاورید که داده‌ها به شکل جفت‌های "نام متغیر، نماد "="، مقدار متغیر ارسال می‌شوند). بنابراین، اگر، برای مثال، first_name=Nina پاس داده شود، متغیر $first_name با مقدار Nina در داخل اسکریپت ظاهر می‌شود. اگر لازم بود تشخیص داده شود که داده ها با چه روشی منتقل شده اند، از آرایه های انجمنی $HTTP_POST_VARS و $HTTP_GET_VARS استفاده می شود که کلیدهای آنها نام متغیرهای منتقل شده بود و مقادیر مقادیر اینها بود. متغیرها به ترتیب بنابراین، اگر جفت first_name=Nina با روش GET ارسال شود، آنگاه $HTTP_GET_VARS["first_name"]="Nina".

استفاده از نام متغیرهای ارسال شده به طور مستقیم در برنامه ناامن است. بنابراین، با شروع PHP 4.1.0، تصمیم گرفته شد از یک آرایه خاص - $_REQUEST - برای دسترسی به متغیرهای ارسال شده از طریق درخواست های HTTP استفاده شود. این آرایه حاوی داده هایی است که با روش های POST و GET و همچنین از طریق کوکی های HTTP منتقل می شوند. این یک آرایه انجمنی فوق جهانی است، یعنی. مقادیر آن را می توان در هر نقطه از برنامه با استفاده از نام متغیر مربوطه (عنصر فرم) به عنوان یک کلید به دست آورد.

مثال 4.2.فرض کنید فرمی برای ثبت نام شرکت کنندگان در یک مدرسه برنامه نویسی مکاتبه ای ایجاد کردیم، مانند مثال بالا. سپس در فایل 1.php که این فرم را پردازش می کند، می توانید موارد زیر را بنویسید:

";$str .="شما انتخاب کرده اید که دوره را در ".$_REQUEST["kurs"];echo $str;?> مطالعه کنید

سپس اگر نام "واسیا" را در فرم، نام خانوادگی "پتروف" را وارد کرده و از بین تمام دوره ها، دوره PHP را انتخاب کنیم، پیام زیر را در صفحه مرورگر دریافت خواهیم کرد:

پس از معرفی آرایه $_REQUEST، آرایه های $HTTP_POST_VARS و $HTTP_GET_VARS برای یکنواختی به ترتیب به $_POST و $_GET تغییر نام دادند، اما خود آنها به دلایل سازگاری با نسخه های قبلی PHP. بر خلاف پیشینیان خود، آرایه های $_POST و $_GET تبدیل به ابرجهانی شده اند، یعنی. به طور مستقیم و درون توابع و روش ها قابل دسترسی است.

بیایید مثالی از استفاده از این آرایه ها بزنیم. فرض کنید باید فرمی را پردازش کنیم که حاوی عناصر ورودی به نام‌های first_name، last_name، kurs (مثلاً فرم form.html بالا) است. داده ها با استفاده از روش POST منتقل شده اند و ما نمی خواهیم داده های منتقل شده با روش های دیگر را پردازش کنیم. این را می توان به صورت زیر انجام داد:

";$str .= "شما یک دوره در ". $_POST["kurs"];echo $str;?> انتخاب کرده اید

سپس در صفحه مرورگر، اگر نام "Vasya"، نام خانوادگی "Petrov" را وارد کرده و دوره PHP را از بین تمام دوره ها انتخاب کنیم، مانند مثال قبلی، پیامی را خواهیم دید:

سلام واسیا پتروف! شما برای مطالعه دوره PHP انتخاب کرده اید

به منظور حفظ توانایی پردازش اسکریپت ها طولانی تر نسخه های اولیهاز زمان PHP 4.1.0، دستورالعمل register_globals معرفی شده است، که اجازه می دهد یا از دسترسی مستقیم به متغیرها با نام آنها جلوگیری می کند. اگر پارامتر register_globals=On در فایل تنظیمات PHP، متغیرهایی که با روش‌های GET و POST به سرور ارسال می‌شوند، می‌توانند به سادگی با نام آنها دسترسی داشته باشند (یعنی می‌توانید $first_name را بنویسید). اگر register_globals=خاموش است، باید $_REQUEST["first_name"] یا $_POST["first_name"]، $_GET["first_name"]، $HTTP_POST_VARS["first_name"]، $HTTP_GET_VARS["first_name"] را بنویسید. از نظر امنیتی، بهتر است این دستورالعمل را غیرفعال کنید (یعنی register_globals=Off). با فعال بودن دستورالعمل register_globals، آرایه های فهرست شده در بالا نیز حاوی داده های ارسال شده توسط مشتری خواهند بود.

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

همانطور که قبلاً گفتیم، اگر از روش GET استفاده شود، داده ها با افزودن یک رشته کوئری به شکل جفت های "variable_name = value" به URL منبع منتقل می شوند. هر چیزی که در URL بعد از علامت سوال نوشته می شود را می توان با استفاده از دستور بدست آورد

getenv("QUERY_STRING");

به همین دلیل امکان انتقال داده ها به شکل دیگری با استفاده از روش GET وجود دارد. به عنوان مثال، فقط مقادیر چندین پارامتر را که با علامت مثبت از هم جدا شده اند، مشخص کنید و رشته پرس و جو را به قسمت هایی در اسکریپت تجزیه کنید، یا می توانید مقدار تنها یک پارامتر را ارسال کنید. در این حالت، یک عنصر خالی با کلیدی برابر با این مقدار (کل رشته پرس و جو) در آرایه $_GET ظاهر می شود و نماد "+" موجود در رشته query با زیرخط "_" جایگزین می شود.

در روش POST، داده ها تنها با استفاده از فرم ها منتقل می شوند و کاربر (مشتری) نمی بیند که چه نوع داده ای به سرور ارسال می شود. برای دیدن آنها، هکر باید فرم ما را با فرم خود جایگزین کند. سپس سرور نتایج پردازش فرم اشتباه را به مکان اشتباه ارسال می کند. برای جلوگیری از این امر، می توانید آدرس صفحه ای که داده ها از آن ارسال شده است را بررسی کنید. این کار را می توان دوباره با تابع getenv() انجام داد:

getenv("HTTP_REFERER");

اکنون زمان حل مسئله ای است که در ابتدای سخنرانی ارائه شده است.

دسترسی به چنین داده‌هایی با نام متغیرهای منتقل شده انجام می‌شود (به یاد بیاورید که داده‌ها به شکل جفت "نام متغیر، "=" نماد، مقدار متغیر" منتقل می‌شوند). بنابراین، اگر، برای مثال، first_name=Nina پاس داده شود، متغیر $first_name با مقدار Nina در داخل اسکریپت ظاهر می‌شود. اگر لازم بود تشخیص داده شود که با چه روشی داده ها منتقل شده اند، از آرایه های انجمنی استفاده می شود HTTP_POST_VARS $و HTTP_GET_VARS $که کلیدهای آن نام متغیرهای عبوری بود و مقادیر به ترتیب مقادیر این متغیرها بودند. بنابراین، اگر جفت first_name = Nina به متد ارسال شود گرفتن، سپس $ HTTP_GET_VARS["first_name"]="نینا".

استفاده از نام متغیرهای ارسال شده به طور مستقیم در برنامه ناامن است. بنابراین، تصمیم گرفته شد، با شروع از PHP 4.1.0، از یک آرایه ویژه برای دسترسی به متغیرهای ارسال شده از طریق درخواست های HTTP استفاده شود - $_REQUEST. این آرایه حاوی داده های ارسال شده توسط متدها است پستو گرفتن، و همچنین استفاده از کوکی های HTTP. این یک آرایه انجمنی فوق جهانی است، یعنی. مقادیر آن را می توان در هر نقطه از برنامه با استفاده از نام متغیر مربوطه (عنصر فرم) به عنوان یک کلید به دست آورد.

مثال 4.2. فرض کنید فرمی برای ثبت نام شرکت کنندگان در یک مدرسه برنامه نویسی مکاتبه ای ایجاد کردیم، مانند مثال بالا. سپس در فایل 1.php که این فرم را پردازش می کند، می توانید موارد زیر را بنویسید:

سپس اگر نام "واسیا" را در فرم، نام خانوادگی "پتروف" را وارد کرده و از بین تمام دوره ها، دوره PHP را انتخاب کنیم، پیام زیر را در صفحه مرورگر دریافت خواهیم کرد:

پس از معرفی یک آرایه $_REQUESTآرایه ها HTTP_POST_VARS $و HTTP_GET_VARS $برای سازگاری تغییر نام داد $_POSTو $_GETبه ترتیب، اما خود آنها به دلایل سازگاری با نسخه های قبلی PHP از استفاده ناپدید نشده اند. بر خلاف پیشینیان خود، آرایه ها $_POSTو $_GETابرجهانی شده اند، یعنی. به طور مستقیم و درون توابع و روش ها قابل دسترسی است.

بیایید مثالی از استفاده از این آرایه ها بزنیم. فرض کنید باید فرمی حاوی عناصر ورودی به نام‌های first_name، last_name، kurs را پردازش کنیم (به عنوان مثال، فرم form.html بالا). داده ها با استفاده از روش انتقال داده شد پست، و ما نمی خواهیم داده های ارسال شده توسط روش های دیگر را پردازش کنیم. این را می توان به صورت زیر انجام داد:

سپس در صفحه مرورگر، اگر نام "Vasya"، نام خانوادگی "Petrov" را وارد کرده و دوره PHP را از بین تمام دوره ها انتخاب کنیم، مانند مثال قبلی، پیامی را خواهیم دید:

به منظور حفظ توانایی پردازش اسکریپت های زودتر از PHP 4.1.0، دستورالعمل register_globals، اجازه دادن یا رد کردن دسترسی به متغیرها به طور مستقیم با نام آنها. اگر در تنظیمات PHP فایل پارامتر register_globals =روشن، سپس به متغیرهایی که توسط متدها به سرور ارسال می شود گرفتنو پست، فقط می توانید با نام آنها به آنها اشاره کنید (یعنی می توانید $first_name را بنویسید). اگر register_globals=خاموش، سپس باید $ بنویسید _درخواست["first_name"]یا دلار _POST["first_name"], $ _GET["first_name"], $ HTTP_POST_VARS["first_name"], $ HTTP_GET_VARS["first_name"]. از نقطه نظر امنیتی، بهتر است این دستورالعمل را غیرفعال کنید (یعنی register_globals=خاموش). وقتی دستورالعمل فعال است register_globalsآرایه های ذکر شده در بالا همچنین حاوی داده های ارسال شده توسط مشتری هستند.

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

مثال 4.3. استفاده از getenv()

همانطور که قبلاً گفتیم اگر از روش استفاده شود گرفتن، سپس داده ها با افزودن یک رشته پرس و جو به شکل جفت های "variable_name=value" به URL منبع ارسال می شوند. هر چیزی که در URL بعد از علامت سوال نوشته می شود را می توان با استفاده از دستور بدست آورد

getenv("QUERY_STRING");

با تشکر از این، با توجه به روش امکان پذیر است گرفتنانتقال داده به شکل دیگری به عنوان مثال، فقط مقادیر چندین پارامتر را که با علامت مثبت از هم جدا شده اند، مشخص کنید و رشته پرس و جو را به قسمت هایی در اسکریپت تجزیه کنید، یا می توانید مقدار تنها یک پارامتر را ارسال کنید. در این مورد، در آرایه $_GETیک عنصر خالی با یک کلید برابر با این مقدار (کل رشته پرس و جو) ظاهر می شود، با کاراکتر " + " که در رشته پرس و جو مواجه می شود با زیرخط " _ " جایگزین می شود.

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

getenv("HTTP_REFERER");

اکنون زمان حل مسئله ای است که در ابتدای سخنرانی ارائه شده است.

مثال رسیدگی به درخواست PHP

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

فرم ثبت نام دانشجو

نام

نام خانوادگی

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

دوره ای را که می خواهید در آن شرکت کنید انتخاب کنید:
PHP
لیسپ
پرل
یونیکس

چه چیزی می خواهید در مورد شما بدانیم؟

لیست 4.4. form_final.html

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

اسکریپتی که همه اینها را تجزیه و پردازش می کند 1.php نامیده می شود (فرم به این فایل اشاره دارد که در ویژگی آن نوشته شده است. عمل). پیش فرض ارسال روش است گرفتن، اما ما اشاره کردیم پست. با توجه به اطلاعات دریافتی از شخص ثبت نام شده، اسکریپت پیام مربوطه را تولید می کند. اگر شخصی چند دوره را انتخاب کرده باشد، پیامی در مورد زمان انجام آنها و در مورد اساتیدی که آنها را خوانده اند به او نمایش داده می شود. اگر شخص چیزی را انتخاب نکرده باشد، پیامی در مورد جلسه بعدی مدرسه برنامه نویسان مکاتبه (ZSHP) نمایش داده می شود.

"14.30","Lisp"=>"12.00", "Perl"=>"15.00","Unix"=>"14.00"); $lectors = array("PHP"=>"Vasily Vasilievich", "Lisp"=>"Ivan Ivanovich", "Perl"=>"Peter Petrovich", "Unix"=>"Semyon Semyonovich"); define("SIGN", "با احترام، مدیریت"); // امضای نامه را به عنوان یک تعریف ثابت تعریف کنید("MEETING_TIME","18.00"); // زمان جلسه دانشجویی را تنظیم کنید $date = "12 می"; // تعیین تاریخ برای سخنرانی ها // شروع به نوشتن متن پیام $str = "سلام عزیزم" . $_POST["first_name"] . " " . $_POST["last_name"]."!
";$str .="
به شما اطلاع می دهیم که "; $kurses = $_POST["kurs"]; // لیست دوره های انتخاب شده را در این متغیر ذخیره کنید اگر (!isset($kurses)) ( // اگر هیچ دوره ای انتخاب نشده است $event = " next جلسه دانشجویی"؛ $str .= "$event در $date برگزار خواهد شد". MEETING_TIME . "
"; ) else ( // اگر حداقل یک دوره انتخاب شده باشد $event = "سخنرانی که انتخاب کرده اید برگزار می شود $date

    تابع ";//count تعداد عناصر آرایه $lect = "" را برای ($i=0;$i) محاسبه می کند $k سخنرانی در $times[$k]"؛ // نوشتن پیام $lect .= " (مدرس شما، $lectors[$k])"؛ ) $event = $event . $lect . "
"; $str .= "$event"; ) $str .= "
". SIGN؛ // اضافه کردن امضای echo $str؛ // چاپ پیام به صفحه؟> لیست 4.5. اسکریپت 1.php فرم form_final.html را پردازش می کند

نتیجه

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

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

روش های درخواست HTTP و پارامترهای آنها

هر برنامه وب پویا مطابق با پارامترهای وارد شده توسط کاربر یا اقدامات انجام شده در سمت مشتری، پاسخی را برای کاربر ایجاد می کند. درخواست به سرور اغلب به دو نوع درخواست کاهش می یابد: استفاده از روش GET یا روش POST. چند کلمه در مورد تفاوت این دو نوع درخواست.

روش GET:

    پارامترها در هدر درخواست HTTP ارسال می شوند، بنابراین در آن قابل مشاهده هستند خط فرمان، و چنین پرس و جوی را می توان نشانه گذاری کرد. از آنجایی که طول کل هدر محدود است، تعداد و طول پارامترهای ارسال شده با استفاده از GET نیز محدود است.

    اعتقاد بر این است که نتایج چندین درخواست GET یکسان اجرا شده در یک ردیف باید یکسان باشد.

روش POST:

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

    اعتقاد بر این است که نتایج چندین درخواست POST یکسان می تواند برگردد معانی مختلفزیرا آنها می توانند خواص شی مورد نظر را تغییر دهند.

برای بازیابی محتوا باید از روش GET استفاده شود منبع اطلاعاتیبا توجه به پارامترها، زمانی که لازم نیست تغییراتی در ساختار داده های منبع هدف ایجاد کنید، و منطقی است که درخواست (URL) را نشانه گذاری کنید. سرعت اجرای متد GET ممکن است سریعتر از درخواست های مشابه با استفاده از روش POST باشد.

روش POST باید زمانی استفاده شود که لازم باشد پارامترهای ارسال شده به سرور از URL پنهان شود. این روش همچنین باید در درخواست‌ها برای تغییرات در محتوای منبع هدف استفاده شود و در پارامترها (در متن درخواست) شرحی از همین تغییرات ارسال شود.

مسیر رسیدن به منبع؟ parameter1=value1¶meter2=value2&…

اگر خاصی ندارید فرم های HTMLبرای پر کردن پارامترها، می توانید برنامه PHP خود را با عبور دادن پارامترهای آزمایشی مستقیماً در خط فرمان مرورگر اشکال زدایی کنید، به عنوان مثال:

http://website/php-samples/sql.php?sql=انتخاب * از d_staff

برای دسترسی به پارامترهای پرس و جو در سمت سرور، از آرایه های جهانی استفاده کنید $_GETو $_POSTبه ترتیب. اگر برنامه شما اهمیتی ندارد که با چه روشی به آن دسترسی پیدا کرده است، باید از یک آرایه استفاده کنید $_REQUEST، که داده های آرایه های $_GET و $_POST را ترکیب می کند، به عنوان مثال، به صورت زیر:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"] : "";

در این مثال، برنامه تعیین می کند که آیا پارامتر "sql" ارسال شده است یا خیر: اگر چنین است، مقدار آن را به متغیر مربوطه اختصاص می دهد، و اگر نه، یک مقدار خالی به آن اختصاص می دهد.

تعریف پارامترهای درخواست HTTP از طریق فرم HTML

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

روش "پست" عمل ='sql.php' > SQL:

ویژگی روش عنصر فرم، روشی را مشخص می کند که نحوه ارسال داده ها به سرور را تعیین می کند (get یا post). ویژگی action مشخص می کند فایل php کسی که درخواست را پردازش می کند. اگر کنترل کننده باید فایل فعلی باشد، پس ویژگی action نیازی به اضافه شدن ندارد. برای تمام عناصری که مقدار آنها باید به عنوان پارامتر درخواست HTTP ارسال شود، یک مقدار منحصر به فرد برای ویژگی name باید تعریف شود. این مقدار صفت است نامخواهد بود فهرست مطالبدر آرایه های $_GET، $_POST یا $_REQUEST (به مثال بالا مراجعه کنید). با کلیک بر روی یک دکمه ارسالفرم را با تمام مقادیر وارد شده به سرور ارسال می کند.