Отправка POST-запросов в cURL
Вот мы и переходим к самому соку модуля cURL. Эта статья очень важная и знания, которые Вы получите, будут использоваться в cURL чаще всего. Мы с Вами будем говорить об отправке POST-запросов в cURL.
Прежде чем отправлять POST-запросы, необходимо определиться, как это будет происходить и что нам для этого нужно. Нам нужно два файла: источник и приёмник. Соответственно, в источнике мы будем отправлять POST-запрос через cURL на приёмник. Приёмник будет этот запрос обрабатывать, а источник с помощью cURL примет результат этой обработки. Надеюсь, что здесь всё понятно. Теперь о том, что будет отправляться и что будет происходить. Отправляться источником будут два числа. А приёмник будет считать сумму двух чисел, пришедших через POST-запрос. В результате, сумма двух чисел вернётся от приёмника к источнику, а далее мы это число просто распечатаем.
Итак, давайте начнём с кода для файла-приёмника ("receiver.php"):
<?php
$a = $_POST['a'];
$b = $_POST['b'];
echo $a + $b;
?>
Здесь всё очень просто: записываем в переменные $a и $b данные из POST-запроса, а дальше выводим их сумму.
Теперь создадим файл-источник:
<?php
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, 'http://mysite.ru/receiver.php');
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "a=4&b=7");
$out = curl_exec($curl);
echo $out;
curl_close($curl);
}
?>
Опция CURLOPT_POST имеет значение true, что означает, что данные передаются методом POST. А в опции CURLOPT_POSTFIELDS содержится уже строка с передаваемыми данными. Если Вы запустите этот скрипт, то увидите число "11", что и предполагалось (4+7).
Если вдруг Вы не понимаете, что происходит в других строчках кода, то почитайте статью работа с cURL, где подробно описываются все другие операции.
После осмысления этой статьи Вы уже будете обладать очень важными знаниями, которые позволят Вам делать с cURL практически всё, что угодно, и работать в любой области применения cURL.
P.S. Всех дам поздравляю с 8-м марта! Желаю всегда оставаться красивыми, жизнерадостными и иметь рядом с собой достойного мужчину!
P.P.S. Полный курс по PHP и MySQL: http://srs.myrusakov.ru/php
-
- Михаил Русаков
Комментарии (23):
Спасибо за статью, полезно. Только вопрос: что делать если на странице есть ссылки типа scr=/folder/img.jpg?
Ответить
Написать скрипт, которые заменяет относительные пути абсолютными.
Ответить
Спасибо, в принципе так и думал, но хотел узнать нет ли встроенного решения у curl.
Ответить
А как проверить это в Денвере? задала URL Z:/home/test1.ru/www/res.php - не работает.
Ответить
Такая ссылка неправильная. Надо писать test1.ru/res.php
Ответить
Спасибо, заработало
Ответить
Не подскажите что делаю не так? Хотел написать простенький скрипт для авторизации на одном сайте, вот он if( $curl = curl_init() ) { curl_setopt($curl,CURLOPT_URL,'http:/primer.php'); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); curl_setopt($curl,CURLOPT_NOBODY,false); curl_setopt($curl,CURLOPT_HEADER,true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, "login=4dd&passwd=df&submit=Вход&remember_me=&check_ip="); $out = curl_exec($curl); echo $out; curl_close($curl); } логин и пароль заведомо неверные, также передел значение кнопки submit+ название двух чекббоксов, которые я оставли неотмеченными поэтому и ничеко не присвоил им. Проблема в том, что на странице не выводится сообщение о неверном пароле, она выглядит так как будто я ничего и не писал. В чем может быть загвоздка?
Ответить
Если checkbox не отмечен, то его и передавать не нужно, а вообще на сайтах иногда ставят защиту от таких дел. Например, требуют, чтобы клиентом был браузер, а не какой-то скрипт, требует, чтобы реферер стоял с их формы и ещё много, чего могут придумать. Также все эти сообщения выводят, как правило, из сессий, а в Вашем скрипте сессий нет, поэтому когда появляется страница в браузере, то, разумеется, ничего и не выводится.
Ответить
Спасибо, попробую насчет сессий. Но я вот что не понял: разве в заголовке не должны хранится все параметры то есть данные Post, cookie, session? а то мне выводят вот что. HTTP/1.1 200 OK Server: nginx/1.1.8 Date: Sun, 25 Nov 2012 07:01:39 GMT Content-Type: text/html; charset=windows-1251 Transfer-Encoding: chunked Connection: keep-alive Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Pragma: no-cache Expires: 0 Last-Modified: Sun, 25 Nov 2012 07:01:39 GMT X-UA-Compatible: IE=edge Set-Cookie: user_id=1ej5m1CxwlNVxoX3GHdcAg==; expires=Mon, 25-Nov-13 07:01:39 GMT; domain=(***); path=/ то есть инфа только о coockies, не пойму где посмотреть сессии и request параметры
Ответить
Сессии не хранятся в заголовках, они в файлах лежат на сервере. А в cookie только идентификатор, возможно, user_id это он и есть.
Ответить
Отличная статья коротко и понятно! Подскажите,как можно сделать,чтобы передаваемые данные из файла 'источник' в файл 'приемник' обработанные данные не возвращались обратно в файл 'источник'.
Ответить
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true) - поставить тут false, тогда ничего возвращаться уже не будет.
Ответить
Из статьи понял, что в папке сервера лежат 2 файла: файл-источник и файл-приёмник. Файл-приёмник имеет название "receiver.php", а файл- источник - ??? Назвал его «Index.php». Он же и запускается или что-то не так? Спасибо.
Ответить
Назвать источник можно как угодно.
Ответить
Приятно писать комментарии, задавать вопросы и знать,что на них всегда ответят! Спасибо,Михаил!
Ответить
Не так вопрос сформулировала. Михаил, очень нужна ваша помощь! Есть файл "index.php", "index_1.php" и "index_2.php". Из файла "index.php" при клике по ссылке подгружается файл "index_1.php" с помощью "fancybox". В "index_1.php" обрабатываются полученные данные,отправляем данные с помощью формы в файл "index_2.php". В файле"index_2.php" обрабатываем данные в зависимости от данных получаем значение и помещаем в переменную $var. Как можно передать значение переменной $var обратно в файл "index.php",чтобы можно было продолжать работать с этой переменной без перезагрузки страницы. Если с помощью сессии ,то после закрытия окна "fancybox",чтобы продолжать работу с $var в файле "index.php" приходится перезагружать страницу. Если с помощью формы,то окно "fancybox" не закрывается. Можно с помощью CURL решить вопрос? Ооочень надеюсь на вашу помощь!
Ответить
Да, с помощью cURL можно отправить GET или POST запрос с нужной переменной.
Ответить
Вопрос в том,как это сделать? $url = "http://localhost/autocomplete/index.php"; $post_data = array ( "da" =>$var , ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_NOBODY,0); curl_exec($ch); curl_close($ch); Так? Но в этом случаи подгружается файл "index.php"
Ответить
Надо в curl_init указать путь к файлу.
Ответить
curl_setopt($ch, CURLOPT_URL, $url) А ,что этого не достаточно? curl_init("http://localhost/autocomplete/index.php"); Никаких изменений не произошло
Ответить
Чтобы подгружался другой файл, надо написать в $url другой файл, а не index.php Вы подгружаете этот файл, а потом пишите, что хотели другой файл, а не index.php
Ответить
Все равно возвращаются, только к числу 11 добавляется через пробел число 1, а в файле приемнике в любом случае выводится 0.
Ответить
irin, У меня тоже был ноль, заработало после того, как изменил адрес файла-приёмника в файле-источнике: с 'receiver.php' на 'http://domain/receiver.php' У меня файл лежит в: Z:\home\domain\www\receiver.php То есть нужно указать: 'http://"имя вашей папки"/"имя вашего файла-приёмника"'.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.