Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: post запрос из выполняющегося php-скрипта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Jony X
Отправлено: 11 Апреля, 2009 - 13:28:49
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2009  


Помог: 0 раз(а)




Разъясните чайнику, можно ли сделать запрос методом post из пхп скрипта и как это сделать?
Суть задачи такая: необходимо передать страничке на другом сайте переменные, считать результат запроса и проанализировать. Сайт принимает только пост запросы.
Методом get я делаю это следующим образом:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ...
  3. function get_data($url_str)
  4. {
  5.        
  6.         if(ini_get('allow_url_fopen'))
  7.         {
  8.                 $data=@implode("", @file($url_str));
  9.         }
  10.         else
  11.         {
  12.                 ini_set('error_reporting','E_ERROR');
  13.                 if ($ch=curl_init())
  14.                 {
  15.                         curl_setopt($ch, CURLOPT_URL, $url_str);
  16.                         curl_setopt($ch, CURLOPT_TIMEOUT, 100000);
  17.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  18.                         $data=curl_exec($ch);
  19.                         curl_close($ch);
  20.                 }
  21.                 else
  22.                 {
  23.                         print "Скрипт не может работать на данной платформе, так как отключены fopen-оболочки и не поддерживается curl-сессия";
  24.                 }
  25.         }
  26.         return $data;
  27. }
  28.  
  29. $url_str="http://site.ru/index.php?request=value&"
  30. $data=get_data($url_str);
  31. ...
  32. ?>


Может есть стандартная функция?

(Отредактировано автором: 11 Апреля, 2009 - 13:31:22)

 
 Top
Гость
Отправлено: 11 Апреля, 2009 - 20:09:34
Post Id


УДАЛЁН










Jony X Честно сейчас мне лень искать но если вы воспользуетесь поиком по форуму то найдете готовую функцию (Кстати написанною мной Улыбка которая работает через сокеты и может запрашивать любые POST и GET запросы принимая передаваемые параметры через массив и также можно подделывать заголовки
 
 Top
Jony X
Отправлено: 11 Апреля, 2009 - 20:39:19
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2009  


Помог: 0 раз(а)




JustUserR пишет:
Jony X Честно сейчас мне лень искать но если вы воспользуетесь поиком по форуму то найдете готовую функцию (Кстати написанною мной Улыбка которая работает через сокеты и может запрашивать любые POST и GET запросы принимая передаваемые параметры через массив и также можно подделывать заголовки


Может хоть название припомните? А то поиск столько страниц выдает, что тоже как-то не хочется все проверять. Если ваш скрипт - это то,что мне надо, буду по гроб жизни вам благодарен. А то я уже все мозги себе на этом сломал.
 
 Top
Гость
Отправлено: 12 Апреля, 2009 - 12:10:57
Post Id


УДАЛЁН










Функция post_query принимает параметры: домен сайта (Без http прочего) - путь к запрашиваемому файлу - медот запроса (GET или POST) - массив передаваемых значений - время максималньго ожидания ответ
Функция возращает или ошибку (Если не полусилось чтото) или массив из содержимого страницы и заголовков

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP // For colorer syntax
  3. function post_query($site_domain,$site_file_path,$query_method="GET",$query_data,$site_timeout)
  4. {
  5.    $service_port = getservbyname('www', 'tcp');
  6.    $address = gethostbyname($site_domain);
  7.    set_time_limit($site_timeout);
  8.    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  9.    if ($socket < 0)
  10.    {
  11.       return "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
  12.    }
  13.    else
  14.    {
  15.       1;
  16.    }
  17.    $result = socket_connect($socket, $address, $service_port);
  18.    if ($result < 0)
  19.    {
  20.       return "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
  21.    }
  22.    else
  23.    {
  24.       1;
  25.    }
  26.    $read_data=""; $out="";
  27.    if($query_method=="GET")
  28.    {
  29.       $qa_data_str="";
  30.       forearch($query_data as $key=>$value)
  31.       {
  32.          $keyz=urlencode($key);
  33.          $valuez=urlencode($value);
  34.          $qa_data_str=$qa_data_str.$keyz."=".$valuez."&";
  35.       }
  36.       $qa_data_str=substr($qa_data_str,0,(strlen($qa_data_str)-2));
  37.       $in = "GET /$site_file_path?$parms HTTP/1.1\n";
  38.       $in .= "Host: $site_domain\n";
  39.       $in .= "Connection: Close\n\n";}
  40.       else if($query_method=="POST")
  41.       {
  42.          $qa_data_str="";
  43.          forearch($query_data as $key=>$value)
  44.          {
  45.             $keyz=urlencode($key);
  46.             $valuez=urlencode($value);
  47.             $qa_data_str=$qa_data_str.$keyz."=".$valuez."&";
  48.          }
  49.          $qa_data_str=substr($qa_data_str,0,(strlen($qa_data_str)-2));
  50.          $qa_data_len=strlen($qa_data_str);
  51.          $in = "POST /$site_file_path HTTP/1.1\n";
  52.          $in .= "Host: $site_domain\n";
  53.          $in .= "Content-length: $qa_data_len\n";
  54.          $in .= "Connection: Close\n\n";
  55.          $in .= $qa_data_str;
  56.       }
  57.       else
  58.       {
  59.          return "Only GET or POST methods supported\n";
  60.       }
  61.       socket_write($socket, $in, strlen($in));
  62.       while($out = socket_read($socket, 256))
  63.       {
  64.          $read_data.=$out;
  65.       }
  66.       socket_close($socket);
  67.       $head_start=index($read_data,"\n\n");
  68.       $r_headers=substr($read_data,0,$head_start);
  69.       $r_page=substr($read_data,$head_start,strlen($$read_data));
  70.       $r_data=array($r_page,$r_headers);
  71.       return $r_data;
  72. }
  73. ?>
  74.  


(С) Куплю идентовставлялку для индентовставляния в безындентные программы Улыбка


Отредактировано администратором: EuGen, 12 Апреля, 2009 - 22:43:24
ИНДЕНТЫ, инденты, и еще раз ИНДЕНТЫ!
 
 Top
Вездеход
Отправлено: 12 Апреля, 2009 - 22:55:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




извините за глупость...
но что такое "ИНДЕНТЫ"? )


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Гость
Отправлено: 13 Апреля, 2009 - 08:10:31
Post Id


УДАЛЁН










Вездеход Иденны это отступы и табяляции (Судя по тому что EuGen понадобавлял их в моем коде Улыбка
 
 Top
Jony X
Отправлено: 13 Апреля, 2009 - 17:23:38
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2009  


Помог: 0 раз(а)




Спасибо за функцию. С сокетами еще не работал, но я думаю, что мануал и пару раз пальцем в небо и я разберусь.

-------------------------------- ----------------
Вопрос возник такого плана: если в socket_read задать заведомо большую длинну (например в 1048576b - 1 метр), как это отразится на её работе и какие будут последствия (напр. когда закончится считывание, будет ли выдана ошибка, и тд)

если можно, кинте линк на мануал по пхп последней редакции (я сейчас пользуюсь редакцией 2002 года)

(Отредактировано автором: 13 Апреля, 2009 - 17:56:26)

 
 Top
Stierus Супермодератор
Отправлено: 13 Апреля, 2009 - 18:02:46
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ваша исходная функция работает через curl, значит с ним вы знакомы ... что же останавливает немного переделать параметры ?
 
My status
 Top
Jony X
Отправлено: 17 Апреля, 2009 - 21:15:06
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2009  


Помог: 0 раз(а)




Домучал я, друзья, мануал по пхп и это привело к желаемому результату. В итоге моя функция приобрела следующий вид:
PHP:
скопировать код в буфер обмена
  1. function get_data_post($url_str, $query, $cookie)
  2. {
  3.         ini_set('error_reporting','E_ERROR');
  4.         if ($ch=curl_init())
  5.         {
  6.                 curl_setopt($ch, CURLOPT_URL, $url_str);
  7.                 curl_setopt($ch, CURLOPT_TIMEOUT, 100000);
  8.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9.                 curl_setopt($ch, CURLOPT_HEADER, 1);
  10.                 if ($cookie!="")
  11.                 {
  12.                         curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  13.                 }
  14.                 curl_setopt($ch, CURLOPT_POST, 1);
  15.                 curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
  16.                 $data=curl_exec($ch);
  17.                 curl_close($ch);
  18.         }
  19.         else
  20.         {
  21.                 print "Скрипт не может работать на данной платформе, так как не поддерживается curl-сессия";
  22.         }
  23.         return $data;
  24. }

Теперь она не только еденичные запросы обрабатывает, но и серию запросов при поддержке сессии и куков (если необходимо, просто находим функцией preg_match значение переменных в заголовке и, в формате имя1=значение1&имя2=значение2&..., присваиваем переменной $cookie)
Если этого не требуется, просто выкидываем строчки:
curl_setopt($ch, CURLOPT_HEADER, 1);
if ($cookie!="")
{
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
и $cookie из переменных функции (хз как правильно их назвать)
$query - это строка запроса в формате имя1=значение1&имя2=значение2&...
$url_str - урл страницы, которой необходимо передать пост запрос.

Касаемо предлагаемого выше скрипта через сокеты - мой хостер блокирует внешние запросы с их использованием, как и fopen-оболочки, поэтому оценить по достоинству не могу.

(Отредактировано автором: 17 Апреля, 2009 - 21:16:50)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB