شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

ارسال پارامتر به URL و دریافت مقادیر با PHP

php-curl-file-get-contents

زمانی که از ارسال پارامتر در وب صحبت می کنیم، بیشتر ذهنمان معطوف به فرم های HTML و متد POST یا GET می شود، البته این شیوه مرسوم و پرکاربردی برای ارسال داده ها از مرورگر (سمت کاربر) به یک سایت (سمت سرور) است، اما گاهی مواقع نیاز است که از این قالب سنتی پا را فراتر بنهیم و از روش های دیگری نیز استفاده کنیم، به فرض از همین استاندارد POST و GET در ارسال درخواست های آژاکسی (Ajax) نیز به سرور استفاده می شود، از طرفی کدها و توابعی در PHP وجود دارد که می توانند علاوه بر ارسال پارامترها به یک سرور (آدرس URL)، پاسخ آن را نیز دریافت کنند، امکان بالقوه ای که می تواند کاربردهای زیادی داشته باشد، از جمله مهمترین این توابع file_get_contents و cURL هستند که در ادامه آموزش به آنها خواهیم پرداخت.

تابع file_get_contents


از تابع file_get_contents در PHP برای خواند اطلاعات یک فایل یا آدرس URL استفاده می شود، به عنوان مثال:
<?php
$homepage = file_get_contents('https://webgoo.ir/');
echo $homepage;
?>
کد بالا با ارسال یک درخواست به آدرس تعیین شده، پاسخ سرور (که صفحه اول سایت «وبگو» است) را به صورت رشته متنی دریافت می کند، اکنون اگر با دستور echo از متغیر فرضی homepage خروجی بگیریم، اطلاعات دریافت شده نمایش داده می شوند.
تابع file_get_contents  پنج آرگومان به شرح زیر می پذیرد:
- آرگومان اول (filename): نام (یا آدرس) فایل یا URL.
- آرگومان دوم (use_include_path): فراخوانی فایل از دایرکتوری include_path در تنظیمات PHP.
- آرگومان سوم (context): محتوایی که به همراه درخواست ارسال می شود، این محتوا باید توسط تابع  stream_context_create (و بر اساس استانداردهای HTTP context options) ساخته شود تا معتبر باشد، تنظیمات قابل اعمال در این قسمت عبارتند از: method، header، user_agent، content، proxy، request_fulluri، follow_location، max_redirects، protocol_version، timeout و ignore_errors؛ اطلاعات بیشتر:
http://php.net/manual/en/context.http.php
- آرگومان چهارم (offset): محل و خط شروع خواندن اطلاعات (این قابلیت به دلیل پشتیبانی نشدن برای فایل های لوکال و محدودیت هایش، چندان کاربردی نیست).
- آرگومان پنجم (maxlen): حداکثر کاراکتری که تابع خواهد خواند (در حالت پیش فرض تمام اطلاعات خوانده می شود).

تابع file_get_contents و متد POST


تابع file_get_contents علاوه بر دریافت پاسخ یک سرور، این توانایی را دارد که در چاچوب متد POST پارامترهایی نیز به سرور مقصد ارسال نماید، همان طور که در توضیح آرگومان های آن گفته شد، این پارامترها باید در چارچوب استاندارد HTTP بوده و پیش از ارسال توسط تابع stream_context_create معتبر شوند، به این ترتیب می توان نحوه کار فرم های HTML را به راحتی شبیه سازی کرد، ضمن اینکه علاوه بر ارسال پارامترها، می توان هم زمان نتیجه درخواست را نیز دریافت کرد، به مثال زیر توجه کنید.
<?php
//مقادیری که باید ارسال شوند
$data = http_build_query(
    array(
    'var_1' => 'content_1',
    'var_2' => 'content_2',
    'var_3' => 'content_3'
    )
);
//تنظیم سربرگ های http
$http = array('http' =>
    array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $data
    )
);
//معتبر سازی با stream_context_create
$context = stream_context_create($http);
//ارسال درخواست و دریافت نتیجه
$result = file_get_contents('http://www.example.com/submit/get.php', FALSE, $context);
?>
نکته: برای نمایش نتیجه دریافتی می توانید از یک دستور ساده echo استفاده کرده و از متغیر result خروجی بگیرید.

تابع cURL


یکی از قدرتمند ترین کتابخانه های مربوط به کار با پروتکل های وب در PHP، کتابخانه libcurl است که از نسخه 4.0.2 به آن افزوده شده است، البته این کتابخه به صورت پیش فرض در مفسر PHP وجود ندارد، اما به جهت کاربردی بودن، معمولا در اکثر سرورها به صورت پیش فرض فعال است، به طور ساده کتابخانه libcurl دربرگیرنده مجموعه توابعی است که کار با پروتکل های وب (از جمله HTTPS، HTTP، FTP و...) را به صورت حرفه ای و با قابلیت های زیاد ممکن می کند، به مثال زیر توجه کنید.
<?php
$content = 'PHP cURL';
$curl = curl_init('http://www.example.com/submit/get.php');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'var='.$content);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, FALSE);
$result = curl_exec($curl);
curl_close($curl);
?>
همان طور که در مثال بالا مشخص است، توابع مربوط به این کتابخانه با پیشوند _curl شروع می شوند، اما توضیح مختصری درباره برخی توابع این کتابخانه:
- تابع curl_init: با دریافت یک آدرس url، نشست cURL را آغاز می کند.
- تابع curl_setopt: تنظیم پارامترهای مورد نیاز برای اجرای صحیح یک نشست cURL.
- تابع curl_exec: اجرای یک نشست cURL.
- تابع curl_close: پایان یک نشست cURL.
- تابع curl_error: آخرین خطای رخ داده در نشست را نمایش می دهد.
- تابع curl_errno: شماره خطای برگردانده شده را نمایش می دهد.
البته توابع مربوط به این کتابخانه محدود به موارد گفته شده نمی شود:
http://www.php.net/manual/en/book.curl.php
به مثالی کاربردی توجه کنید.
<?php
//تنظیم آدرس url
$curl = curl_init('http://www.example.com/submit/get.php');
//تنظیم ارسال از طریق متد POST
curl_setopt($curl, CURLOPT_POST, 1);
//تنظیم پارامترها
curl_setopt($curl, CURLOPT_POSTFIELDS, 'var_1=content_1&var_2=content_2&var_3=content_3');
//تعین اینکه پاسخ سرور دریافت شود یا خیر
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//اجرای نشست
$result = curl_exec($curl);
//پایان نشست
curl_close($curl);
?>
توضیح:
- آدرس url مقصد را در قسمت curl_init مشخص کنید.
- در تنظیمات مربوط به CURLOPT_POST، متد استفاده شده در درخواست را مشخص می کنیم، اگر مقدار 1 یا TRUE باشد، مقادیر CURLOPT_POSTFIELDS از طریق متد POST ارسال شده و پارامترهای احتمالی در آدرس URL نادیده گرفته می شوند (امکان ترکیب متد POST و GET در این حالت وجود ندارد).
- در تنظیمات قسمت CURLOPT_POSTFIELDS، پارامترها و مقادیر آنها را تعیین کنید، این پارامترها در واقع نقش نام فیلد و مقادیر آنها نقش مقدار فیلد را در یک فرم HTML بازی می کنند.
- در قسمت CURLOPT_RETURNTRANSFER، مشخص می کنیم که آیا پاسخ سرور نیز پس از ارسال درخواست دریافت شود یا خیر، اگر مقدار TRUE باشد، پاسخ به صورت رشته متنی دریافت می شود و اگر FALSE باشد، پاسخ دریافت نمی شود.
- برای تکمیل یک نشست cURL باید حتما با تابع curl_exec آن را اجرا کنیم.
- در نهایت نیز با تابع curl_close، نشست cURL را خاتمه می دهیم.
نکته: برای نمایش نتیجه دریافتی می توانید از یک دستور ساده echo استفاده کرده و از متغیر result خروجی بگیرید.
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
دریافت و نمایش پیج رنک گوگل با PHP
آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
ساخت منوی هوشمند با PHP و CSS
ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
دیدگاه
more ۱۴۶ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
۱۶:۲۵ ۱۳۹۲/۱۰/۲۰
سلام دوست عزیز من اکستنش php_openssl را فعال کردم و بعد از آن از کد زیر استفاده کردم.
<?php
$file = file_get_contents('http://www.google.com/search?q=cats',false);
echo $file;
?>
اما خطا داد و پیغام زیر نمایش داده شد.
403. That’s an error.
Your client does not have permission to get URL /search?q=cats from this server. (Client IP address: 2a01:4f8:200:44a6::2)

Please see Google's Terms of Service posted at http://www.google.com/terms_of_service.html
That’s all we know.
چرا نمی شود از تابع file_get_contents برای url
http://www.google.com/search?q=cats
استفاده کرد ؟
آیا هیچ راه راحلی وجود ندارد؟
سلام
کدها را تست کردیم، مشکلی وجود ندارد! به نظر دریافت خطای 403 به استفاده از IP ورژن 6 در هنگام اتصال مربوط می شود (احتمالا به تنظیمات سرور بر می گردد)، این احتمال نیز وجود دارد که IP سرور شما توسط گوگل بلاک شده باشد، به هر صورت این کد در لوکال هاست (حداقل برای ما) به خوبی کار می کند!
۱۷:۳۴ ۱۳۹۲/۱۰/۱۹
سلام
چرا نمیشه از تابع file_get_contents برای سایت هایی مثل گوگل استفاده کرد. مثلا کد زیر error میده
<?php
$x = file_get_contents('http://google.com/');
echo $x;
?>
آیا راه حلی وجود نداره که بشه برای اینگونه سایت ها استفاده کرد؟
سلام
هر چند خطای رخ داده را مشخص نکرده اید، اما سایت گوگل نیاز به فعال بودن اکستنش php_openssl دارد که باید در تنظیمات PHP فعال باشد.
ستار
۰۸:۵۴ ۱۳۹۲/۱۰/۰۹
سلام و ممنون از راهنمایی شما.
اما از اونجا که من php را در سطح مبتدی بلدم! چند سوال دیگه برام پیش اومد.
من تمام دستورات را در easyphp فعال کردم اما جواب نداد این کدی که فرمودید کوکی ها را به کجا میفرسته؟ به سایت هدف یا به هاستی که ما از کرون جاب ان استفاده می کنیم؟
اگر من کد را در کرون جاب یه هاست قرار بدم ایا با ip اون هاست به سایت هدف متصل میشم؟
اگر کپچا داشته باشه باید چکار کنم؟
با تشکر
سلام
اینکه "جواب نداد" نیاز به بررسی های بیشتر دارد، ممکن است اطلاعات ارسال شود، اما مشکل از جای دیگری باشد، کوکی قاعدتا در سمت کاربر (که در اینجا سایت هدف است) باید ایجاد شود، ip نیز همان ip سرور شما است، برای حالت رمز امنیتی قاعدتا کاری نمی توان کرد (مگر اینکه برنامه ای برای دور زدن آن بنویسید که با توجه به عدم تمایل مدیر سایت مربوطه به ارسال پیام های ناخواسته، این کار ممکن است به لحاظ اخلاقی درست نباشد!).
ستار
۱۶:۱۳ ۱۳۹۲/۱۰/۰۷
سلام
حالا اگر خواستیم از کد با کرون جاب استفاده کنیم و سایت هدف از ما یوزر و پسورد خواست باید چکار کنیم؟ چطوری کوکی و سشن ها را ست کنیم؟
برای ارسال نام کاربری و کلمه عبور، پارامترهای زیر را اضافه کنید:
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
برای ارسال کوکی می توانید از نمونه زیر استفاده کنید (بین هر پارامتر کوکی باید یک space باشد):
$str_cookie = 'PHPSESSID='.session_name().'; path=/';
curl_setopt($curl, CURLOPT_COOKIE, $str_cookie );
مرتضی
۲۱:۲۷ ۱۳۹۲/۰۸/۲۷
خیلی سپاس گزارم بزرگوار. جوابتون خیلی کامل بود. مشکلم حل شد و خیلی خوشحال شدم.
اجرتون با آقا امام حسین (ع)
سایتتون واقعا عالیه - انشالله که همیشه موفق و پیروز باشید.
مرتضی
۲۱:۰۰ ۱۳۹۲/۰۸/۲۶
با عرض سلام مجدد
خیلی ممنون بابت پاسخ به سوال قبلی. اجرا کردم. درست بود. خیلی زحمت کشیدین.
من نمی دونم چطوری از تابع explode در این زمینه استفاده کنم. :(
تو اینترنت خیلی گشتم.
این فرم رو واسه انتخاب دسته دارم:
<form action="" method="get" name="GForm">
<select name="category" onchange="SubmitForm(this.form)">
<option>category 1</option>
<option>category 2</option>
<option>category 3</option>
</select>
</form>
حالا چطوری همه ی عکس هایی که مثلا مربوط به category 2 هستند رو از sql پیدا کنه و نمایش بده ؟
سلام
این کار را باید در هنگام تنظیم پرس و جوی MySQL، با SELECT و قابلیتی مانند LIKE یا علامت = انجام دهید (لطفا به آموزش های مقدماتی مراجعه نمائید).
مرتضی
۱۸:۲۴ ۱۳۹۲/۰۸/۲۰
با سلام و خسته نباشید خدمت استاد گرامی
من یه گالری تصاویر دارم. می خوام تصاویر رو دسته بندی کنم. این تصاویر تو sql ثبت میشن. لازمه بعضی تصاویر تو دو یا چند دسته قرار بگیره و با انتخاب هر دسته تصاویر مربوط به اون دسته نمایش داده بشه.
در صفحه ثبت تصویر در گالری به تعداد دسته ها, چک باکس گذاشتم که دسته ها رو انتخاب می کنم.
سوالم اینه که چجوری می تونم چندتا چک باکس رو تو sql واسه یه عکس ثبت کنم و دسته بندی صورت بگیره ؟
کاری که کردم اینجوریه : اما فقط آخرین چک باکس ثبت میشه.
<input name="category[]" type="checkbox" value="category1" /><span>category 1</span>
<input name="category[]" type="checkbox" value="category2" /><span>category 2</span>
<input name="category[]" type="checkbox" value="category3" /><span>category 3</span>
----------------------------
$img_category = $_POST['category'];
foreach($img_category as $key => $value){
$category = $value;
}
بعد insert کردن category در sql.
با سپاس فراوان
سلام
بخش اصلی کار را درست انجام داده اید، اما در هر دور حلقه foreach به متغیر category مقدار داده شده که نهایتا تنها مقادیر دور آخر ست می شود.
در اینگونه موارد معمولا باید خروجی به صورت نمونه زیر باشد:
category 1|category 2|category 3
اگر دقت کنید یک علامت | بین سه گزینه قرار گرفته که این در هنگام فراخوانی و تجزیه به آرایه به عنوان delimiter به کار می آید، برای ایجاد رشته به صورت بالا باید حلقه را به صورت نمونه زیر بنویسید (تست نشده):
<?php
$img_category = $_POST['category'];
$loop = 1;
$count = count($img_category);
$category = NULL;
foreach($img_category as $key => $value){
if($loop < $count){
$category .= $value . '|';
}
else{
$category .= $value;
}
$loop++;
}
?>
برای زمان فراخوانی نیز از توابعی مانند explode استفاده کنید.
hosein
۱۸:۰۷ ۱۳۹۲/۰۶/۰۹
سلام
کدی میخواستم که تمامی مشخصات کاربر که با
$_SERVER
برگردانده می شود ، دریافت کند . نکته بسیار مهم اینه که کاربر اصلا اون فایل رو هم فرض می کنیم اجرا نکنه یا تو فایل هایی که اجرا میشه include نباشه باز هم اطلاعات کاربر که وارد به سایت میشه رو ذخیره کنه ، حالا یا با پی اچ پی یا با اچ تی اکسس
سپاس از سایت خوبتون
سلام
سوالتان کلی است!، چنین کدی را به صورت آماده در اختیار نداریم، باید بخشی از کدها را خودتان بنویسید و سوالتان را موردی مطرح کنید تا بتوانیم راهنمایی کنیم.
مهدی
۰۰:۲۴ ۱۳۹۲/۰۵/۲۹
سلام
یه سوال داشتم، می خوام یه مدیریت محتوا درست کنم که یه ادیتور داشته باشه، یعنی توش مطلب بنویسیم و دکمه ارسال رو بزنیم و به سایت ارسال بشه، این رو بلدم، اما می خوام یه گزینه هم داشته باشه به عنوان درج عکس که وقتی میزنیم یه صفحه باز بشه و لینک عکس و از ما بخواد...
اگه میشه کمکم کنید، مرسی :)
سلام
ساخت ادیتور با JavaScript یک کار حرفه ای است! یعنی شما باید پیش از این با جاوا اسکریپت کد نویسی کرده و تسلط لازم بر متدها و راه حل های سازگاری با مرورگرهای مختلف را یاد گرفته باشید، برای موردی که گفتید روش خلاصه ای وجود ندارد، باید با window.open پنجره جدید باز کنید و سپس مقادیر را از فیلدهای کاربر گرفته و مجدد با window.opener و innerHTML در ادیتور درج کنید، در عمل به دانستن نکات ریز زیادی احتیاج خواهید داشت که بیشتر آنها را باید در تجربه های قبلی و آموزش های مقدماتی کسب کرده باشید.
aram
۱۵:۴۰ ۱۳۹۲/۰۵/۰۱
بازم سلام
خیلی ممنون به سوالات من پاسخ دادید
چرا این کد خطا می دهد
if(preg_match( '/<td class="tm" width="120">مثقال طلا </td>
<td align="center" class="Rayka46 u6p1y1nd">(.*)</td>/'
, $html , $matches))
{
$new = htmlentities($matches['0']);
$content = $new;
}
else $content="not found";
echo $content;
پیغام خطا
Warning: preg_match() [function.preg-match]: Unknown modifier 't' in C:\wamp\www\gold\2.php on line 19
سلام
برای نوشتن دستورات preg_match باید با Regex (زبان عبارات با قاعده) آشنا باشید، Regex شما در کدهای بالا معتبر نیست، نمونه صحیح:
<?php
$content = file_get_contents('http://webgoo.ir');
$footer = preg_match("/<div class=\"footer-txt\"[^>]*>(.*?)<\\/div>/ims", $content, $match);
echo $match[1];
?>
کد فرضی بالا اطلاعات را از صفحه اول سایت ما دریافت کرده و مقادیر متنی خط زیر را استخراج می کند:
<div class="footer-txt">
مقادیری که استخراج می شود
</div>
aram
۱۵:۱۷ ۱۳۹۲/۰۵/۰۱
خیلی ممنون . لطفا در مورد preg_match توضیح دهید؟
تابع preg_match برای بررسی وجود یک عبارت در یک رشته بر اساس یک دستور باقاعده (Regular Expression) به کار می رود، اطلاعات بیشتر:
http://php.net/manual/en/function.preg-match.php
aram
۰۰:۰۹ ۱۳۹۲/۰۴/۳۱
با سلام من می خوام سایتی را طراحی کنم که قیمت یک کالا را از یک سایت دریافت کند و نشان بدهد
متشکرم
سلام
لطفا از طرح سوالات کلی اجتناب کنید، مشخص نیست مشکل شما در کدام قسمت از طراحی این سایت است؟!
به هر صورت در کل باید با توابعی مانند file_get_contents، cURL و preg_match آشنا باشید تا بتوانید اطلاعات صفحه را دریافت و تجزیه کنید.
مهدی
۲۳:۵۷ ۱۳۹۲/۰۴/۲۷
سلام
شاید منظورم رو بد رسوندم.
ما 2 تا صفحه داریم
1.contact.php
2.contact.php?step=send
در صفحه 1 فرم وجود داره که باید پر بشه مثلا نام و ایمیل و ....
در صفحه 2 با post این اطلاعات دریافت میشه و در دیتابیس ذخیره می شه یا به صورت میل ارسال میشه با استفاده از این متد ها ما پارامتر ها را به صفحه ی 2 ارسال می کنیم. حالا می خواستم بدونم چطوری می تونیم داخل فیلد (input) های صفحه 1 اطلاعات را وارد کنیم و اون رو پر کنیم.
آیا چنین راهی وجود دارد؟
با تشکر از شما و سایت خوبتون
سلام
منظور از "داخل فیلد (input) های صفحه 1 اطلاعات را وارد کنیم و اون رو پر کنیم" مشخص نیست، حدس می زنیم منظور درج یک مقدار پیش فرض برای فیلدها باشد که در این صورت می توانید برای قسمت value یک مقدار در نظر بگیرید، به طور مثال:
<?php
$name = NULL;
if(!isset($_POST['name'])){
$name = 'مقدار پیش فرض';
}
else{
$name = $_POST['name'];
}
?>
<input type="text" name="name" value="<?php echo $name ?>">
مهدی
۲۳:۰۲ ۱۳۹۲/۰۴/۲۷
سلام
این پارامتر ها رو به صفحه مقصد فرم ارسال می کنیم. تا اینجا مشکلی نیست.
می خواستم بدونم چطور میشه توی صفحه ای که دارای فرم هست میشه فرم ها رو پر کرد با 1 بار لود صفحه.
مثلا فرم نطر شما با 1 بار لود پر شه (به صفحه ی مقصد فرم ارسال نکنه)
سلام
هر چند منظور سوالتان دقیقا مشخص نیست، اما به نظر می خواهید اطلاعات فرم را بدون رفرش صفحه به سرور ارسال کنید، در این صورت باید از آژاکس (Ajax) و تکنیک های مبتنی بر آن بهره ببرید که خود مبحث جداگانه دارد.
hosein
۱۳:۰۳ ۱۳۹۲/۰۴/۲۵
متشکر متشکر متشکرم
هم از پاسخ گویی و هم از سایت خوبتون
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
6 × 3
20 × 20
=