یکشنبه ۱۵ مهر ۱۴۰۳

Sunday, October 6, 2024 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 بدون استفاده از دیتابیس
نمایش قسمتی از متن و پاراگراف با PHP
دریافت و نمایش پیج رنک گوگل با PHP
نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
دیدگاه
more ۱۴۶ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
سمیرا
۱۱:۱۸ ۱۳۹۲/۰۱/۲۵
با سلام . ممنون از اموزشها و سایت خوبتون . اموزشهای تالیفی شما واقعا در سایتهای ایرانی تکه . یه سوال داشتم از خدمتتون . کاربرد تابع
ob_start()
اگه امکان داره یه توضیح مختصر بدید اینکه کجاها باید استفاده کنیم .
سلام
تابع ob_start برای نگهداری موقت اطلاعات (buffering) پیش از گرفتن خروجی از آنها استفاده می شود، به فرض در حالت عادی مفسر PHP با هر دستور echo خروجی را به مرورگر ارسال می کند، اما با استفاده از ob_start می توان خروجی را در سمت سرور به صورت موقت نگهداری و هر زمان نیاز بود با تابع ob_get_contents دریافت کرد و در صورت لزوم به مرورگر ارسال نمود، البته معمولا باید طوری کد بنویسیم که نیاز به این نوع توابع نباشد، اما مواقعی پیش می آید که به طور مثال کد شما باید پیش از ارسال خروجی، ابتدا به طور کامل اجرا شود، سپس تصمیم بگیرد که خروجی باید دهد یا اینکه به فرض یک دستور redirect تنظیم کند.
یا به فرض می توان کدهای HTML را در کنار دستورات PHP نوشت، بدون اینکه نیاز باشد آنها را درون تگ های PHP بنویسیم، به فرض در حالت عادی:
<?php
$output = '<div class="block">HTML</div>';
?>
و با استفاده از ob_start:
<?php
ob_start();
?>
<div class="block">HTML</div>
<?php
$output = ob_get_clean();
?>
نکته: تابع ob_get_clean اطلاعات نگهداری شده فعلی (خروجی قبل از تابع) را دریافت و سپس آنها را از حافظه پاک می کند، اما در ادامه کد مجددا می توان اطلاعات بعدی را نگهداری کرد.
سمیرا
۱۹:۴۲ ۱۳۹۲/۰۱/۲۵
ممنون استاد . لطف کردید .
hamid62
۱۶:۴۳ ۱۳۹۲/۰۱/۲۶
سلام . درود به شما . ميشه درمورد مفهوم كش (cashe) توضيح بديد كه چيه .مثلا در فريم ورك ها خيلي در مورد كشينگ بحث ميشه
سلام
cache یا caching در مجموع با هدف افزایش سرعت بارگذاری و نمایش سایت استفاده می شود، به زبان ساده یعنی استفاده از صفحات و مقادیر استاتیک ذخیره شده در سرور به جای ارسال پرس و جوهای بی مورد دیتابیس که در کل موجب کند شدن سرعت سایت می شود، فرض کنید صفحه ای از سایت شما حداقل تا یک ساعت آینده تغییری نخواهد داشت، در این بین ممکن است 1000 درخواست به آن ارسال شود و برنامه شما نیز 1000 درخواست به دیتابیس ارسال کند، البته شاید در حالت عادی اتفاقی نیفتد، اما برای سایت هایی که بازدید خیلی بالایی دارند یا به میزان زیادی بر روی دیتابیس متکی هستند، این امر ممکن است باعث کندی پاسخ دهی سرور شود، لذا اینگونه سایت ها اقدام به ایجاد سیستم کش کردن صفحات بدون تغییر، در بازه زمانی مشخص می کنند، البته اینکه در کجا و چگونه می توان از cache استفاده کرد نیازمند آشنایی و تسلط کامل است، در غیر این صورت ممکن است صفحاتی را کش کنید که نیاز به به روزرسانی مداوم دارند، یا میزان زیادی از فضای هارددیسک سرور را به فایل های کش شده اختصاص دهید و مشکلاتی از این دست، در PHP روش های زیادی برای انجام این کار وجود دارد که برخی از آنها شیوه های خاص خود را دارند، از جمله:
- استفاده از توابع APC
- استفاده از Zend Platform
- نوشتن سیستم کش شخصی
و...
۱۱:۱۷ ۱۳۹۲/۰۱/۳۰
سلام
عالی بود
۱۲:۵۵ ۱۳۹۲/۰۲/۱۷
ممنون
امین
۱۹:۰۸ ۱۳۹۲/۰۳/۲۶
سلام
من میخوام یه مترجم قالب درست کنم که یه کد قالب رو بگیره بعد با
str_replace();
کدهای مورد نظر رو عوض کنه و نمایش بده
ولی وقتی میخواد نمایش بده قالب نتیجه رو فقط تا یه تعداد کاراکتر نشون میده. مشکل از چیه؟
با تشکر
سلام
اگر اطلاعات در دیتابیس ذخیره و سپس نمایش داده می شوند، ممکن است از انتخاب اشتباه نوع داده به فرض به صورت VARCHAR با تعداد کاراکتر محدود باشد، اما اگر نمایش خروجی به صورت مستقیم است، کدها باید بررسی شوند.
حامد
۱۲:۲۱ ۱۳۹۲/۰۳/۲۷
ارور Undefined index در php چیست ؟مثل
Notice: Undefined index: password in C:\wamp\www\project\index\home.php on line 59
خطای Undefined Index هنگامی بروز می کند که یک متغیر به صورت آرایه در بخشی از کد استفاده شده باشد، اما آن آرایه به هر دلیل خالی یا فاقد آن کلید باشد.
hb
۲۳:۵۰ ۱۳۹۲/۰۴/۱۴
یا سلام لطفا در مورد این ارور توضیح دهید
از سشن و هدر ایراد میگیره!
سلام
کدام ارور؟! متن خطا را درج نکردید!
hb
۰۹:۴۷ ۱۳۹۲/۰۴/۱۵
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/musiccom/public_html/admin/add.php:1) in /home/musiccom/public_html/admin/add.php on line 6
در مورد این ارور من از ob_Start هم استفاده کردم در جایی درست شد اما قاعده کلیش نمیدونم چیه لطفا راهنمایی کنید
در پاسخ به درخواست مرورگر از سرور، اولین چیزی که ارسال می شود سربرگ هایی تحت استاندارد HTTP هستند، مانند یونیکد صفحه، کوکی و... لذا وقتی از توابعی که هنگام اجرا این سربرگ ها را تولید می کنند (به طور مثال تابع session_start یک کوکی به مرورگر ارسال می کند) استفاده می کنیم، باید اولین خروجی کدهای ما، این سربرگ ها باشند نه کاراکتر مرئی یا نامرئی دیگری، اگر چه ممکن است کدهای ما به ظاهر قبل از فراخوانی توابع، خروجی مرئی تولید نکنند، اما برخی ویرایشگرها کاراکترهایی نامرئی به نام BOM یا Byte Order Mark را به ابتدای کدها اضافه می کنند که این کار موجب بروز مشکل می شود، نتیجه:
- قبل از فراخوانی توابعی که سربرگ ارسال می کنند، نباید هیچ خروجی توسط کدها ارسال شود.
- برای اطمینان همیشه با استفاده از ویرایشگرهای حرفه ای مانند ++Notepad کاراکترهای اضافه BOM را در هنگام ذخیره سازی حذف کنید.
- راه حل استفاده از تابع ob_Start نیز یک روش جایگزین محسوب می شود، چون این تابع مانع ارسال خروجی توسط کدها شده و تنها زمانی که بخواهیم می توانیم خروجی را ارسال کنیم.
hb
۱۹:۴۱ ۱۳۹۲/۰۴/۱۵
متشکرم اول به خاطر سایت خوبتون دوم به خاطر پاسخ جامع و مفیدتون
مشکلم همین بود و حل شد
hosein
۲۰:۵۹ ۱۳۹۲/۰۴/۲۴
با سلام و تشکر از سایت خوبتون
من یک سوال دارم
یک صفحه با پی اچ پی نوشتم ضمن استفاده از
$_SERVER[PHP_AUTH_USER]
اما مشکلی که هست این صفحه نمیتونه روی تمام فایل ها بشینه و مثل restrict اپاچی رمز بخواد
حالا من می خوام یوزر پسورد را با پی اچ پی دریافت کنم همین کارم کردم مشکلم اینه که چطور روی فولدر مورد نظر فایل ها قفل باشن تا این صفحه که یوزر پسورد دریافت میکنه بیاد بالا (به جز فایلی که یوزر پسورد دریافت میکنه بقیه فایل ها پی اچ پی نیستند)
سلام
این کار در درجه اول نیاز به تجربه و آشنایی با دستورات htaccess و همچنین سربرگ های header در PHP دارد، در غیر این صورت ممکن است چندان ساده به نظر نرسد.
- ابتدا یک فایل htaccess. باید در ریشه سایت داشته باشید که لیستی از دایرکتوری های مربوط به فایل ها به صورت نمونه زیر در آن باشد:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^\/(path\/to\/folder_1|folder_2|folder_3)\/.*$
RewriteRule !^((.*.php)|(.*\/))$ authorize/login.php
- بر طبق این کد، باید در دایرکتوری فرضی authorize فایلی به نام login.php داشته باشید که هنگامی که فایل ها از مسیرهای تعیین شده در دستور RewriteCond فراخوانی می شوند، به این آدرس جهت بررسی نام کاربری و کلمه عبور هدایت شوند.
- در این فایل، نام کاربری و کلمه عبور را با سرور تطبیق دهید و در صورت صحیح بودن با استفاده از تجزیه REQUEST_URI (برای تشخیص دایرکتوری و نام فایل) و همچنین دستورات header می توانید فایل را به مرورگر ارسال کنید.
hosein
۱۳:۰۳ ۱۳۹۲/۰۴/۲۵
متشکر متشکر متشکرم
هم از پاسخ گویی و هم از سایت خوبتون
مهدی
۲۳:۰۲ ۱۳۹۲/۰۴/۲۷
سلام
این پارامتر ها رو به صفحه مقصد فرم ارسال می کنیم. تا اینجا مشکلی نیست.
می خواستم بدونم چطور میشه توی صفحه ای که دارای فرم هست میشه فرم ها رو پر کرد با 1 بار لود صفحه.
مثلا فرم نطر شما با 1 بار لود پر شه (به صفحه ی مقصد فرم ارسال نکنه)
سلام
هر چند منظور سوالتان دقیقا مشخص نیست، اما به نظر می خواهید اطلاعات فرم را بدون رفرش صفحه به سرور ارسال کنید، در این صورت باید از آژاکس (Ajax) و تکنیک های مبتنی بر آن بهره ببرید که خود مبحث جداگانه دارد.
مهدی
۲۳:۵۷ ۱۳۹۲/۰۴/۲۷
سلام
شاید منظورم رو بد رسوندم.
ما 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 ?>">
aram
۰۰:۰۹ ۱۳۹۲/۰۴/۳۱
با سلام من می خوام سایتی را طراحی کنم که قیمت یک کالا را از یک سایت دریافت کند و نشان بدهد
متشکرم
سلام
لطفا از طرح سوالات کلی اجتناب کنید، مشخص نیست مشکل شما در کدام قسمت از طراحی این سایت است؟!
به هر صورت در کل باید با توابعی مانند file_get_contents، cURL و preg_match آشنا باشید تا بتوانید اطلاعات صفحه را دریافت و تجزیه کنید.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
3 × 4
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
سیدعباسی
با سلام من میخوام از متن زیر لینکش رو دربیارم و در آخر مقدار 3088 رو بصورت خروجی نهایی داشته باشم با...
۱۴۰۳/۰۷/۰۷

مجتبی
سلام وقت بخیر میخوام یک روز به تاریخ دریافتی اضافه شه ممنون میشم راهنمایی کنید
۱۴۰۳/۰۶/۲۰

پرتو
سلام خوبید؟ خسته نباشیذ ببخشید مزاحم شدم می خواستم بگم من به شما ایمیل زدم ولی هنوز شما جواب ندادین می تونم بپرسم چرا سوال...
۱۴۰۳/۰۶/۱۵
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.