متغیر$_POST و $_GET در php

  • آپدیت شده در تاریخ

متغیر$_POST و $_GET

متغیر$_POST و $_GET در php بخشی از متغیرهای سراسری هستند و در همه جای اسکریپت می توانید از آنها استفاده کنید ، هر دو متغیر $_POST و $_GET داده های ارسال شده توسط متدهای post و get از html را دریافت می کنند.

در مثال زیر میبینید که چطوری از این ها برای جمعاوری داده های ارسال شده از فرم html استفاده می کنیم

 

جمعاوری داده از فرم html

صفحه html زیر شامل یک فرم با عناصر ورودی مثل متن ، چند انتخابی ، یک انتخابی ، دکمه است . زمانی که کاربر این فیلد ها را تکمیل می کند و دکمه ارسال یا همان submit را میزند ، داده ها به صفحه grab_values.php ارسال می شود ، همان آدرسی که در قسمت action فرم تعریف شده است.

عکس زیر یک فرم ساده html  با متد post را نشان میدهد . عکس بعدی نتیجه ارسال و دریافت داده های ورودی کاربر توسط php را نمایش می دهد.

 

متد get در html

در فرم html زیر ما در قسمت method ، روش ارسال دیتا به سرور را مشخص می کنیم.

 

توسط php ، ما فقط با استفاده از آرایه گلوبال یا همان سراسری $_GET مقادیر ورودی را دریافت و چاپ می کنیم.

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

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

از جمله ویژگی های متد GET می توان به موارد زیر اشاره کرد:

  • درخواست هایی از جنس GET قابلیت Cache شدن دارند.
  • درخواست هایی از جنس GET در تاریخچه ی مرورگر کاربر باقی می مانند.
  • درخواست هایی از جنس GET را می توان Bookmark کرد.
  • درخواست هایی از جنس GET را هرگز نمی بایست برای داده های حساس مثل اطلاعات حساب کاربری مورد استفاده قرار داد.
  • درخواست هایی از جنس GET از لحاظ حجم داده ها دارای محدودیت هستند. حداکثر کاراکتری که از طریق یو آر ال می توان ارسال کرد، چیزی در حدود ۲۰۴۸ کاراکتر است.
  • درخواست هایی از جنس GET بهتر است که بیشتر برای دریافت اطلاعات مورد استفاده قرار گیرند.
  • درخواست هایی از جنس GET دارای امنیت پایینی هستند چرا که داده ها به عنوان بخشی از یو آر ال ارسال می شوند.
  • از متد GET هرگز نمی توان برای داده های باینری مثل تصاویر و … استفاده نمود.

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

 

متد POST در html

حجم بالایی از دیتا از طریق متد POST قابل ارسال است. از HTML 4.0 به بعد همچنین قابلیت ارسال multipart/form-data اضافه شد. متد post امن تر از Get است بدلیل اینکه مقادیر ورودی از طریق url قابل مشاهده نیستند و همچنین در تاریخچه (history) مرورگر ذخیره نمی شود.

برای استفاده از متد post کافیست که مقدار method را به POST تغییر بدید:

توسط php ، ما فقط با استفاده از آرایه گلوبال یا همان سراسری $_POST مقادیر ورودی را دریافت و چاپ می کنیم.

مزیت های استفاده از متد POST:

  • درخواست هایی از جنس POST هرگز Cache نمی شوند.
  • درخواست هایی از جنس POST در تاریخچه ی مرورگر باقی نخواهند ماند
  • درخواست هایی از جنس POST قابلیت Bookmark شدن ندارند.
  • هیچ گونه محدودیتی در ارتباط با میزان داده هایی که از طریق متد POST می توان به سمت سرور فرستاد وجود ندارد.
  • از متد POST می توان برای انتقال داده های باینری مثل تصاویر و … استفاده نمود.

 

مدیریت خطا (Error Handling) :

همیشه زمانی که در حال دریافت اطلاعات از متد POST/GET هستیم باید مراقب باشیم ، چونکه اگر کاربریه مقدار خالی را ارسال کند ،

اسکریپت PHP بالا یک خطایی را نشان می دهد. برای جلوگیری از نمایش اینگونه خطاهای غیرضروری می توانیم از توابع کنترلی مثل isset() استفاده کنیم . این تابع در صورتی که متغییر وحود داشته باشد مقدار TRUE را برمیگرداند.

خب اجازه بدید یک خطای دوستانه برای به جای خطای خود PHP نشان بدهیم .خب برای مدیریت خطا فایل grab_values.php را ویرایش می کنیم :

مثال بالا ساده ترین راه برای مدیریت خطا است اما راه های بهتری مثل تابع exit وحود دارد . امیدوارم این مقاله به شما در درک و یادگیری متغیر$_POST و $_GET و مدیریت خطا کمک کرده باشد .

امنیت ورودی های کاربر

به هیچ وجه ورودی های خام که از کاربر دریافت می کنید را در برنامه خود استفاده نکنید و یا اگر این ورودی ها را مستقیم در کویری SQL استفاده می کنید , احتمال لو رفتن تمام اطلاعات دیتابیس و یا هک شدن کل سایت شما بسیار بالاست . برای همین ورودی های کاربر را قبل از استفاده در کویری ها و ذخیره در دیتابیس , با توابعی که مربوط به امنیت فرم ها است و در مقاله اعتبار سنجی فرم ها در php آوردیم , بهره ببرید.

هر سوال یا مشکلی وجود داشت لطفا در نظرات این نوشته ارسال کنید . سریعا پاسخگوی سوالات شما هستیم .

مرسی . موفق و پیروز باشید

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۲۱)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. محمود رنجبر ۱۹ آذر ۱۴۰۱

    سلام استاد شفیعی گل
    من تو فرم با متد get مقدار value قیمت و کارکرد و … رو از url گرفتم و قرار دادم و مشکل کلا حل شد حالا هم فیلتر های قبلی میمونه و هم فیلتر مثلا price جایگزین price قبلی میشه
    سپاس از راهنمایی هاتون

    پاسخ
  2. محمود رنجبر ۱۸ آذر ۱۴۰۱

    مهندس شفیعی ممنون از راهنمایی تون من وقتی که url قبلی رو با جدید ترکیب کردم یه حالتی پیش میاد مثلا تو url قبلی فیلتر قیمت price وجود داره تو url جدید هم کاربر قیمت رو انتخاب میکنه دو تا price هست چیکار کنم که دومی جایگزین اولی بشه از چه تابعی یا روشی استفاده کنم ؟
    ممنون از راهنمایی تون موفق باشید

    پاسخ
    1. حسن شفیعی ۱۹ آذر ۱۴۰۱

      با این کد میتونید پارامترهای url رو بگیرید ببینید چیا داره اگه از قبل وجود داشت مقدار جدید رو جایگزین می کنید و اگه وجود نداشت پارامتر جدید میزارید. این موارد تماما با جاواسکریپت انجام میشه
      const queryString = window.location.search;
      const urlParams = new URLSearchParams(queryString);
      const price = urlParams.get(‘price’)
      console.log(price);

      مقدار قیمت و داخل کنسول مرورگر برگشت میده

      پاسخ
  3. محمود رنجبر ۱۸ آذر ۱۴۰۱

    سلام استاد شفیعی خداقوت
    من برای فیلتر کردن آگهی خودرو از متد get استفاده کردم و اطلاعات رو از url میگیرم و کاربر میتونه بر اساس کارکرد یا قیمت و … فیلتر کنه
    وقتی بر اساس مثلا قیمت فیلتر میکنه و آگهی نشون داده میشه دوباره وقتی میخواد بر اساس کارکرد هم فیلتر کنه با ارسال فرم فیلتر قیمت از بین میره
    من میخوام هر بار که فیلتر میکنه فیلتر قبلی هم حفظ بشه میشه راهنمایی کنید برای این موضوع چیکار کنم ؟
    مثل وبسایت دیوار منظورمه

    پاسخ
    1. حسن شفیعی ۱۸ آذر ۱۴۰۱

      سلام. ممنون
      وقتی فیلتر میشه و url تغییر میکنه اون url رو توی فرم action قرار بدید یا اینکه داخل کوکی ذخیره کنید این کار رو با جاواسکریپت باید انجام بدید

      پاسخ
  4. Dude ۱۱ اردیبهشت ۱۴۰۱

    سلام
    اگه کلا از متد POST استفاده کنیم و از GET استفاده نکنیم مشکلی پیش نمی آید؟

    پاسخ
    1. حسن شفیعی ۱۱ اردیبهشت ۱۴۰۱

      سلام. خیلی هم خوبه و اصلا مشکلی نداره

      پاسخ
  5. فرشاد ۱۱ فروردین ۱۴۰۰

    مفید بود

    پاسخ
    1. حسن شفیعی ۱۱ فروردین ۱۴۰۰

      خوشحالیم که مفید واقع شده.
      موفق باشید.

      پاسخ
  6. s-rezaie ۱۵ آبان ۱۳۹۸

    سلام خسته نباشید . من وقتی داخل فایل php از متد post برای دریافت اطلاعات از سمت کلاینت استفاده میکنم ، از postman متغیر ها رو براش با متد post میفرستم ولی با post متغیر ها رو خالی دریافت میکنه درحالی که اگر همونو با get بنویسم درست دریافتش میکنه نمیدونم مشکلش کاست؟ممنون میشم اگه راهنمایی لازم رو بکنید.

    پاسخ
    1. حسن شفیعی ۱۵ آبان ۱۳۹۸

      سلام. ممنون.
      مطمین باشید که آرایه گلوبال مناسب رو در کد php خود فراخوانی می کنید که برای post همان $_POST است که البته میتونید از $_REQUEST هم استفاده کنید. پس بهتر است این متغییر ها رو یکبار var_dump کنید تا ببینید چه داده ای داخل آنها قرار گرفته شده.
      البته ممکن است مشکل از ست کردن شما در postman باشه میتونید داخل یک فرم که نحوه ساخت آن را می دونید (تگ form و خصوصیت method=post) این کار رو دستی بدون postman انجام بدید تا مطمین شوید
      موفق باشید.

      پاسخ
  7. zeinab ۵ مهر ۱۳۹۸

    سلام اگه بخوام یه input داشته باشم از نوع تکست که چیزی که کاربر مینویسه زیرش نمایش داده بشه .و بعد دوباره تو همون input چیزدیگری نوشت نمایش تکست قبلی پاک نشه و زیر هم نشون داده بشه چیکار کنم؟

    پاسخ
    1. حسن شفیعی ۵ مهر ۱۳۹۸

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

      پاسخ
  8. محمد جواد ۱۸ بهمن ۱۳۹۷

    ممنون از پاسخ کاملتون . این جوری که من مطالعه کردم کاربر میتونه از طریق مرورگر هدر referrer رو غیر فعال کنه . به نظرتون اینکه یک توکن برای هر فرم ساخته بشه میتونه امنیت رو کاملا تامین کنه ؟

    پاسخ
    1. حسن شفیعی ۱۸ بهمن ۱۳۹۷

      خواهش می کنم. بله مبحث csrf هم مبتنی بر اختصاص دادن یک کلید اختصاصی یا همان توکن است که بسیار میتونه جلوی این حملات رو بگیره.

      پاسخ
  9. محمد جواد ۱۶ بهمن ۱۳۹۷

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

    پاسخ
    1. حسن شفیعی ۱۷ بهمن ۱۳۹۷

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

      پاسخ
  10. زهره ۱۹ آبان ۱۳۹۶

    ببخشید سوالی داشتم از خدمتتون موقعی که مقدار ارسال شده به url رو با $_GET میگیریم برای امنیتش چه کدی باید استفاده کنیم؟

    پاسخ
    1. حسن شفیعی ۲۰ آبان ۱۳۹۶

      برای امنیت باید هنگام دریافت اون از طریق آرایه های $_GET یا $_POST با توابعی مثل strip_tags یا htmlspecialchars و یا اگر فقط قصد دریافت مقدار عددی دارید با تابع intval موارد اضافی رو پاک کنید . همچنین استفاده از تابع filter_var بسیار در این مورد مفید هستش.

      در مورد امنیت فرم ها و ورودی های کاربر که از طریق url یا متد POST ارسال میشود در این مقاله به طور کامل به این موضوع پرداختیم

      اعتبارسنجی فرم ها در php

      موفق و پیروز باشید

      پاسخ
      1. زهره ۲۰ آبان ۱۳۹۶

        ممنون از پاسختون

        پاسخ
      2. حسن شفیعی ۲۰ آبان ۱۳۹۶

        خواهش می کنم . موفق باشید

        پاسخ
دوره های آموزشی