Способы передачи данных на сервер с помощью 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);
Ошибка:
Легко ошибиться в форматировании границ и завершающих символов.