ما درخواست های POST را در PHP پردازش می کنیم. NodeJS. نحوه پردازش درخواست های POST پردازش درخواست های http php

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

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

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

اولین روش برای انجام درخواست PHP POST استفاده از file_get_contents است. روش دوم از fread در ترکیب با چند تابع دیگر استفاده می کند. هر دو گزینه از تابع stream_context_create برای پر کردن فیلدهای هدر درخواست مورد نیاز استفاده می کنند.

توضیح کد

متغیر $sPD حاوی داده هایی است که باید منتقل شوند. باید در قالب رشته درخواست HTTP باشد، بنابراین برخی از کاراکترهای خاص باید کدگذاری شوند.

هم در تابع file_get_contents و هم در تابع fread دو پارامتر جدید داریم. اولین مورد use_include_path است. از آنجایی که ما در حال درخواست HTTP هستیم، در هر دو مثال نادرست خواهد بود. هنگامی که برای خواندن یک منبع محلی روی true تنظیم می شود، تابع فایل را در include_path جستجو می کند.

پارامتر دوم context است که با مقدار بازگشتی stream_context_create پر شده است که مقدار آرایه $aHTTP را می گیرد.

استفاده از file_get_contents برای ایجاد درخواست های POST

برای ارسال یک درخواست POST با استفاده از file_get_contents در PHP، باید از stream_context_create استفاده کنید تا به صورت دستی فیلدهای هدر را پر کنید و مشخص کنید که از کدام "wrapper" استفاده شود - در این مورد HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper که مورد استفاده قرار خواهد گرفت آرایه("method" => "POST", // روش درخواست // سرصفحه های درخواست در زیر "header" => "Content" تنظیم می شوند - نوع: application/x-www-form-urlencoded، "content" => $sPD)); $context = stream_context_create ($aHTTP); $contents = file_get_contents ($sURL، false، $context); echo $contents;

استفاده از fread برای ایجاد درخواست های POST

می توانید از تابع fread برای ایجاد درخواست های POST استفاده کنید. مثال زیر از stream_context_create برای نوشتن هدرهای درخواست HTTP ضروری استفاده می کند:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper که مورد استفاده قرار خواهد گرفت آرایه("method" => "POST", // Request Method // Header Request is under "header" => "Content" - نوع: application/x-www-form-urlencoded، "content" => $sPD)); $context = stream_context_create ($aHTTP); $handle = fopen($sURL، "r"، false، $context); $contents = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $contents;

ایجاد درخواست GET با PHP

اکنون بر روی استفاده از fread و file_get_contents برای دانلود محتوا از اینترنت از طریق HTTP و HTTPS تمرکز خواهیم کرد. برای استفاده از روش های توضیح داده شده در این مقاله، باید گزینه fopen wrappers را فعال کنید. برای این کار باید پارامتر allow_url_fopen را در فایل php.ini روی On قرار دهید.

انجام درخواست‌های POST و GET در PHP برای ورود به وب‌سایت‌ها، بازیابی محتوای صفحه وب یا بررسی نسخه‌های جدید برنامه‌ها استفاده می‌شود. ما نحوه ایجاد درخواست های HTTP ساده را توضیح خواهیم داد.

استفاده از fread برای دانلود یا دریافت فایل ها از طریق اینترنت

به یاد داشته باشید که خواندن صفحه وب به بخش قابل دسترسی بسته محدود می شود. بنابراین باید از تابع stream_get_contents استفاده کنید ( مشابه file_get_contents) یا یک حلقه while برای خواندن مطالب در تکه های کوچکتر تا رسیدن به انتهای فایل:

در این مورد از پردازش درخواست PHP POST، آخرین آرگومان تابع fread برابر با اندازه قطعه است. معمولاً نباید بیشتر از 8192 باشد ( 8*1024 ).

به خاطر داشته باشید که ممکن است بزرگتر یا کوچکتر باشد و همچنین ممکن است توسط تنظیمات سیستمی که PHP روی آن اجرا می شود محدود شود.

استفاده از file_get_contents برای دریافت URL سایت

استفاده از این روش هنگام خواندن یک فایل از طریق HTTP حتی ساده‌تر است، زیرا لازم نیست نگران خواندن تکه‌تکه باشید - همه چیز در PHP مدیریت می‌شود.

این نشریه ترجمه‌ای از مقاله ساخت درخواست‌های POST با PHP است که توسط تیم پروژه دوستانه تهیه شده است.

PHP در حال حاضر یکی از محبوب ترین زبان ها برای پیاده سازی برنامه های تحت وب است. این دوره به مطالعه مبانی آن اختصاص دارد. تاکید بر کاربرد عملی مهارت های اکتسابی است.

زبان PHP برای حل یک مشکل کاربردی خاص در اینترنت ایجاد شده است (که با خواندن اولین سخنرانی دوره می توان به آن پی برد). ما همچنین سعی خواهیم کرد که بیش از حد با استدلال نظری منحرف نشویم و در هر یک از سخنرانی ها سعی خواهیم کرد مشکل خاصی را حل کنیم. بیشتر نمونه ها از یک سیستم واقعی گرفته شده اند: موزه مجازی تاریخ علوم کامپیوتر. بخش اول این دوره به مطالعه مبانی نحو و ساختارهای کنترلی اختصاص دارد. پس از این، فناوری مشتری-سرور به عنوان منطقه کاربردی اصلی زبان PHP در نظر گرفته می شود. سپس به مطالعه مفیدترین توابع داخلی از نظر ما و حل مشکلات عملی با کمک آنها می پردازیم. اگرچه مدل شی در زبان پی‌اچ‌پی غنی‌ترین مدل نیست، اما حضور اساسی آن به شما اجازه می‌دهد تا به طور طبیعی مدل‌های داده شی را توصیف کنید. به عنوان یک مدل پایه، مدل سند موزه علوم کامپیوتر مجازی در نظر گرفته خواهد شد. پس از این، تعدادی از جنبه های کاربردی در نظر گرفته می شود: کار با سیستم فایل، با پایگاه داده، رشته ها، جلسات، DOM XML - همه اینها به ما امکان می دهد وظایف کلیدی استفاده عملی از زبان را در نظر بگیریم.

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

پروتکل HTTP و روش های انتقال داده به سرور

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

HTTP (پروتکل انتقال ابرمتن) یک پروتکل لایه کاربردی است که برای تبادل اطلاعات فرامتن در اینترنت طراحی شده است.

HTTP مجموعه ای از روش ها را برای تعیین هدف درخواست ارسال شده به سرور فراهم می کند. این روش ها بر اساس رشته مرجع هستند، جایی که یک شناسه منبع جهانی، یا به عنوان مکان یاب منبع جهانی (URL) یا یک نام منبع جهانی، برای نشان دادن منبعی که روش باید برای آن اعمال شود، استفاده می شود.

هنگام استفاده از پروتکل HTTP، پیام‌ها از طریق شبکه در قالبی مشابه فرمت پیام ایمیل اینترنتی (RFC-822) یا قالب پیام MIME (تبادل نامه اینترنتی چند منظوره) ارسال می‌شوند.

HTTP برای ارتباطات بین برنامه های کاربر مختلف و برنامه های دروازه ای استفاده می شود که دسترسی به پروتکل های اینترنتی موجود مانند SMTP (پروتکل ایمیل)، NNTP (پروتکل انتقال اخبار)، FTP (پروتکل انتقال فایل)، Gopher و WAIS را فراهم می کند. HTTP طوری طراحی شده است که به چنین دروازه هایی اجازه می دهد تا داده ها را از طریق سرورهای پروکسی بدون از دست دادن انتقال دهند.

پروتکل اصل درخواست/پاسخ را پیاده سازی می کند. برنامه درخواست کننده - مشتری تعامل با برنامه پاسخ دهنده - سرور را آغاز می کند و درخواستی حاوی:

روش دسترسی؛

آدرس URI؛

نسخه پروتکل؛

یک پیام (شبیه به شکل MIME) حاوی اطلاعاتی در مورد نوع داده های ارسال شده، اطلاعات مربوط به مشتری درخواست کننده و احتمالاً محتوای (بدنه) پیام.

پاسخ سرور شامل:

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

پیامی (به شکل MIME مانند) که شامل اطلاعات سرور، اطلاعات متا (یعنی اطلاعات مربوط به محتوای پیام) و بدنه پیام است.

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

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

فرم درخواست مشتری

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

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

<Простой-Запрос> := <Метод> <символ пробел>
<Запрашиваемый-URI> <символ новой строки>

این روش می تواند GET، POST، HEAD، PUT، DELETE و موارد دیگر باشد. کمی بعد در مورد رایج ترین آنها صحبت خواهیم کرد. URI درخواستی اغلب URL منبع است.

نمونه ای از یک درخواست ساده:

دریافت http://phpbook.info/

در اینجا GET روش دسترسی است، یعنی. روشی که باید بر روی منبع درخواستی اعمال شود و http://phpbook.info/ URL منبع درخواستی است.

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

<Полный запрос> := <Строка Состояния>
(<Общий заголовок>|<Заголовок запроса>|
<Заголовок содержания>)
<символ новой строки>
[<содержание запроса>]

براکت های مربع در اینجا عناصر هدر اختیاری را نشان می دهند و گزینه های جایگزین از طریق یک نوار عمودی فهرست می شوند. عنصر<Строка состояния>شامل روش درخواست و URI منبع (درست مانند یک درخواست ساده) و علاوه بر این، نسخه پروتکل HTTP مورد استفاده. به عنوان مثال، برای فراخوانی یک برنامه خارجی، می توانید از خط وضعیت زیر استفاده کنید:

ارسال http://phpbook.info/cgi-bin/test HTTP/1.0

در این مورد از روش POST و HTTP نسخه 1.0 استفاده می شود.

در هر دو شکل درخواست، URI منبع درخواستی نقش مهمی ایفا می کند. رایج ترین URI در قالب URL منبع استفاده می شود. هنگام دسترسی به سرور، می توانید هم از فرم کامل URL و هم از فرم ساده شده استفاده کنید.

فرم کامل شامل نوع پروتکل دسترسی، آدرس سرور منبع و آدرس منبع روی سرور است (شکل 4.2).

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


برنج. 4.2.فرم URL کامل

مواد و روش ها

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

تنوعی از روش GET وجود دارد - GET شرطی. این روش به سرور می گوید که تنها در صورتی باید به درخواست پاسخ داده شود که شرط موجود در قسمت if-Modified-Since سربرگ درخواست درست باشد. به طور خاص، اگر منبع از تاریخ مشخص شده در if-Modified-Since اصلاح شده باشد، بدنه منبع در پاسخ به درخواست ارسال می شود.

روش HEAD مشابه روش GET است، اما بدنه منبع را برمی‌گرداند و مشابه شرطی ندارد. روش HEAD برای به دست آوردن اطلاعات در مورد یک منبع استفاده می شود. این می تواند مفید باشد، برای مثال، هنگام حل مشکل آزمایش پیوندهای فرامتن.

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

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

استفاده از فرم های HTML برای ارسال داده ها به سرور

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

بیایید نحو فرم های HTML را درک کنیم. شاید خیلی ها با آن آشنا باشند، اما ما همچنان نکات اصلی را تکرار می کنیم زیرا مهم است.

بنابراین برای ایجاد فرم در HTML از تگ FORM استفاده می شود. داخل آن یک یا چند دستور INPUT وجود دارد. با استفاده از ویژگی های action و متد تگ FORM، نام برنامه ای که داده های فرم را پردازش می کند و روش درخواست را به ترتیب مشخص می کنید. دستور INPUT نوع و ویژگی های مختلف اطلاعات درخواستی را مشخص می کند. داده های فرم پس از فشار دادن دکمه ورودی از نوع ارسال ارسال می شود. بیایید یک فرم برای ثبت نام شرکت کنندگان در مدرسه برنامه نویسی مکاتبه ایجاد کنیم.

پس از پردازش توسط مرورگر، این فایل چیزی شبیه به این خواهد شد:


برنج. 4.3.نمونه فرم html

به این صورت است که فرم های HTML ایجاد می شوند و به نظر می رسند. ما فرض می کنیم که یاد گرفته ایم یا به یاد آورده ایم که چگونه آنها را ایجاد کنیم. همانطور که می بینیم می توانید روش انتقال اطلاعات را در فرم مشخص کنید. بیایید ببینیم اگر متد GET یا POST را مشخص کنید چه اتفاقی می‌افتد و چه تفاوتی خواهد داشت.

برای روش GET

هنگام ارسال داده‌های فرم با استفاده از روش GET، محتوای فرم پس از علامت سؤال به‌عنوان جفت‌های name=value به هم پیوسته با علامت و به نشانی اینترنتی اضافه می‌شود:

action?name1=value1&name2=value2&name3=value3

در اینجا اقدام، URL برنامه است که باید فرم را پردازش کند (یا برنامه مشخص شده در ویژگی عمل تگ فرم، یا اگر آن ویژگی حذف شود، خود برنامه فعلی). نام های name1، name2، name3 با نام عناصر فرم و value1، value2، value3 با مقادیر این عناصر مطابقت دارد. تمام کاراکترهای خاص، از جمله = و &، از نام یا مقادیر این پارامتر حذف خواهند شد. بنابراین، شما نباید از این نمادها و کاراکترهای سیریلیک در شناسه ها در نام یا مقادیر عناصر فرم استفاده کنید.

اگر یک کاراکتر سرویس را در فیلد ورودی وارد کنید، در کد هگزادسیمال آن ارسال می شود، به عنوان مثال، نماد $ با %24 جایگزین می شود. حروف روسی نیز به همین روش منتقل می شود.

برای فیلدهای ورودی متن و رمز عبور (اینها عناصر ورودی با ویژگی type=text و type=password هستند)، مقدار هر چیزی خواهد بود که کاربر وارد کند. اگر کاربر چیزی را در چنین فیلدی وارد نکند، عنصر name= در رشته query وجود خواهد داشت، جایی که نام با نام این عنصر فرم مطابقت دارد.

برای چک باکس و دکمه‌های رادیویی، وقتی دکمه علامت زده می‌شود، مقدار با ویژگی VALUE تعیین می‌شود. هنگام نوشتن رشته پرس و جو، دکمه های بدون علامت به طور کامل نادیده گرفته می شوند. در صورت لزوم، چند دکمه چک باکس می‌توانند ویژگی NAME یکسان (و VALUE‌های متفاوت) داشته باشند. دکمه های نوع دکمه رادیویی برای یکی از همه گزینه های ارائه شده در نظر گرفته شده اند و بنابراین باید ویژگی NAME یکسان و ویژگی های VALUE متفاوت داشته باشند.

در اصل برای انتقال داده ها با استفاده از روش GET نیازی به ایجاد فرم HTML نیست. شما به سادگی می توانید متغیرهای مورد نظر و مقادیر آنها را به رشته URL اضافه کنید.

http://phpbook.info/test.php?id=10&user=pit

در این راستا، انتقال داده ها با استفاده از روش GET دارای یک اشکال قابل توجه است - هر کسی می تواند مقادیر پارامتر را جعل کند. بنابراین، استفاده از این روش را برای دسترسی به صفحات محافظت شده با رمز عبور یا انتقال اطلاعاتی که بر امنیت برنامه یا سرور تأثیر می گذارد، توصیه نمی کنیم. علاوه بر این، برای انتقال اطلاعاتی که کاربر مجاز به تغییر آنها نیست، از روش GET استفاده نکنید.

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

برای روش 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["first_name"]."
".$_REQUEST["last_name"]."!
";
$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 ["first_name"]."
".$_POST ["last_name"] ."!
";
$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() بدست آورید. مقدار متغیر محیطی را که نام آن به عنوان پارامتر به آن ارسال می شود، برمی گرداند.

getenv("REQUEST_METHOD");
// روش استفاده شده را برمی گرداند
echo getenv("REMOTE_ADDR");
// آدرس IP کاربر را نمایش می دهد،
// چه کسی درخواست را ارسال کرد
?>

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

getenv("QUERY_STRING");

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

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

getenv("HTTP_REFERER");

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

نمونه ای از پردازش درخواست با استفاده از PHP

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

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

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

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

توجه! درس منسوخ شده است. درس های جدید در مورد این موضوع در دوره PHP برای مبتدیان موجود است.

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

انتقال اطلاعات با استفاده از زبان PHP

این بخش اطلاعات اولیه در مورد نحوه انتقال داده ها بین صفحات وب را ارائه می دهد. برخی از این اطلاعات منحصراً به فناوری PHP مربوط نمی شود، بلکه تعامل ابزارهای PHP و HTML را توصیف می کند یا به خود پروتکل HTTP مربوط می شود.

عدم پشتیبانی دولت در پروتکل HTTP

مهمترین ویژگی هر فناوری وب که همیشه باید در نظر داشت این است که خود پروتکل HTTP بدون حالت است. این به این معنی است که هر درخواست HTTP (که در بیشتر موارد معادل درخواست دریافت و تحویل یک منبع واحد است، مانند یک صفحه HTML، یک فایل jpg.، یک صفحه سبک و غیره) مستقل از سایر درخواست‌ها نیست. شامل هر گونه اطلاعاتی در مورد شناسایی مشتری باشد و ردی در حافظه کامپیوتر باقی نمی گذارد.

حتی اگر سایت به گونه ای طراحی شده باشد که ناوبری، i.e. انتقال از یک صفحه به صفحه دیگر دقیقاً در یک جهت اتفاق می افتد (مثلاً صفحه 1 فقط به صفحه 2 منتهی می شود، که فقط به صفحه 3 منتهی می شود و غیره)، ابزارهای پشتیبانی پروتکل HTTP اطلاعاتی ندارند و در نظر نمی گیرند که یک کاربر مشاهده صفحه 2 باید قبلاً از صفحه 1 بازدید کرده باشد. از کد HTML می توان برای نمایش یک فرم استفاده کرد و حتی می توان از این کد برای وارد کردن اطلاعات استفاده کرد، اما مگر اینکه از ابزار اضافی برای انتقال اطلاعات وارد شده به صفحه یا برنامه دیگری استفاده شود، مقدار اختصاص داده شده به متغیر به سادگی پس از جابجایی ناپدید می شود. به صفحه دیگر

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

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

پارامترهای GET

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

در زیر نمونه ای از فرم HTML است که از روش GET استفاده می کند (این نشانه گذاری را تایپ کنید و فایل را به عنوان sportselect.html ذخیره کنید):

مبانی پی اچ پی

ورزش مورد علاقه خود را انتخاب کنید

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

  • URL در نقل قول بعد از کلمه action (http://localhost/sports.php).
  • علامت سوال (?) که نشان می دهد کاراکترهای زیر یک رشته GET را تشکیل می دهند.
  • متغیر نام، علامت مساوی (=) و پارامتر مقدار مربوطه (value=Hockey).
  • علامت علامت (&) به دنبال جفت نام=مقدار (در صورت وجود).

بنابراین مرورگر رشته URL زیر را ایجاد می کند:
http://localhost/sports.php?sport=هاکی

سپس مرورگر رشته URL حاصل را در فضای آدرس خود به عنوان یک درخواست جدید هدایت می کند. اسکریپت PHP زیر (sports.php)، که فرم به آن ارسال شده است، مقادیر متغیر GET را از آخرین قسمت رشته پرس و جو واکشی می کند، آن متغیرها و مقادیر متغیر را در آرایه superglobal $_GET وارد می کند. به زودی توضیح داده شد)، و برخی از اقدامات لازم را با این مقادیر انجام می دهد. در این مورد، درج در یک رشته متن رخ می دهد.

در زیر یک نمونه کد وجود دارد که کنترل کننده فرم PHP را برای فرم HTML بالا نشان می دهد:

ورزش مورد علاقه

ورزش مورد علاقه شماست

توجه داشته باشید که مقدار وارد شده در فیلد فرم HTML با ویژگی name="sport" در صفحه قبل اکنون به عنوان یک متغیر PHP با نام $_GET["sport"] در دسترس است. شکل زیر نحوه عملکرد این مثال را نشان می دهد:

اکنون باید توضیح دهیم که چگونه می توانید به مقادیر ارسال شده از صفحه به صفحه دیگر دسترسی داشته باشید. این مقاله دو روش اصلی ارسال مقادیر مورد استفاده در فرم ها - GET و POST را مورد بحث قرار می دهد. هر روش دارای یک آرایه سوپرگلوبال مرتبط با خود است. آرایه های سوپرگلوبال در مقاله «متغیرها و ثابت ها» با جزئیات بیشتر توضیح داده شده اند. یکی از ویژگی های متمایز آرایه های سوپرگلوبال از آرایه های دیگر وجود پیشوندی در نام به شکل زیرخط است.

پردازشگر فرم با دسترسی به آرایه $_GET به هر عنصر ارسال شده با استفاده از متد GET و با دسترسی به آرایه $_POST به هر عنصر ارسال شده با استفاده از روش POST دسترسی پیدا می کند. ساختار نحوی مورد استفاده برای دسترسی به هر عنصر آرایه ابرجهانی ساده و کاملاً یکنواخت است:

$_array_name["index_name"]

در اینجا، index_name قسمت نام جفت نام-مقدار (برای روش GET)، یا نام فیلد فرم HTML (برای روش POST) است. به دنبال مثال قبلی، $_GET["sport"] مقدار عنصر انتخابی فرم به نام "sport" را مشخص می کند. این مقدار با استفاده از عملیات GET انجام شده بر روی فایل اصلی ارسال شد. کنترل کننده فرم باید از آرایه ای مطابق با روش ارسال داده استفاده کند. به طور خاص، در این مثال، مقدار $_POST["sport"] تعریف نشده است زیرا فرم اصلی هیچ داده ای را با استفاده از روش POST ارسال نکرده است.

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

فقط به این دلیل که عملکرد مورد نظر را می توان با استفاده از پارامترهای GET به دست آورد، به این معنی نیست که باید از روش GET استفاده شود. معایب روش GET که در اکثر انواع پردازش فرم یافت می شود بسیار قابل توجه است. مشخصات کاری اصلی HTML 4.0 که در سال 1997 منتشر شد، این روش را توصیه نمی کرد. معایب اصلی روش GET در زیر ذکر شده است:

  • روش GET برای ایجاد پنجره های ثبت نام کاربرد ندارد، زیرا نام کاربری و رمز عبور کاملاً روی صفحه نمایش قابل مشاهده است و همچنین ممکن است این داده ها به عنوان اطلاعات مربوط به صفحه بازدید شده در حافظه مرورگر مشتری ذخیره شود.
  • هر عملیات انتقال GET، از جمله خود مجموعه داده، در وب سرور ثبت می شود.
  • روش GET داده ها را به یک متغیر محیط سرور اختصاص می دهد، بنابراین طول URL محدود است. ممکن است دیده باشید که URL های بسیار طولانی هنگام ارسال با استفاده از روش GET چگونه به نظر می رسند، و در واقع، بعید است که کسی بخواهد یک متن 300 کلمه ای از متن HTML را با استفاده از این روش ارسال کند.

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

پارامترهای POST

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

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

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

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

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

برای تغییر نحوه انتقال داده ها در مثال قبلی، باید تغییرات زیر را اعمال کنید:

...

کار با چندین ارزش

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

"metod="post">
حیوانات خانگی مورد علاقه خود را انتخاب کنید

حیوانات انتخاب شده: "; foreach ($animal به عنوان $a) (echo" ".htmlentities($a).""; } } ?>

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

در handler، آرایه در متغیر $animal ذخیره می شود و با استفاده از یک حلقه foreach، مانند یک آرایه معمولی، شمارش می شود.

اعتبار سنجی فرم و قالب بندی متغیرهای فرم

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

برای کاربران راحت تر است که در سمت کلاینت با استفاده از جاوا اسکریپت بررسی کنند، اما صرف نظر از اینکه آیا این بررسی استفاده می شود، تأیید سمت سرور باید انجام شود.

نکته دیگری که هنگام ایجاد فرم های HTML باید در نظر گرفت این است که اگر فرم نیاز به نمایش ورودی از پیش پر شده دارد، باید ویژگی value تنظیم شود. این نکته به ویژه در مورد دو نوع فرم صادق است - آنهایی که برای ویرایش داده های دریافتی از یک پایگاه داده استفاده می شوند و آنهایی که برای ارسال احتمالاً بیش از یک بار طراحی شده اند. مورد دوم در شرایطی که پس از شناسایی خطا در داده‌هایی که از قبل پر شده‌اند، فرم باید دوباره نمایش داده شود، بسیار رایج است. به عنوان مثال فرم ثبت نامی است که تا زمانی که کاربر یک آدرس ایمیل معتبر یا سایر داده های مورد نیاز را ارائه ندهد، داده ها را برای پردازش نمی پذیرد.

مثال زیر نحوه پردازش یک فرم، از جمله اعتبارسنجی سمت سرور و پردازش در همان صفحه فرم را نشان می دهد:

مبانی پی اچ پی

"metod="post">
اطلاعات تماس "کلاس ="">
"کلاس ="">

این مثال از تابع filter_var() استفاده می کند که یک متغیر را با استفاده از یک فیلتر آزمایش می کند و دو پارامتر را می گیرد - یک رشته منبع و یک ثابت که نوع فیلتر را نشان می دهد. این تابع علاوه بر اعتبارسنجی آدرس‌های ایمیل (FILTER_VALIDATE_EMAIL)، از ثابت‌های زیر پشتیبانی می‌کند: FILTER_VALIDATE_URL - مقدار صحت URL را بررسی می‌کند (به عنوان مثال)، FILTER_VALIDATE_IP - مقدار صحت آدرس‌های IP را بررسی می‌کند، FILTER_VALIDATE_REGEXP را بررسی می‌کند. برای درستی نحو عبارت منظم و چندین ثابت دیگر، که جایگزین توابع is_bool()، is_float()، is_int() و غیره هستند.

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

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

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

روش GET:

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

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

روش POST:

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

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

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

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

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

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

Http://site/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 (به مثال بالا مراجعه کنید). فشار دادن یک دکمه ارسالفرم را با تمام مقادیر وارد شده به سرور ارسال می کند.