Перейти к содержимому

Php input что это

  • автор:

Php://input

Этот метод нужен чтобы получить содержимое POST и GET запросов?Чем уже $_POST и $_GEt не устроил? Зачем вообще нужен этот ужас? Читая статью трудно въехать для чего нужны эти самые потоки. Ни примеров ни толквого изложения. http://www.php.net/manual/ru/wrappers.php.php

Отслеживать
задан 16 окт 2013 в 4:47
2,470 7 7 золотых знаков 32 32 серебряных знака 47 47 бронзовых знаков
file_get_contents читает содержимое файла, вроде как. При чем тут запросы?
16 окт 2013 в 5:23
читает еще модержимое потоков. А что это за потоки,реки. мне не понятно.Дебилный раздел PHP
16 окт 2013 в 5:28

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

К примеру вам нужно отправить json сериализованную строку. Передавать это нужно через POST, потому что в GET длина этой самой строки ограничена, кажется, 4мя килобайтами.

Что же именно передается POST методом ?

А передается вот что:

POST /test/script.php HTTP/1.1 Host: site.com Content-Length: xxxx . и другие заголовки.. paramName1=paramValue1¶mName2=paramValue2. 

Передавать что-то типа: abc= не хочется, потому что нужно экранировать еще эту строку.

Поэтому мы просто скармливаем строку скрипту. На сервер прийдет что-то типа такого:

POST /test/script.php HTTP/1.1 Host: site.com Content-Length: xxxx . и другие заголовки..

Естественно, сервер не умеет парсить такие запросы, поэтому нам на помощь приходит file_get_contents(‘php://input’);

Мы можем получить то, что нам прислали, без изменений, самим распарсить это и быть счастливым 🙂

Как и для чего используется php://input?

mad_maximus

Данные и так передаются по POST (или GET), но есть нюансы их обработки на стороне сервера.

1. POST и GET данные в виде parameter=value&param2=val2 автоматически обрабатываются сервером и заполняются глобальные массивы $_POST/$_GET/$_REQUEST:

$_POST['parameter'] = value; $_POST['param2'] = val2;

GET-параметры при этом ещё и автоматически декодируются по urldecode().
Через php://input можно получить «сырые» необработанные данные.

2. Методом POST можно прислать, например, объект JSON, указав ‘Content-type: application/json; charset=utf-8’. При этом массив-обёртка $_POST будет пуста, тк не присылается Имя_Параметра, а присылается только Значение_Параметра, и сервер не обрабатывает такие данные автоматически.
Получить такие данные можно только через php://input, так как глобальные массивы $_POST/$_GET будут пустыми.

Массивы $_POST и $_GET в PHP. Обработка форм

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

Через формы можно отправлять как простую текстовую информацию, так и файлы.

Большую часть времени программирования на PHP вы будете так или иначе работать с формами и данными из них.

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

PHP содержит множество средств для работы с формами. Это позволяет очень просто решать типичные задачи, которые часто возникают в веб-программировании:

  • Регистрация и аутентификация пользователя;
  • Отправка комментариев на форумах и социальных сетях;
  • Оформление заказов.

Практически любой современный сайт содержит как минимум несколько разных HTML-форм.

Отправка формы

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

Такая форма в HTML может выглядеть следующим образом:

 

Это очень простая форма, состоящая из трёх полей и одной кнопки отправки.

Почти весь приведённый код описывает внешний вид и содержание формы, но следует обратить внимание на два атрибута тега , которые нужны для указания на способ обработки данных:

method — этот атрибут используется для определения метода HTTP, который будет использован для передачи данных на сервер. Вы уже знакомы с HTTP-методом GET, предписывающим серверу просто вернуть определённый документ.

Метод POST сообщает о намерении передать на сервер некоторую информацию, что, впрочем, не отменяет последующее получение контента.

action — содержит адрес PHP-скрипта, который должен обработать эту форму.

После нажатия на кнопку «отправить», браузер выполняет POST запрос со введёнными данными на адрес, указанный в атрибуте action.

Обработка формы

После отправки формы управление передаётся PHP-скрипту, который должен получить переданные данные, выполнить с ними какие-либо действия (например, сохранить в базе данных) и показать результат.

Результатом может быть какое-нибудь сообщение об успешном завершении операции, например, «ваши данные успешно отправлены».

Поэтому требуется в первую очередь научиться получать данные из формы в сценарии.

В PHP это делается легко — все данные из формы находятся в глобальном ассоциативном массиве $_POST . Этот массив всегда будет неявно присутствовать в сценарии, если он был загружен по методу POST.

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

Email: " . $_POST['email']); print("
Сообщение: " . $_POST['message']); > ?>

Функция isset служит для определения, существует ли переданная ей переменная. Так мы проверяем, что сценарий загружен методом POST, то есть была отправлена форма.

Как правило, после обработки формы в PHP, сценарий должен переадресовать пользователя на другую страницу. Это связано с тем, что если форма была отправлена через метод POST, то после обновления страницы данные будут отправлены ещё раз, а это, в большинстве случаев, нежелательное поведение.

Отправка файлов

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

 Ваш аватар: 

Тут есть два важных отличия от первого примера:

  • Добавился новый атрибут enctype, который всегда должен иметь значение multipart/form-data . Если его не будет, то файл не отправится.
  • Сам файл загружается при помощи поля с типом file.

В PHP загруженный файл будет доступен в другом специальном массиве — $_FILES .

PHP автоматически сохраняет все загруженные файлы во временную папку на сервере. Но хранить там файлы нельзя, потому что эта директория периодически очищается, и ссылку на такой файл нельзя дать на сайте. Решение здесь только одно — переместить загруженный файл в другую папку. Перемещение файла всегда выполняют сразу после загрузки.

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

Перемещение загруженного файла

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

С текущим адресом всё крайне просто — он уже находится в массиве $_FILES . Новый адрес файла, в свою очередь, состоит из пути к папке и имени файла. Так как папка uploads находится там же, где и текущий сценарий, получить путь к ней можно так: dirname(__FILE__ )`.

Код для перемещения файла в новую папку:

Функция move_uploaded_file() выполняет два действия:

  • Проверяет, что файл действительно загружен через форму.
  • Перемещает загруженный файл по новому адресу.

Валидация формы

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

Так, например, при регистрации пользователя на сайте, он должен заполнить поля с адресом электронной почты и придумать себе пароль. Оба поля обязательны к заполнению, но значение из поля email также должно быть корректным email-адресом.

Помимо текстовых значений формы, можно проверять формат и размер загружаемых файлов.

Общий подход к валидации

При выполнения валидации любой формы порядок действий будет всегда одним:

  • Сформировать массив с именами полей, обязательных к заполнению.
  • Сформировать массив с правилами для валидации формата полей.
  • Получить значения всех полей.

Дополнительные материалы:

  • Функции в PHP: что это такое и как они работают
  • Чем отличаются HTTP-методы GET и POST
  • Подробнее про тег

«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

Читать дальше

Как работает протокол HTTP

Как работает протокол HTTP

HTTP был разработан в 1990-х годах для создания первого интерактивного текстового веб-браузера. За эти годы протокол менялся и совершенствовался, становился более гибким и постепенно превратился в современный интернет. В статье рассмотрим принцип работы протокола и что важно знать о нём разработчику.

  • 8 февраля 2023

10 популярных функций в MYSQL, которые вам нужно знать

10 популярных функций в MYSQL, которые вам нужно знать

Без лишних слов принесли вам некоторые популярные функции MySQL, без которых вы точно не обойдётесь в работе.

  • 17 января 2023

Подключение файлов в PHP. Метод require()

Подключение файлов в PHP. Метод require()

Способность вызывать сценарий из отдельного файла по его имени называется в PHP подключением файлов. Подключают PHP-сценарии, любые текстовые файлы или HTML-страницы.

  • 21 ноября 2022

Массивы в PHP

Массивы в PHP

Массив — это ещё один тип данных, вроде числа или строки. Главное отличие массива от остальных типов данных заключается в его способности хранить в переменной больше одного значения. В предыдущих примерах имя переменной всегда ассоциировалось только с одним значением:

  • $name = «Иннокентий»
  • $age = 42

А если мы хотим узнать не только пол, имя и возраст пользователя, но и, допустим, любимые сериалы? Очень непросто назвать один самый любимый сериал, а вот вспомнить несколько — намного легче. Сохранение в переменную-массив нескольких значений выглядит так:

 $fav_shows = ["game of thrones", "american horror story", "walking dead"]; 

В этом примере мы сохранили в переменной $fav_shows сразу три значения. Но сохранить эти данные — это только половина дела. Как с ними потом работать? Уже знакомый вам способ вывода переменной на экран не будет работать с массивами:

Так увидеть список любимых сериалов не получится. Дело в том, что массив — это не обычная переменная. Массив хранит не простые типы, вроде текста или чисел (их ещё называют «скалярными типами»), а более сложную структуру данных, поэтому здесь нужен особый подход.

Внутри массива у каждого значения есть адрес, по которому к нему можно обратиться. Такой адрес называется индексом. Индекс — это просто порядковый номер значения внутри массива. Индексация начинается с нуля, так что первый элемент получает индекс — 0 , второй — 1 , и так далее.

Чтобы получить определенный элемент массива, необходимо знать его индекс (ключ). Напечатаем названия всех сериалов из массива через запятую:

Теперь можно дать определение массива: Массив — это совокупность множества элементов вида «ключ: значение».

Массивы позволяют перезаписывать существующие значения и добавлять новые. Добавить новое значение в массив можно так:

$fav_shows[] = "the big bang theory"; 

Новый элемент автоматически получит индекс равный максимальному индексу из существующих + 1. «Теория большого взрыва» сохранится в массиве под индексом 3 .

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

$fav_shows[4] = "fargo"; 

Для полного удаления (без замены на другое) значения по его индексу существует функция unset :

unset($fav_shows[4]); 
  • 10 ноября 2022

Синтаксис PHP

Синтаксис PHP

Разберёмся, из чего состоит любой язык программирования.

У каждого языка есть правила и конструкции, следуя которым мы выражаем мысли и делаем их понятными для другого человека. В программировании всё точно так же. Но вместо человеческого языка мы используем язык программирования PHP, а в роли нашего собеседника выступает PHP-интерпретатор. Поэтому, чтобы выразить свою мысль, мы должны сделать её понятной для интерпретатора.

  • 27 октября 2022

Учебник по PHP

Учебник по PHP

  1. Знакомство с языком
    • Что такое PHP
    • Синтаксис PHP
    • Массивы
    • Циклы
    • Функции
  2. Шаблонизация и подключение файлов
    • Подключение файлов
    • Шаблонизация
  3. Протокол HTTP и формы
    • Протокол HTTP
    • Формы
    • Уязвимости
  4. Идентификация пользователя на сайте
    • Аутентификация пользователя
  5. Базы данных
    • База данных
    • SQL
    • MySQL в PHP
    • Безопасность в MySQL
  6. Объекты и использование библиотек
    • Объекты
    • Библиотеки
    • Composer
  • 10 сентября 2022

Протокол HTTP и работа с заголовками

Протокол HTTP и работа с заголовками

Весь современный веб построен на модели взаимодействия клиента и сервера. Как она работает:

  • браузер пользователя (клиент) отправляет на сервер запрос с адресом сайта (URL);
  • сервер получает запрос и отдаёт клиенту запрошенный контент.

Для реализации процесса используется универсальный протокол HTTP.

  • 10 сентября 2022

Защита от SQL-инъекций

Защита от SQL-инъекций

Внедрение SQL-кода (SQL инъекция) — один из распространённых способов взлома сайтов, работающих с базами данных. Способ основан на внедрении в запрос произвольного SQL-кода. Внедрение SQL позволяет хакеру выполнить произвольный запрос к базе данных (прочитать содержимое любых таблиц, удалить, изменить или добавить данные).

Атака этого типа возможна, когда недостаточно фильтруются входные данные при использовании в SQL-запросах.

  • 10 сентября 2022

Объекты и классы в PHP

Объекты и классы в PHP

Объекты в PHP — это просто ещё один тип данных. Объект позволяет хранить в переменной набор из свойств и их значений, а также встроенные функции. Это делает объекты похожими по своей структуре на ассоциативные массивы. Но отличие от массивов всё-таки есть, и при этом достаточно важное — объекты могут иметь внутреннее состояние.

  • 10 сентября 2022

Циклы в PHP. Краткое руководство

Циклы в PHP. Краткое руководство

Цикл — это конструкция языка, которая выполняет блок кода больше одного раза.

Мы привыкли, что сценарии выполняются линейно: сверху вниз, строчка за строчкой. Но что делать, если надо повторить какую-нибудь инструкцию несколько раз? Например, как вывести на экран натуральные числа от 1 до 9?

Есть очевидный способ:

Но он заставляет писать много кода. И что если требуется вывести последовательность из миллиона чисел? Ещё бывают ситуации, когда заранее неизвестно сколько раз нужно выполнить определённую инструкцию.

Использование циклов значительно упрощает и укорачивает код. Циклы незаменимы в ситуациях, когда заранее неизвестно сколько раз должен выполниться блок кода. Такое число зависит от множества условий и вычисляется в момент выполнения сценария.

Так выглядит цикл в PHP:

  • 10 сентября 2022

Класс Input

Давайте теперь сделаем класс Input для работы с инпутами. Вот готовая реализация этого класса:

Давайте используем новый класс Input вместе с уже созданным нами классом Form :

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘name’, ‘year’)->open(); echo (new Input)->setAttr(‘type’, ‘submit’)->open(); echo $form->close(); ?>

В результате получится следующая форма:

Скопируйте себе мой код класса Input . Скопируйте пример формы. Запустите его в браузере, убедитесь, что форма действительно появляется. Вбейте какие-нибудь данные в инпут и нажмите на кнопку отправки. Убедитесь, что форма действительно рабочая.

Убираем open

Давайте уберем метод open , добавив магию метода __toString :

public function __toString() < return parent::open(); >> ?>

Перепишите приведенный ниже код с учетом нашей правки:

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘name’, ‘year’)->open(); echo (new Input)->setAttr(‘type’, ‘submit’)->open(); echo $form->close(); ?>

Некоторые замечания

Пока наш PHP код формы получается длиннее соответствующего HTML кода. Возникает вопрос: зачем нам PHP вариант, если все намного короче можно написать на HTML?

Все дело в том, что наша PHP реализация дает нам дополнительные возможности. Например, мы можем сделать так, чтобы данные из инпутов не исчезали после отправки формы.

И теперь преимущество в длине кода будет уже на стороне PHP варианта — длина HTML варианта существенно вырастет, а длина PHP варианта останется неизменной.

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘name’, ‘year’); echo (new Input)->setAttr(‘type’, ‘submit’); echo $form->close(); ?>

Пусть у нас несколько инпутов:

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘field1’, ‘year’); echo (new Input)->setAttr(‘field2’, ‘year’); echo (new Input)->setAttr(‘name’, ‘submit’); echo $form->close(); ?>

Как вы видите, длина инпутов PHP варианта теперь существенно короче.

Кроме того, HTML вариант имеет еще один существенный недостаток — для корректной работы имя инпута нужно повторить аж 3 раза: тут name=»field1″, тут isset($_REQUEST[‘field1’]) и тут echo $_REQUEST[‘field1’].

Представьте, каким кошмаром будет изменения имен нескольких инпутов. Это не говоря о возможность в одном из мест просто забыть изменить имя — и инпут будет работать некорректно.

В PHP варианте имя инпута задает в одном месте.

Убедившись в преимуществах нашего варианта формы, приступим к его реализации.

Реализация сохранения значений после отправки

Как вы должны знать, значение инпута задается в атрибуте value . Нам необходимо сделать следующее: если форма была отправлена, то в value инпута следует записать то значение, которое было в нем в момент отправки.

Каким образом получить это значение? Пусть имя инпута было year . В этом случае после отправки формы в $_REQUEST[‘year’] и будет находится нужное нам значение.

В нашем случае имя инпута хранится в родительском классе Tag в приватном свойстве $attrs . Наш класс Input как потомок класса Tag может получить доступ к любому атрибуту с помощью геттера, вот так: $inputName = $this->getAttr(‘name’).

Давайте получим имя нашего инпута, достанем значение из $_REQUEST по этому имени и запишем в value инпута:

// Переопределяем метод родителя: public function open() < $inputName = $this->getAttr(‘name’); // имя инпута $value = $_REQUEST[$inputName]; // получаем значение инпута по его имени $this->setAttr(‘value’, $value); // записываем в value инпута return parent::open(); // вызываем метод open родителя > public function __toString() < return $this->open(); // здесь теперь не метод родителя, а наш > > ?>

Приведенный выше код пока не очень корректный: он не учитывает того, что отправки формы могло еще и не быть. Давайте учтем:

// Переопределяем метод родителя: public function open() < $inputName = $this->getAttr(‘name’); // имя инпута // Если форма была отправлена и есть данные с именем нашего инпута: if (isset($_REQUEST[$inputName])) < $value = $_REQUEST[$inputName]; // получаем значение из $_REQUEST $this->setAttr(‘value’, $value); // записываем в value инпута > return parent::open(); // вызываем метод open родителя > public function __toString() < return $this->open(); > > ?>

Вот теперь наш код уже достаточно рабочий, но есть пару нюансов.

Что будет, если у нашего инпута по умолчанию уже есть какое-то значение (например, текущий год), например, вот так:

setAttr(‘name’, ‘year’) ->setAttr(‘value’, date(‘Y’)); // значение по умолчанию ?>

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

На самом деле наш код так и работает! Если была отправка формы, то мы попадем в условие и там изменим value инпута, но если отправки не было — value инпута останется таким, как и было задано.

Второй нюанс: есть инпуты, у которых нет атрибута name . Например, кнопка отправки формы. В этом случае с такими инпутами ничего и не надо делать. Учтем это дополнительным условием:

Ну вот теперь можно пробовать. Можете запустить приведенный ниже код формы, вбить что-то в инпут и нажать на кнопку отправки — после обновления страницы данные из инпута не исчезнут:

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘name’, ‘year’); echo (new Input)->setAttr(‘type’, ‘submit’); echo $form->close(); ?>

А вот пример, когда в инпуте уже есть какое-то значение по умолчанию:

setAttrs([‘action’ => », ‘method’ => ‘GET’]); echo $form->open(); echo (new Input)->setAttr(‘name’, ‘year’)->setAttr(‘value’, date(‘Y’)); echo (new Input)->setAttr(‘type’, ‘submit’); echo $form->close(); ?>

Реализуйте самостоятельно сохранение значений инпутов после отправки. Проверьте работу данного механизма.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *