Php get put data

PHP
Чтение данных запроса

GET , лучше всего предоставлять данные, необходимые для отображения страницы, и их можно использовать несколько раз (поисковые запросы, фильтры данных . ). Они являются частью URL-адреса, что означает, что они могут быть добавлены в закладки и часто используются повторно.

Запросы POST, с другой стороны, предназначены для отправки данных на сервер только один раз (контактные формы, формы входа . ). В отличие от GET, который принимает только ASCII, запросы POST также позволяют бинарные данные, включая загрузку файлов .

Вы можете найти более подробное объяснение их различий здесь .

Уязвимость данных запроса

Получение данных из суперглобальных переменных $ _GET и $ _POST без какой-либо проверки считается плохой практикой и открывает методы для пользователей для потенциального доступа или компрометации данных с помощью инъекций кода и SQL . Неверные данные должны быть проверены и отклонены, чтобы предотвратить такие атаки.

Данные запроса должны быть экранированы в зависимости от того, как они используются в коде, как указано здесь и здесь . В этом ответе можно найти несколько различных функций эвакуации для общих случаев использования данных.

Обработка ошибок загрузки файлов

$_FILES[«FILE_NAME»][‘error’] (где «FILE_NAME» — это значение атрибута имени входного файла, представленного в вашей форме) может содержать одно из следующих значений:

  1. UPLOAD_ERR_OK — Нет ошибки, файл загружен с успехом.
  2. UPLOAD_ERR_INI_SIZE — Загруженный файл превышает директиву upload_max_filesize в php.ini .
  3. UPLOAD_ERR_PARTIAL — загруженный файл превышает директиву MAX_FILE_SIZE, указанную в HTML-форме.
  4. UPLOAD_ERR_NO_FILE — файл не загружен.
  5. UPLOAD_ERR_NO_TMP_DIR — Отсутствует временная папка. (Из PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE — Не удалось записать файл на диск. (Из PHP 5.1.0).
  7. UPLOAD_ERR_EXTENSION — расширение PHP остановило загрузку файла. (Из PHP 5.2.0).
Читайте также:  Передать функции параметр this javascript

Основным способом проверки ошибок является следующее:

Чтение данных POST

Данные из запроса POST хранятся в суперглобальном $_POST в форме ассоциативного массива.

Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset() или empty() или оператора null coalesce.

$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME"; $message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE"; echo "Message from $from: $message"; 
$from = $_POST["name"] ?? "NO NAME"; $message = $_POST["message"] ?? "NO MESSAGE"; echo "Message from $from: $message"; 

Чтение данных GET

Данные из запроса GET хранятся в суперглобальном $_GET в форме ассоциативного массива.

Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset() или empty() или оператора null coalesce.

Пример: (для URL /topics.php?author=alice&topic=php )

$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR"; $topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC"; echo "Showing posts from $author about $topic"; 
$author = $_GET["author"] ?? "NO AUTHOR"; $topic = $_GET["topic"] ?? "NO TOPIC"; echo "Showing posts from $author about $topic"; 

Чтение исходных данных POST

Обычно данные, отправленные в запросе POST, представляют собой структурированные пары ключ / значение с типом MIME- application/x-www-form-urlencoded . Однако для многих приложений, таких как веб-сервисы, вместо них необходимо отправить необработанные данные, часто в формате XML или JSON. Эти данные могут быть прочитаны с использованием одного из двух методов.

php://input — это поток, который обеспечивает доступ к необработанному тексту запроса.

$rawdata = file_get_contents("php://input"); // Let's say we got JSON $decoded = json_decode($rawdata); 

$HTTP_RAW_POST_DATA — это глобальная переменная, содержащая необработанные данные POST. Он доступен только в том случае, если always_populate_raw_post_data директива always_populate_raw_post_data в php.ini .

$rawdata = $HTTP_RAW_POST_DATA; // Or maybe we get XML $decoded = simplexml_load_string($rawdata); 

Эта переменная устарела с PHP версии 5.6 и была удалена в PHP 7.0.

Обратите внимание, что ни один из этих методов не доступен, если для типа содержимого задано значение multipart/form-data , которое используется для загрузки файлов.

Загрузка файлов с помощью HTTP PUT

PHP обеспечивает поддержку метода HTTP PUT, используемого некоторыми клиентами для хранения файлов на сервере. Запросы PUT намного проще, чем загрузка файлов с использованием запросов POST, и они выглядят примерно так:

PUT /path/filename.html HTTP/1.1 

В ваш PHP-код вы тогда сделаете что-то вроде этого:

Также здесь вы можете прочитать интересные вопросы и ответы о получении файла через HTTP PUT.

Передача массивов POST

Обычно элемент HTML-формы, представленный в PHP, приводит к одному значению. Например:

Это приводит к следующему результату:

Однако могут быть случаи, когда вы хотите передать массив значений. Это можно сделать, добавив PHP-подобный суффикс к имени HTML-элементов:

Это приводит к следующему результату:

Array ( [foo] => Array ( [0] => bar [1] => baz ) ) 

Вы также можете указать индексы массива в виде чисел или строк:

Что возвращает этот вывод:

Array ( [foo] => Array ( [42] => bar [foo] => baz ) ) 

Этот метод можно использовать, чтобы избежать циклов обработки после массива $_POST , делая ваш код более компактным и более кратким.

  • Начало работы с PHP
  • APCu
  • BC Math (бинарный калькулятор)
  • Imagick
  • IMAP
  • JSON
  • Loops
  • PDO
  • PHP MySQLi
  • php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
  • PHP Встроенный сервер
  • PHPDoc
  • PSR
  • SimpleXML
  • SQLite3
  • Streams
  • URL-адрес
  • UTF-8,
  • WebSockets
  • XML
  • YAML в PHP
  • Автозагрузка грунтовки
  • Альтернативный синтаксис для структур управления
  • Анализ HTML
  • Асинхронное программирование
  • Аутентификация HTTP
  • Безопасность
  • Буферизация вывода
  • Вклад в PHP Core
  • Внедрение зависимости
  • Внесение изменений в Руководство по PHP
  • Волшебные константы
  • Волшебные методы
  • Вывод значения переменной
  • Выполнение по массиву
  • Генераторы
  • закрытие
  • Защитите Remeber Me
  • Интерфейс командной строки (CLI)
  • Использование cURL в PHP
  • Использование MongoDB
  • Использование Redis с PHP
  • Использование SQLSRV
  • Итерация массива
  • Как определить IP-адрес клиента
  • Как разбить URL-адрес
  • Класс Datetime
  • Классы и объекты
  • Клиент SOAP
  • Комментарии
  • Компилировать расширения PHP
  • Компиляция ошибок и предупреждений
  • Константы
  • Контрольные структуры
  • криптография
  • кэш
  • локализация
  • Манипулирование массивом
  • Манипуляции заголовков
  • Массивы
  • Машинное обучение
  • Менеджер зависимостей композитора
  • Многопоточное расширение
  • многопроцессорная обработка
  • Монго-PHP
  • Область переменных
  • Обработка изображений с помощью GD
  • Обработка исключений и отчетов об ошибках
  • Обработка нескольких массивов вместе
  • Обработка файлов
  • Общие ошибки
  • операторы
  • отладка
  • Отправка электронной почты
  • отражение
  • переменные
  • Переменные Superglobal PHP
  • Печенье
  • Поддержка Unicode в PHP
  • Пространства имен
  • Работа с датами и временем
  • Развертывание докеров
  • Регулярные выражения (regexp / PCRE)
  • Рекомендации
  • Рецепты
  • Розетки
  • Сервер SOAP
  • Сериализация
  • Сериализация объектов
  • сессии
  • Соглашения о кодировании
  • Создание PDF-файлов в PHP
  • Спектакль
  • Строковый анализ
  • Структуры данных SPL
  • Тестирование устройства
  • Тип жонглирования и нерегулярные проблемы сравнения
  • Тип подсказки
  • Типы
  • Установка в средах Linux / Unix
  • Установка среды PHP в Windows
  • Фильтры и функции фильтра
  • Форматирование строк
  • функции
  • Функции хеширования пароля
  • Функциональное программирование
  • Черты
  • Чтение данных запроса
  • Шаблоны проектирования

Источник

PHP get PUT request body

but this returns an empty string. Also a fopen() / fread() combination doesn’t work. When calling via POST, everything works great, I can read the json perfectly on the server side. But the API isn’t Restful anymore. Does anyone have a solution for this? Is there another way to send and receive Json? btw, I’m developing the API with the Slim Framework.

Awesome that you’re using slim. I hope you’re having good experiences. I’ve really enjoyed my SLIM restful api creation

This comment in the manual suggests that you might need to sent the Content-Length header (not sure if cURL will do this automatically. ) and use fopen , rather than file_get_contents . No idea how accurate that is, but it might be worth an attempt.

curl does send the Content-Length header, and also when sending it manually, nothing changes. Also fopen doesn’t work.

4 Answers 4

php://input is only readable once for PUT requests:

Note: A stream opened with php://input can only be read once; the stream does not support seek operations. However, depending on the SAPI implementation, it may be possible to open another php://input stream and restart reading. This is only possible if the request body data has been saved. Typically, this is the case for POST requests, but not other request methods, such as PUT or PROPFIND.

http://php.net/manual/en/wrappers.php.php

The Slim framework already reads the data upon request. Take the data from the Request object, into which it has been read.

Thank you very much, this solved my issue. I can get the raw data with $app->request->getBody(); and then do a json_decode. I wasn’t aware of this method, since it isnt in the documentation.

+1 this was my problem using the restTonic PHP framework. The $this->request->data variable already held the PUT body. I had read php://input in my POST handler and couldn’t see why the PUT handler couldn’t use the same method to handle its body.

On the server side, I’m not able the retrieve the request body. I tried file_get_contents(«php://input»);

You can only use file_get_contents( ‘php://input’, ‘r’ ); once per request. Retrieving its values will truncate the values as well, so if you call it twice, it’ll return an empty string. Slim’s request object contains the values you need, so:

put( '/items/someid', function () use ( $app ) < echo $app->request( )->put( 'example' ); // should display "data". >); 

This is true for url-encoded data, but not for raw json. if I send the data url encoded, I can access it via Slim’s request object. doesn’t work for json tough.

The issue remains; you can only read from php://input once, and Slim has already done that. You’ll have to use Slim’s request object to get your values.

Apparently the Slim Framework reads the request body upon construction, so php://input was already deleted. thx!

The example from the PHP manual uses fopen to access php://input in read mode. Have you tried doing it that way instead?

EDIT: The manual page for PHP:// says some stuff that seems to suggest that PUT data might not be available in some cases!

Note: A stream opened with php://input can only be read once; the stream does not support seek operations. However, depending on the SAPI implementation, it may be possible to open another php://input stream and restart reading. This is only possible if the request body data has been saved. Typically, this is the case for POST requests, but not other request methods, such as PUT or PROPFIND.

I don’t know where this will leave you regarding PUT processing. One page seems to say it’s possible, the other seems to imply that it won’t work under the wrong set of circumstances

Источник

Оцените статью