У меня есть онлайн-шлюз, который требует отправки HTML-формы со скрытыми полями. Мне нужно сделать это с помощью PHP-скрипта без каких-либо HTML-форм (у меня есть данные для скрытых полей в БД)
Для этого отправьте данные через GET:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John');
И для отправки данных через POST?
Вы не можете сделать это с помощью PHP.
Как говорили другие, вы можете использовать cURL, но тогда PHP-код становится клиентом, а не браузером.
Если вы должны использовать POST, тогда единственный способ сделать это – создать заполненную форму с помощью PHP и использовать hook.onload для вызова javascript для отправки формы.
C.
вот пример обходного пути.
function redirect_post($url, array $data) { ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript"> function closethisasap() { document.forms["redirectpost"].submit(); } </script> </head> <body onload="closethisasap();"> <form name="redirectpost" method="post" action="<? echo $url; ?>"> <?php if ( !is_null($data) ) { foreach ($data as $k => $v) { echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> '; } } ?> </form> </body> </html> <?php exit; }
Другое решение, если вы хотите избежать зависания и перенаправить браузер, как обычно, и имитировать вызов POST:
сохранить сообщение и сделать временную переадресацию:
function post_redirect($url) { $_SESSION['post_data'] = $_POST; header('Location: ' . $url); }
Затем всегда проверяйте переменную post_data
:
if (isset($_SESSION['post_data'])) { $_POST = $_SESSION['post_data']; $_SERVER['REQUEST_METHOD'] = 'POST'; unset($_SESSION['post_data']); }
сif (isset($_SESSION['post_data'])) { $_POST = $_SESSION['post_data']; $_SERVER['REQUEST_METHOD'] = 'POST'; unset($_SESSION['post_data']); }
Там будут некоторые отсутствующие компоненты, такие как apache_request_headers () не будут отображать заголовок содержимого POST и т. Д.
Он будет включать расширение cURL PHP.
$ch = curl_init('http://www.provider.com/process.jsp'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John"); curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); // RETURN THE CONTENTS OF THE CALL $resp = curl_exec($ch);
/** * Redirect with POST data. * * @param string $url URL. * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123) * @param array $headers Optional. Extra headers to send. */ public function redirect_post($url, array $data, array $headers = null) { $params = array( 'http' => array( 'method' => 'POST', 'content' => http_build_query($data) ) ); if (!is_null($headers)) { $params['http']['header'] = ''; foreach ($headers as $k => $v) { $params['http']['header'] .= "$k: $v\n"; } } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if ($fp) { echo @stream_get_contents($fp); die(); } else { // Error throw new Exception("Error loading '$url', $php_errormsg"); } }
Используйте curl для этого. Google для «curl php post», и вы найдете это: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html .
Обратите внимание, что вы также можете использовать массив для параметра CURLOPT_POSTFIELDS. Из документов php.net:
Полные данные для отправки в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Это может быть либо передано как строка с urlencoded, как «para1 = val1 & para2 = val2 & …», или как массив с именем поля в качестве ключа и данных поля как значение. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data.
Альтернативно, установка переменной сеанса перед перенаправлением и проверка ее в целевом URL-адресе может решить эту проблему для меня.
Вы должны открыть сокет на сайт с помощью fsockopen
и смоделировать HTTP-Post-Request. Google покажет вам множество фрагментов, как имитировать запрос.
Я боюсь, что вам понадобится CURL для этой задачи. Хороший простой способ сделать это здесь: http://davidwalsh.name/execute-http-post-php-curl
надеюсь, это поможет
Я использовал следующий код для сбора данных POST, который был отправлен из form.php, а затем связал его с URL-адресом, чтобы отправить его BACK в форму для исправлений валидации. Работает как шарм и фактически преобразует данные POST в данные GET.
foreach($_POST as $key => $value) { $urlArray[] = $key."=".$value; } $urlString = implode("&", $urlArray); echo "Please <a href='form.php?".$urlString."'>go back</a>";
Старый пост, но вот как я справился с этим. Используя метод newms87:
if($action == "redemption") { if($redemptionId != "") { $results = json_decode($rewards->redeemPoints($redemptionId)); if($results->success == true) { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete'; // put results in session and redirect back to same page passing an action paraameter $_SESSION['post_data'] = json_encode($results); header("Location:" . $redirectLocation); exit(); } } } elseif($action == "redemptionComplete") { // if data is in session pull it and unset it. if(isset($_SESSION['post_data'])) { $results = json_decode($_SESSION['post_data']); unset($_SESSION['post_data']); } // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page. else { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml'; header("Location:" . $redirectLocation); } }
сif($action == "redemption") { if($redemptionId != "") { $results = json_decode($rewards->redeemPoints($redemptionId)); if($results->success == true) { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete'; // put results in session and redirect back to same page passing an action paraameter $_SESSION['post_data'] = json_encode($results); header("Location:" . $redirectLocation); exit(); } } } elseif($action == "redemptionComplete") { // if data is in session pull it and unset it. if(isset($_SESSION['post_data'])) { $results = json_decode($_SESSION['post_data']); unset($_SESSION['post_data']); } // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page. else { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml'; header("Location:" . $redirectLocation); } }
Да, вы можете сделать это на PHP, например, в
Silex или Symfony3
использование подзапроса
$postParams = array( 'email' => $request->get('email'), 'agree_terms' => $request->get('agree_terms'), ); $subRequest = Request::create('/register', 'POST', $postParams); return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
Обходной путь, который отлично работает:
На исходной странице начните открытие сеанса и назначьте столько значений, сколько захотите. Затем выполните перемещение с помощью «заголовка»:
<!DOCTYPE html> <html> <head> <?php session_start(); $_SESSION['val1'] = val1; ... $_SESSION['valn'] = valn; header('Location: http//Page-to-redirect-to'); ?> </head> </html>
И затем, на большой странице:
<!DOCTYPE html> <?php session_start(); ?> <html> ... <body> <?php if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) { YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values } ?> </body> </html>
Нет необходимости в Javascript или JQuery. Удачи!