در برنامهنویسیهای تحت وب، کاربران و دادههای آنها بسیار مهم هستند. با روشهای ارسال داده در PHP میتوانیم اطلاعات مختلفی که از طریق فرمها در صفحه وب از کاربر گرفتهایم را برای برنامه PHP بفرستیم. متد POST و متد GET اصلیترین روشهای ارسال اطلاعات هستند. در این آموزش کار با آنها را یاد میگیریم.
در برنامهنویسی PHP با دادههای مختلفی سر و کار داریم. یکی از اصلیترین دادهها، اطلاعاتی است که از کاربر میگیریم. اکثراً این اطلاعات از طریق فرمهای HTML که در طراحی وب ایجادشان کردیم برای ما (سرور ما) ارسال میشود.
فرض کنید یک فرم داریم که به واسطه آن نام و شماره موبایل کاربر را دریافت میکنم. میخواهیم پس از دریافت اطلاعات از کاربر، پیغام تشکر به او نشان دهیم. در حالت کلی برای ارسال داده در PHP دو روش داریم:
- ارسال POST
- ارسال GET
فرم مورد نظر ما دو فیلد به نامهای name و mobile دارد. کد زیر یک فرم ساده را ایجاد میکند.
<html>
<body style="direction:rtl">
<form action="" method="">
نام: <input type="text" name="name">
موبایل: <input type="text" name="mobile">
</form>
</body>
</html>
دو فایل برای این کار ایجاد میکنیم.
- فایل
index.php
که حاوی کدهای فرم ثبتنام است. - فایل
register.php
که حاوی کدهای پردازش دادههای ارسالشده و نمایش پیام تشکر خواهد بود.
کد بالا را در فایل index.php
قرار داده و آن را در مرورگر خود باز میکنم. تصویر زیر، نمایش فرم ثبتنام ماست.
همانطور که میبینید در تگ form دو ویژگی action و method تعریف شده است.
- ویژگی action مقصد ارسال دادهها را مشخص میکند. این آدرس میتواند به صورت نسبی با یک آدرس کامل اینترنتی باشد. در این مثال، ما اطلاعات را به فایل
register.php
در کنار فایل اصلی خواهیم فرستادم. - همانطور که از نام ویژگی method (روش) پیداست، روش ارسال دادهها (post و get در php) را مشخص میکنیم.
فهرست محتوای آموزش
متد POST
اولین روش برای ارسال دادهها در PHP استفاده از روش POST است. در این حالت تمام دادهها از طریق هدرهای HTTP (یا همان HTTP Requests) برای مقصد ارسال میشود.
از نظر کاربری که وارد سایت شده و دانشی در مورد برنامهنویسی وب ندارد، اطلاعات به صورت مخفی و بدون اطلاع او ارسال خواهد شد.
در صفحه مقصد، اطلاعات ارسال شده در متغیر سراسری $_POST
قرار خواهد گرفت. این متغیر یک نوع آرایه در PHP بوده که به صورت انجمنی (Associative) است.
اکشن و متد را مشابه کد زیر تعریف میکنم:
<html>
<body style="direction:rtl">
<form action="register.php" method="post">
نام: <input type="text" name="name">
موبایل: <input type="text" name="mobile">
</form>
</body>
</html>
برای دسترسی به دادههای ارسال شده از طریق این فرم در صفحه register.php
از $_POST['name']
و $_POST['mobile']
استفاده میکنیم.
احتمالاً تا به اینجا حدس زدهاید که برای نمایش نام و پیغام تشکر باید به چه صورت عمل کنیم! کد زیر پیغام تبریک را به کاربر نمایش میدهد.
<html>
<body style="direction:rtl">
<?php
echo $_POST['name'] . " عزیز،" . " از ثبتنام شما متشکریم!";
?>
</body>
</html>
در این قطعه کد و با استفاده از متغیر $_POST['name']
توانستیم نام کاربر را در متن پیام نمایش دهیم.
برای ثبت شماره موبایل یا نام کاربر در پایگاه داده، میتوانید از روشهای اتصال به دیتابیس نظیر MySQLi در PHP یا PDO در PHP استفاده کنید.
با استفاده از روش POST در PHP میتوانید هر نوع دادهای ارسال کنید. فقط کافی است مقدار ویژگی method فرم خود را برابر post قرار دهید.
امنیت اطلاعات فرستاده شده با متد POST وابسته به امینت ارتباط HTTP است. یعنی اگر برای سایت خود از HTTPS استفاده کنیم، اطلاعات ارسال شده به صورت رمزنگاریشده و ایمن ارسال خواهد شد.
متد GET
روش دیگر ارسال داده در PHP متد GET است. در این روش تمام دادههای ارسالی، به صورت پارامتری در URL به مقصد فرستاده میشود.
برای استفاده از این روش کافی است مقدار method در فرم ثبتنام را به get تغییر دهیم.
<html>
<body style="direction:rtl">
<form action="register.php" method="get">
نام: <input type="text" name="name">
موبایل: <input type="text" name="mobile">
<input type="submit" value="ثبتنام">
</form>
</body>
</html>
برای دسترسی به دادههای ارسالی در مقصد از متغیر سراسری $_GET
استفاده میکنیم. (بیشتر بدانید: متغیرهای سراسری PHP)
بنابراین برای دسترسی به مقادیر نام و شماره موبایل کاربر در این مثال، از متغیرهای $_GET['name']
و $_GET['mobile']
استفاده میکنم.
<html>
<body style="direction:rtl">
<?php
echo $_GET['name'] . " عزیز،" . " از ثبتنام شما متشکریم!";
?>
</body>
</html>
پس از تکمیل و ارسال فرم با روش GET، صفحه ثبتنام و پیغام خوشآمد گویی ظاهر خواهد شد.
اگر در تصویر بالا و آدرس صفحه دقت کنید، اطلاعاتی که در فرم وارد کرده بودم به صورت پارامتر در آدرس URL نمایش داده شدهاند.
نحوه عملکرد روش get
در حقیقت اگر سه مقدار مختلف را به روش get به آدرسی ارسال کنیم، چیزی شبیه زیر در نتیجه خواهیم داشت.
https://sabzdanesh.com/sample.php?name1=value1&name2=value2&name3=value3
در انتهای آدرس مقصد (در این آدرس فایل sample.php
) علامت سوال (?) آورده شده و پس از آن تک تک متغیرها به همراه مقادیرشان قرار گرفتهاند.
هر متغیر با علامت «و» انگلیسی (&) از متغیر دیگر جدا و با علامت مساوی (=) با مقدار خود مرتبط میشود.
همانطور که میبینید در روش GET تمام دادهها (نام متغیر و مقدار آن) به صورت واضح به کاربر نمایش داده میشود. بنابراین اگر این اطلاعات برای شما مهم هستند، استفاده از روش GET در PHP چندان منطقی به نظر نرسد!
تفاوت POST و GET در PHP
احتمالاً برای شما هم سوال شده که تا وقتی که متد POST هست چرا باید از متد GET استفاده کنیم ؟!
جواب این سوال از نظر فنی کمی پیچیده اما بیان آن بسیار ساده است! متناسب با نیازتان میتوانید از هر دو روش استفاده کنید!
ویژگیهای روش GET
- اطلاعات به راحتی در URL قابل مشاهده هستند. واضح است که اگر کسی شبکهی ارتباط کاربر با سایت را شنود کنید، میتوانید به راحتی به این اطلاعات دست پیدا کند. در نتیجه امنیت کمتری دارد.
- ارسال داده با متد GET سرعت بیشتری نسبت به روش POST دارد. بنابراین اگر در جایی صرفاً میخواهید یک دادهی کمارزش و کوچک را ارسال کنید، احتمالاً GET روش مناسبتری خواهد بود.
- در روش GET به دلیل اینکه باید دادهها را در URL ارسال کنید، با محدودیت ارسال اطلاعات مواجه خواهید شد. (محدودیت ارسال 2048 کاراکتر)
- امکان ارسال فایل با این روش وجود ندارد.
ویژگیهای POST
- همانطور که گفته شد، اطلاعات از طریق سربرگهای درخواست HTTP ارسال میشود. پس به راحتی توسط کاربر قابل مشاهده نیست. (البته اگر فرد مانند شما یک حرفهای باشد میتواند با بررسی HTTP Headerها، آنها را مشاهده کند.)
- ارسال داده با متد POST یک مقدار سرعت کمتری نسبت به روش GET دارد. دلیل آن هم تبدیل دادهها به هِدِر درخواستها و بازگشایی آنهاست.
- از آنجا که سربرگهای HTTP جزء دادههای مهم هستند، اگر ارتباط سایت شما HTTPS باشد، این دادهها کدگذاری شده و توسط مهاجم (با شنود) قابل تشخیص نخواهد بود.
- در ارسال اطلاعات با روش POST هیچ محدودیتی در حجم یا تعداد دادههای ارسالی نخواهید داشت.
- با متد POST میتوان دادههای باینری (نظیر عکس یا انواع فایل) را ارسال کرد. (مشابه آموزش آپلود فایل با PHP)
همانطور که میدانید میتوانیم کدهای فرم ثبتنام و کدهای PHP که آنها را اعتبارسنجی کرده و پیام تشکر را نمایش میدهد را در یک فایل قرار داده و مقدار action فرم را تعریف نکرده یا / بگذاریم. (برای دیدن مثالی از این روش، به کدهای این سایت خارجی توجه کنید.)
جمعبندی: متد POST و GET در PHP
در این آموزش روشهای POST و GET برای ارسال داده در PHP را بررسی کردیم. با تعریف ویژگی method برای فرم HTML میتوانیم نوع آن را یکی از این دو حالت تنظیم کنیم.
دادههای ارسالی در صفحه مقصد درون یک آرایه انجمنی قرار میگیرند. متغیر این آرایه برای متد GET با $_GET
و برای متد POST با $_POST
شناخته میشود.
در متد get متغیر و مقدار آن درون URL قرار گرفته و قابل مشاهده است. اما در متد post، متغیرها و دادهها به صورت HTTP Header ارسال شده و از امنیت بیشتر (و شاید ظاهر بهتری) برخوردار خواهد بود.
بررسی ارسال فرم یا وجود POST و GET در PHP
متغیرهایی که برای دسترسی به دادههای ارسالی استفاده میشوند یک آرایه هستند. با بررسی وجود اندیس مورد نظر در آن، میتوانیم از وجود آن داده در دیتاهای ارسالی مطمئن شویم.
فرض کنید در مثال خودمان، کاربر فیلد «نام را تکمیل نکند» در این صورت با خطایی مشابه زیر برخورد خواهیم کرد.
برای جلوگیری از این مشکل، ابتدا وجود مقدار در متغیر name را با تابع empty()
بررسی میکنیم؛ اگر خالی بود، به کاربر خطا نشان داده و در غیر این صورت پیام تشکر را نمایش میدهیم.
<html>
<body style="direction:rtl">
<?php
if( !empty($_POST['name']) ){
echo $_POST['name'] . " عزیز،" . " از ثبتنام شما متشکریم!";
}else{
echo "باید نام خود را وارد کنید.";
}
?>
</body>
</html>
امیدوارم در این آموزش با نحوه استفاده و کاربردهای POST و GET در PHP به خوبی آشنا شده باشید. اگر سؤال یا تجربهای دارید، از قسمت دیدگاهها مطرح کنید.
در جلسه بعدی، یک مثال ساده اما کاربردی، از روش POST میبینیم. بعد از اینکه کار با دیتابیس را یاد گرفتیم، چند فرم PHP ایجاد میکنیم تا همه این روشها را در عمل استفاده کنیم.
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
بابا دمتون گرم
سلام میخواستم ببینم چه زمانی میشه request http رو با متد GET ارسال کنیم که body داشته باشه؟
سلام
منظورتون از طریق فرمهای html توی php هست یا با یه ربات میخواید درخواستی رو به یه سایت بفرستید؟
فرم های php
سلام
تا جایی که اطلاع دارم چنین کاری نمیشه انجام داد!
البته ممکنه این ترفند براتون مناسب باشه: به جای ارسال درخواست post به یک آدرس عادی (مثل
proc.php
) درخواست رو به آدرسی که دارای پارامتر هست (مثلproc.php?param=value
) بفرستید. اینطوری به مقادیر GET مورد نظر هم دسترسی دارید.با سلام، من یه سوال داشتم اونم این که من از متد post یاget استفاده میکنم اما مشکلی که داره وقتی روی دکمه فرم کلیک میکنم به کد های صفحه جدید رو نشون میده نه خروجی رو …..
ممنون میشم کمکم کنید.
سلام
یکم متوجه منظورتون نمیشم! اگه action رو روی صفحه دیگهای تنظیم کرده باشید، وقتی فرم رو ارسال کنید منتقل میشید به اون صفحه. حالا باید توی اون صفحه جدید، با
$_POST
یا$_GET
دیتاها رو بگیرید، پردازش کنید یا اگه نیازه چیزی به کاربر نمایش بدید.ممنون از پیگیریتون اما خودم مشکل رو پیدا کردم ، سایت بی نظیری دارید، امیدوارم همیشه همینقدر فعال و موفق باشید.
خداروشکر. ممنونیم. همچنین شما هم موفق باشید 🙂
سلام بخشید من به تازگی یک هاست رایگان گرفتم برای تست و یک فایل php ساختم و یه متغیر ساده هم توش تعریف کردم، حالا چطور با استفاده از پایتون میتونم درخواست بزنم به این فایل و اون متغیر رو مثلا از 1 به 100 تغییر بدم؟
و یا کلا قصد دیگه ای که دارم میخوام یه متن ساده رو به این فایل ارسال کنم و اونجا توی php ذخیره بشه تا هر وقتی رفتم توی سرورم ببینم اون متن اونجا ذخیره شده باشتکر.
سلام
مقدار متغیر توی فایل رو شاید به سادگی نشه و درست هم نباشه تغییر بدید. بلکه میتونید داخل php مقدارش رو با get یا post دریافت کنید و در دیتابیس ذخیره کنید یا حتی در یک فایل کناری.
برای ارسال درخواست هم پیشنهادمون استفاده از ماژول requests هست. یک نمونه از درخواست get رو توی آموزش دانلود با پایتون نشون دادم. به زودی هم آموزش جامعی برای این ماژول منتشر میکنیم البته میتونید از مستنداش کمک بگیرید.
سلام و وقت بخیر,
من 2 تا سایت دارم و میخوام کاربر با کلیک روی یک گزینه یا یک دکمه از سایت اولی به سایت دومی مراجعه کنه و اونجا یک پیامی رو ببینه ؟ ولی اگر آدرس سایت 2 رو مستقیم و بدون ارجاع از سایت اول باز کرد هیچ پیامی مشاهده نشه ؟
این کد رو خیلی لازم دارم اگر اطلاعی دارید لطفا راهنماییم کنید.
ممنون
سلام
میتونید یک فرم POST ارسال کنید. میتونید یه پارامتر GET ارسال کنید؛ که احتمالاً بهراحتی متوجه این تفاوت میشن.
میتونید از مقدار
$_SERVER['HTTP_REFERER']
در سایت دوم استفاده کنید ببینید کاربر از چه آدرسی به این صفحه هدایت شده.معمولاً از این ۳ روش برای هدفی مشابه شما استفاده میشه.
سلام و وقت بخیر بله همین روش رو استفاده کردم و جواب داد.
ممنون
با سلام و وقت بخیر ,
چطور میتونم این کار رو بدون ارجاع انجام بدم ؟
مثلا میخوام لینک های دانلود سایت اول رو در سایت دوم نمایش بدم , ولی تنها زمانی که کاربر از سایت اول به سایت دوم منتقل بشه ولی نمیخوام به طور ارجاع شناسایی بشه .
نو رفرر باشه ولی کاربر شناسایی بشه و لینک دانلود نمایش داده بشه.
ولی وقتی مستقیم به سایت دوم میری لینک دیده نمیشه .
چنین کدی رو لازم دارم حالا اگه php باشه یا java .
لطفا کمکم کنید.
ممنونم
سلام
معمولاً این کار یا با referer انجام میشه یا با آدرس صفحه. تجربهای در حالتهای دیگه ندارم اگر شدنی باشه.
فقط شنیدم که شاید بشه کوکیها رو در سایت دیگه استفاده کرد ولی به خاطر policyهای امنیتی معمولاً اجازه چنین کاری مخصوصاً اگه ssl فعال باشه داده نمیشه یا دردسرهایی داره.
به عنوان یه روش دیگه، شاید بتونید دیتاهای لازم (مثل سشنها) رو مثلاً توی دیتابیس با یه token نگهداری کنید. وقتی کاربر به سایت دوم رفت، این مقادیر رو بازیابی و بررسی کنید. البته اینکه یوزر رو در هنگام انتقال چطوری تشخیص بدید که قابل کپی نباشه خودش یه چالشه!
مرسی ازتون
کدوم امنیتش بیشتره؟
قاعدتاً متد POST در PHP به دلیل اینکه دادهها رو در url نمایش نمیده امنیت بهتری میتونه داشته باشه. اما این دلیلی نمیشه که روش get نامناسب باشه. هر کدوم در جای خودشون مفید هستند.
عالی و کامل
مرسی ازتون
سلام
آیا میشه با post متغیر هایی رو از یک فایل php به یه فایل دیگه php ارسال کنیم؟
یعنی همون ارجاع متغیر (بدون فرم)
سلام
اگر حتما نیازه با ارسال post انجام بدید، تابع
stream_context_create()
رو یه بررسی داشته باشید.اما اگر صرفا میخواید دیتایی رو بدون فرم ارسال کنید، شاید استفاده از سشن php راهحل خوبی باشه.
سلام
چطوری میشه در فرم با متد GET مقداری که درون فیلد ارسال میشه رو در صفحه مقصد درون فیلد مشابه چاپ کرد که دوباره نیاز به تایپ کردن مقدار نباشه
نمونه میزارم متوجه بشید : hostiran.net
در سرچ نام دامین هر مقداری وارد کنید در صفحه مقصد و در فیلد دوم همان مقدار چاپ میشه و نیازی به تایپ ندارد
ممنون میشم کمک کنید
سلام
میتونید مقداری که ارسال شده رو به عنوان ویژگی value فیلد مورد نظرتون در کدهای html صفحه مقصد قرار بدید. اینطوری فیلد فرمتون مقدار پیشفرض و مساوی با مقدار ارسالی از صفحه قبل رو داره.
خیلی سپاس از پاسخ شما ممکنه نمونه بزارید منم یاد بگیرم
اگر متغیر get به نام name باشه و بخوایم اون رو در فیلدی به نام user در صفحه جدید قرار بدیم، کدی شبیه به زیر رو داریم:
چون به خاطر سیستم امنیتی سایت، نمیتونم کد کامل php بذارم، قسمتی که echo شده رو داخل علامت باز و بسته PHP بذار.
سلام ممنون میشم کمکم کنید
من یه کد ساده میخوام که وقتی اطلاعات به صورت get بهش ارسال شد
بررسی کنه ببینه ایا تو دیتابیس و اون تیبل ایا موجود هست یا نه اگه بود ok برگردونه اگه نبود no
ممنون میشم اگه کدش رو دارین ارسال کنید.
متد به صورت زیر قراره ارسال بشه :
check.php?code=x
سلام؛ کد آماده برای این کار ندارم! با دستور SELECT در کوئریهای مشابه اتصال به دیتابیس در PHP میتونید وجود کد در دیتابیس رو بررسی کنید.
مشابهش عمل کنید، اگر جایی مشکلی داشتید بپرسید.