Передача данных из скрипта методом POST08.05.2007 (последний раз редактировалось 15.11.2010) сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиОтправка данных из php скрипта методом POST так, как это делает обычная html форма. Отправка переменных и файлов. Отредактирована 15.11.2010
Комментарии
RSS комментарии
14.02.2010 админ
epoy@bk.ru, вопрос не понятен, от куда данные не передаются пока не считаются?
18.02.2010 bazadaykin
тут народ интересовался как массив передать. есть в пхп такая пара функций serialize($var) и unserialize($var). занимаються они тем, что преобразуют $vsr (буть то массив, объект, строка или еще какая хрень) в в набор байтов (если упростить, то можно сказать что в строку). соответственно эту "строку" можно потом передать любым из методов. таким образом не надо передавать массив вот так:
$out="$array1=a&array2=b"
все что вам нужно сделать на передающем конце
$data = "var1=abc&var2=123&myarray=".serialize($myarray);
и на принимающем конце
if (get_magic_quotes_gpc())$myarray = unserialize(stripslashes($_POST['myarray'])); else $myarray = unserialize($_POST['myarray']);
про get_magic_quotes_gpc() уточняю. при передачи данных POST (и GET кажеться тоже) специальные символы проходят экранирование. т.е если в исходной строке у вас было K'mon, то после передачи на принимающем конеце будет K\'mon. если я не ошибаюсь в последних версиях php этого не делаеться, но тем не менее. так вот get_magic_quotes_gpc() как раз и говорит, применялось ли экранирование или нет. если экранирование было, значит надо убрать экранирующий \, т.е при serialize активно используються всякие слеши, апостровы и т.д. для этоко как раз и используется stripslashes. если stripslashes тыкать в любом случае (без проверки) то рискуете убрать спецсимвол там где он нужен.
18.02.2010 bazadaykin
дополню к предыдущему посту.
этот подход будет работать если такой способ передачи массивов предусмотрен принимающей стороной (ну например вы сами и пишете принимающий скрипт). тогда это очень удобно. не надо париться и воротить переборы массивов для того чтобы сформировать из него строку. а если еще массив многомерны.... вообщем, надеюсь облегчил жизнь комунить.
02.03.2010 Maxik
Тема КУЛ!!!
В учебниках них... нету тут нашел!
Автору огромное спасибо!
25.03.2010 Kostyan1488
Отличная статья, автору спасибо!
08.04.2010 boris
thx
29.04.2010 Max
Big thanks!
08.05.2010 Игорь
Пасиба бальшой
18.05.2010 Кирилл
Попробовал я использовать ваш пример. И не увидел на экране что получилось. Скопировал все в файл и нажал в эксплоре обновить. И как я понял принимающая часть ничего не приняла и не вывела на экран. Можно более детальный алгоритм)))
Заранее спасибо
18.05.2010 Кирилл
Дополнение.
Что мне нужно то. Отправить запрос на сайт и получить весь ответ сгенерированной сайтом странички
19.05.2010 админ
Кирилл, а разве данный код не показывает ответ сайта?
while($gets=fgets($fp,2048))
{
print $gets;
}
19.05.2010 Кирилл
Вот именно что не показывает.
Молчит как партизан. Доходит до этой функции и все тишина. Мб есть готовый пример рабочий в смысле сами файлы. Мало ли я чего не так применяю.
20.05.2010 Админ
Кирилл, внес не большие поправки в код. Попробуйте передать данные слегка измененным способом.
Обязательно отпишитесь, получилось у вас что-то или нет.
<?
$url = "http://test.ru/patch/file.php?var=23&var2=54"; // это адрес, по которому скрипт передаст данные методом POST.
$parse_url = parse_url($url);
$path = $parse_url["path"];
if($parse_url["query"])
$path .= "?" . $parse_url["query"];
$host= $parse_url["host"];
$data = "var3=test&var4=".urlencode("еще тест");
$fp = fsockopen($host, 80, $errno, $errstr, 10);
stream_set_blocking($fp,0);
stream_set_timeout($fp,3600*24);
if ($fp)
{
$out = "POST ".$path." HTTP/1.1\n";
$out .= "Host: ".$host."\n";
$out .= "Referer: ".$url."/\n";
$out .= "User-Agent: Opera\n";
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out); // отправляем данные
sleep(1);
while($gets=fgets($fp,2048))
{
print $gets;
}
fclose($fp);
}
?>
24.05.2010 Кирилл
Сработал код до конца, но то что я отправил так и не увидел. Я писал не test.ru, а localhost, по идеи это же не должно влиять.
Я создал файл file.php и скопировал код, правда <?php добавил (оказалось чувствительно к этому) и запускаю.
Но так и не увидел, то что оправил. Отладчик бы какой посоветуйте.
24.05.2010 админ
Кирилл, отладчик очень простой.
Посылаете данные в свой файл (например в 1.php) и в этом файле просто пишите
<?php
print_r($_POST);
print_r($_GET);
?>
После отправки данных в этот файл на экране увидите данные(POST и GET), которые пришли...
Вот и весь отладчик.
21.06.2010 pyt_on
Большое спасибо. Статья очень помогла!!!
10.07.2010 Евгений
вот было бы всегда все так просто...)
15.09.2010 Алексей
Здравствуйте. У меня проблема, сервер отвечает вот такую хрень, что делать ?
HTTP/1.1 400 Bad Request
Server: nginx/0.7.62
Date: Wed, 15 Sep 2010 07:42:27 GMT
Content-Type: text/html
Content-Length: 271
Connection: close
Это явно не страничка, а чтото непонятное (((
Помогите плиз.....
15.09.2010 Алексей
Порт пришлось поменять с 80 на 443, т.к. там он HTTPS
15.09.2010 Админ
Алексей, ну эта ошибка говорит о не правильном запросе.
Скорее всего ошиблись в отправке заголовков. Может где то кавычка опущена или перенос забыли...
Добавить свой комментарий
|