Отправка формы через PHP CURL

К примеру, на сайте есть форма, после её отправки требуется все данные ($_GET, $_POST и $_FILES) транслировать на другой сервер через CURL.

1

Пример формы:

<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>
HTML

Обработка формы и передача массива $_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;
}
PHP

Код принимающего скрипта inbox.php:

<?php
print_r($_GET);
PHP

Пример полученных данных:

Array (
	[email] => mail@snipp.ru
	[password] => 123456
	[check] => on
	[submit] =>
)
2

Отправка формы через POST

С 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>
HTML
<?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;
}
PHP

Код скрипта inbox.php:

<?php
print_r($_POST);
PHP

Пример полученных данных:

Array (
	[email] => mail@snipp.ru
	[password] => 123456
	[check] => on
	[submit] =>
)
3

С файлами выходит труднее – нужно преобразовать структуру массива $_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>
HTML

В 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;
}
PHP

Код скрипта inbox.php:

<?php 
print_r($_POST);
print_r($_FILES);
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 
		)
	)
)
16.12.2021
7509
Предыдущая запись Замена формата цвета CSS в PHP
Следующая запись POST-запрос через file_get_content()

Комментарии

, чтобы добавить комментарий.

Другие публикации

Проверка данных регулярными выражениями
Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
20667
+8
Маски ввода для текстовых полей
Применение масок ввода у полей форм значительно упрощает их использование, уменьшает количество ошибок и приводит...
112565
+8
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
75692
+25
Блокировка многократной отправки формы
Из-за отправки файла, медленного интернета или тормозящего браузера, пользователь может нажать кнопку отправки формы...
13617
+2
Интеграция с платежной системой PayKeeper в PHP
Платежная платформа PayKeeper позволяет принимать оплату заказов по ссылке, используя данный метод можно с легкостью...
10491
+1
Примеры отправки AJAX JQuery
AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.
298745
+39