Способы передачи данных на сервер с помощью PHP

Раздел: -> Отправка данных

Основные способы передачи данных в PHP

Как наиболее эффективно передать данные из HTML формы в PHP?

Основной и наиболее распространённый способ передачи данных на сервер – использование HTTP-метода POST. Данные из формы отправляются в теле запроса, скрыты от URL и не имеют ограничений по объёму (в разумных пределах).

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

<form method="POST" action="handler.php">
  <input type="text" name="username">
  <input type="submit" value="Отправить">
</form>

Обработчик handler.php:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = htmlspecialchars($_POST['username']);
    echo "Привет, " . $name;
}
?>

Типичная ошибка:

Прямое использование $_POST без проверки существования ключа или без фильтрации может привести к ошибкам или XSS-атакам. Всегда проверяйте наличие ключа с помощью isset() или filter_input().

Как передать данные через URL? (GET-метод)

Данные добавляются к URL после знака вопроса.

<form method="GET" action="search.php">
  <input type="text" name="query">
  <input type="submit">
</form>
// search.php
$search = $_GET['query'] ?? '';
echo "Результаты поиска: " . htmlspecialchars($search);

Проблема:

Данные видны в истории браузера и могут быть случайно закладены. Не используйте для паролей.

Как сохранить данные между запросами? (Cookie)

setcookie('user', 'John', time() + 3600);
// На другой странице
if(isset($_COOKIE['user'])) echo $_COOKIE['user'];

Частая ошибка:

Cookie должны быть установлены до любого вывода HTML, иначе будет ошибка.

Как передавать данные между страницами без cookie? (Сессии)

session_start();
$_SESSION['login'] = 'admin';
// Другая страница
session_start();
echo $_SESSION['login'];

Типичная ошибка:

Забыть вызвать session_start() на каждой странице, где используются сессии.

Как загрузить файл на сервер?

<form method="POST" action="upload.php" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit">
</form>
// upload.php
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
}

Ошибка:

Не проверять $_FILES['file']['error'] – может вернуть код ошибки из-за размера или прав.

Как передать JSON данные через API?

$json = file_get_contents('php://input');
$data = json_decode($json, true);
echo $data['name'];

Проблема:

Данные не придут, если не указать Content-Type: application/json в запросе.

Как отправить данные на другой сервер через PHP? (cURL)

$ch = curl_init('https://api.example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['data' => 'value']);
$response = curl_exec($ch);
curl_close($ch);

Типичная ошибка:

Не включать CURLOPT_RETURNTRANSFER для получения ответа в переменную.

Как передать данные через AJAX с обработкой в PHP?

// JavaScript
fetch('ajax.php', {
  method: 'POST',
  body: 'name=John'
}).then(r => r.text()).then(console.log);
// ajax.php
$name = $_POST['name'] ?? 'неизвестно';
echo "Добро пожаловать, $name";

Расширенные примеры передачи данных в нестандартных сценариях.

Передача данных методами PUT и DELETE

Пример REST-запроса с использованием PUT и чтения сырых данных:

Пример
// Клиент (cURL)
$ch = curl_init('https://example.com/users/1');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['name' => 'New']));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_exec($ch);
Пример
// Сервер
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'PUT') {
    $input = json_decode(file_get_contents('php://input'), true);
    // обновление...
}

Ошибка:

Не все хостинги поддерживают PUT/DELETE напрямую. Может потребоваться эмуляция через POST и скрытое поле _method.

Передача данных через HTTP-заголовки

Пример
// Клиент
$headers = ['Authorization: Bearer token123', 'X-Custom: value'];
$ch = curl_init('https://secure.site.com');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
Пример
// Сервер
$auth = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
$custom = $_SERVER['HTTP_X_CUSTOM'] ?? '';

Проблема:

На некоторых серверах заголовок Authorization может не попадать в $_SERVER, если не настроен CGI/FastCGI.

Передача данных через PHP Streams (сокеты)

Пример
$fp = fsockopen('example.com', 80, $errno, $errstr, 30);
if (!$fp) die($errstr);
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) echo fgets($fp, 128);
fclose($fp);

Результат: HTML-код страницы example.com.

HTTP/1.1 200 OK
...
<html>...

Типичная ошибка:

Не соблюдать формат HTTP-запроса (отсутствие двойного перевода строки).

Передача данных с помощью библиотеки Guzzle (комплексный пример)

Пример
require 'vendor/autoload.php';
use GuzzleHttp\Client;

$client = new Client();
$response = $client->post('https://api.github.com/repos/guzzle/guzzle/issues', [
    'headers' => [
        'Accept' => 'application/vnd.github.v3+json',
        'Authorization' => 'token YOUR_TOKEN'
    ],
    'json' => [
        'title' => 'Проблема с документацией',
        'body' => 'Ошибка в разделе...'
    ]
]);
echo $response->getStatusCode(); // 201

Результат: код 201 (создано).

201

Проблема:

Требуется установка Composer и наличие библиотеки.

Передача данных через multipart/form-data программно

Пример
$boundary = '----WebKitFormBoundary' . md5(time());
$body = "--$boundary\r\n"
    . "Content-Disposition: form-data; name=\"user\"\r\n\r\n"
    . "John\r\n"
    . "--$boundary\r\n"
    . "Content-Disposition: form-data; name=\"avatar\"; filename=\"photo.jpg\"\r\n"
    . "Content-Type: image/jpeg\r\n\r\n"
    . file_get_contents('photo.jpg')
    . "\r\n--$boundary--\r\n";

$opts = ['http' => [
    'method' => 'POST',
    'header' => "Content-Type: multipart/form-data; boundary=$boundary",
    'content' => $body
]];
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/upload', false, $context);

Ошибка:

Легко ошибиться в форматировании границ и завершающих символов.

Передача данных в PHP - comments

En
Php передать (php)