Как отправить POST запрос и сделать редирект на УРЛ с помощью fsockopen

Статус
В этой теме нельзя размещать новые ответы.

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
Мне нужно отправить на определенный скрипт POST запрос и затем перейти на этот адрес, чтобы был виден результат POST запроса.

С помощью кода ниже я отправляю POST запрос на url. А как сделать чтобы при переходе на файл с этим кодом на заданный url осуществлялся POST-запрос и переход на этот урл? Помогите пожалуйста

Код:
// Отправляем POST запрос с помощью fsockopen()
 
//открываем сокет к http://www.example.loc на 80-й порт с таймаутом в 30 секунд
$socket = fsockopen($url, 80, $errno, $errstr, 30);
 
//если fsockopen вернула false, то завершаем работу скрипта и выводим текст и номер ошибки
if(!$socket)die("$errstr($errno)");
 
//собираем данные
$data = "purse=".urlencode($purse)."&order_id=".urlencode($order_id)."&amount=".urlencode($amount)."&amount=".urlencode($amount)."&description=".urlencode($description)."&sign=".urlencode($sign);
 
//пишем в сокет метод, URI и протокол
fwrite($socket, "POST ".$uri." HTTP/1.1\r\n");
//а также имя хоста
fwrite($socket, "Host: ".$url."\r\n");
 
//теперь отправляем заголовки
//Content-type должен быть applicaion/x-www-form-urlencoded
fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
//размер передаваемых данных передаем в заголовке Content-length
fwrite($socket,"Content-length:".strlen($data)."\r\n");
//типы принимаемых данных. */* означает, что принимаем все типы данных
fwrite($socket,"Accept:*/*\r\n");
//представимся оперой
fwrite($socket,"User-agent:Opera 10.00\r\n");
fwrite($socket,"Connection:Close\r\n");
fwrite($socket,"\r\n");
 
//теперь передаем данные
fwrite($socket,"$data\r\n");
fwrite($socket,"\r\n");
 
//читаем и выводим ответ (ВМЕСТО этого нужно перейти на $url)
/*
$answer = '';
while(!feof($socket)){
  $answer.= fgets($socket, 4096);
}
echo $answer;
 
*/
 
 
//закрываем сокет
fclose($socket);
 
С точки зрения протокола http, кто пост запрос отправил, тот и только тот может ответ читать.
Если надо редиректнуть на страницу принимающую данные методом POST используют браузерные выкрутасы - скрытая для отображения форма с заполненными полями, и вызов функции submit для этой кнопки, через javascript.
 
не понятен смысл , для чего , ответ сервера это и есть "переход "
 
PHP:
header("Location: тут нужный урл");
Даст редирект на урл, но результат пост запроса не будет виден. Чтобы получить в браузере именно результат - нужно читать ответ (из сокета) и выводить его в браузер (recv && echo).
Хотя, честно говоря, не до конца ясно, что вообще надо.
 
Постом не получится, можно гетом, что-то типа "header( 'Location: /people/user.php?param=0', true, 307 );"
 
Я сделал просто
Код:
echo "<form name=\"sms\" action='".$url."' method='POST'>";
echo "<input name='id' type='hidden' value='".$id."' />";
echo "<input name=\"description\" type=\"hidden\" value='".$description."' />";
echo "<input name=\"purse\" type=\"hidden\" value='".$purse."' />";
echo "<input name=\"order_id\" type=\"hidden\" value='".$order_id."' />";
echo "<input name=\"amount\" type=\"hidden\" value='".$amount."' />";
echo "<input name=\"clear_amount\" type=\"hidden\" value='".$clear_amount."' />";
echo "<input name=\"sign\" type=\"hidden\" value='".$sign."' />";
echo "</form>";
 
echo "<script type=\"text/javascript\">";
echo "window.onload = function() {";
echo "document.forms[\"sms\"].submit();";
echo "} </script>";
и работает как надо, всем спасибо.
 
появился ещё один вопрос: Как отправить массив в форму через скрытое поле?

Нужно массив вида
Код:
Array ( [name] => landing_test [ids] => Array ( [0] => 2 [1] => 5 )  [site_lang] => 1 )
отправить, используя форму. Делаю так:
Код:
echo "<form name=\"love\" action='/subm.php' method='POST'>";
echo "<input type=\"hidden\" name=\"name\" value='".$data["fname"]."' />";
echo "<input type=\"hidden\" name=\"ids[]\" value='".$data["ids"]."'>";
echo "<input type=\"hidden\" name=\"site_lang\" value='".$data["site_lang"]."'>";
echo "</form>";
 
echo "<script type=\"text/javascript\">";
echo "window.onload = function() {";
echo "document.forms[\"love\"].submit();";
echo "} </script>";

В результате, в скрипте subm.php, сделав print_r($_POST); получаю:
Код:
Array ( [name] => landing_test [ids] => Array ( [0] => Array ) [site_lang] => 1 )
т.е. ids приходит пустой, без элементов. Как привильно отправить массив, чтобы ids пришел с элементами?
 
Код:
value='".json_encode($data["ids"])."'
 
В формате необходимом ТС, скорее так:

PHP:
foreach($data["ids"] as $val){
	echo "<input type=\"hidden\" name=\"ids[]\" value='".$val."'>";
}

Хотя json_encode(), json_decode(), я бы тоже назвал более предпочтительным вариантом.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху