К примеру, на сайте есть форма, после её отправки требуется все данные ($_GET
, $_POST
и $_FILES
) транслировать на другой сервер через CURL.
Пример формы:
<form method="get" action="/index.php">
<div>
<label>Email address</label>
<input type="email" name="email" placeholder="Enter email">
</div>
<div>
<label>Password</label>
<input type="password" name="password" placeholder="Password">
</div>
<div>
<input type="checkbox" name="check"> Check me out
</div>
<div>
<button type="submit" name="submit">Submit</button>
<div>
</form>
Обработка формы и передача массива $_GET
на https://домен.ru/inbox.php
.
<?php
if (isset($_GET['submit'])) {
$ch = curl_init('https://домен.ru/inbox.php?' . http_build_query($_GET));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
}
Код принимающего скрипта inbox.php:
Пример полученных данных:
Array (
[email] => mail@snipp.ru
[password] => 123456
[check] => on
[submit] =>
)
С POST-запросом всё примерно также:
<form method="post" action="/index.php">
<div>
<label>Email address</label>
<input type="email" name="email" placeholder="Enter email">
</div>
<div>
<label>Password</label>
<input type="password" name="password" placeholder="Password">
</div>
<div>
<input type="checkbox" name="check"> Check me out
</div>
<div>
<button type="submit" name="submit">Submit</button>
<div>
</form>
<?php
if (isset($_POST['submit'])) {
$ch = curl_init('https://домен.ru/inbox.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST, '', '&'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
}
Код скрипта inbox.php:
Пример полученных данных:
Array (
[email] => mail@snipp.ru
[password] => 123456
[check] => on
[submit] =>
)
С файлами выходит труднее – нужно преобразовать структуру массива $_FILES
в одномерный массив и подготовить файлы для CURL. Пример для версии >= PHP 5.5.0:
<form method="post" action="" enctype="multipart/form-data">
<div>
<label>Email address</label>
<input type="text" name="email" placeholder="Enter email">
</div>
<div>
<label>Password</label>
<input type="password" name="password" placeholder="Password">
</div>
<div>
<input type="checkbox" name="check"> Check me out
</div>
<div>
<input type="file" name="file">
</div>
<div>
<input type="file" name="files[]" multiple>
</div>
<div>
<button type="submit" name="submit">Submit</button>
<div>
</form>
В PHP-скрипте учтены вариации полей <input type="file" > как с выбором одного файла, так множественный выбор (multiple).
<?php
// Функция для конвертирования многомерного массива
function build_post_fields($data, &$returnArray, $existingKeys = '')
{
if (($data instanceof CURLFile) or !(is_array($data) or is_object($data))) {
$returnArray[$existingKeys] = $data;
return $returnArray;
} else{
foreach ($data as $key => $item) {
build_post_fields($item, $returnArray, ($existingKeys) ? $existingKeys . "[$key]" : $key);
}
return $returnArray;
}
}
if (isset($_POST['submit'])) {
$post = $_POST;
// Добавление $_FILES в $post
if (!empty($_FILES)) {
foreach ($_FILES as $key => $row) {
$diff = count($row) - count($row, COUNT_RECURSIVE);
if ($diff == 0) {
if(!empty($row['name']) && empty($row['error'])) {
$curl_file = new CURLFile($row['tmp_name'], $row['type'] , $row['name']);
$post[$key] = $curl_file;
}
} else {
$files = array();
foreach($row as $k => $l) {
foreach($l as $i => $v) {
$files[$i][$k] = $v;
}
}
foreach ($files as $file) {
if(!empty($file['name']) && empty($file['error'])) {
$curl_file = new CURLFile($file['tmp_name'], $file['type'] , $file['name']);
$post[$key][] = $curl_file;
}
}
}
}
}
$fields = array();
build_post_fields($post, $fields);
// Отправка через CURL
$ch = curl_init('https://домен.ru/inbox.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
}
Код скрипта inbox.php:
Пример полученных данных:
Array (
[email] => mail@snipp.ru
[password] => 123456
[check] => on
[submit] =>
)
Array (
[file] => Array (
[name] => 1.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpdC8ZxR
[error] => 0
[size] => 106720
)
[files] => Array (
[name] => Array (
[0] => 2.jpg
[1] => 4.jpg
)
[type] => Array (
[0] => image/jpeg
[1] => image/jpeg
)
[tmp_name] => Array (
[0] => /tmp/php53643z
[1] => /tmp/php18gRri
)
[error] => Array (
[0] => 0
[1] => 0
)
[size] => Array (
[0] => 463542
[1] => 120580
)
)
)