Php post несколько параметров

POST запрос, составное содержимое (multipart/form-data)

POST multipart/form-data

В жизни любого программиста попадаются задачки, которые человека цепляют. Вот не нравится стандартный метод решения и все! А порой бывает, что стандартные решения не подходят по какой-то причине. Некоторые люди обходят такие задачи стороной, другие же любят решать их. Можно даже сказать сами их находят. Одна из таких задач отсылка файла или несколько файлов методом POST.

Некоторые наверное скажут, эта задача совсем не задача. Ведь есть замечательная библиотека CURL, которая довольно простая и решает эту задачу легко! Но не спешите. Да, CURL мощная библиотека, да она загружает файлы, но… Как Вы знаете у нее есть маленькая особенность — файл должен быть размещен на жестком диске!

А теперь давайте представим себе такую ситуацию, Вы генерируете динамически файл или же он уже находится в памяти и нужно его отправить методом POST на удаленный Web сервер. Что же тогда получается? Перед его отправкой нужно его сохранить? Да именно так и поступило бы 90% программистов. Зачем искать лишние проблемы, если решение лежит на поверхности? Но мы же с Вами не из этих 90%! Мы же лучше, мы же можем решить любую задачку. Зачем нам лишнее действие? Во-первых, оно задействует не быструю файловую систему жесткого диска. Во-вторых, у нас может и не быть доступа к файловой системе или же там выделено слишком мало места.

Как же нам тогда решить эту задачку? Для этого надо взглянуть как собственно передаются данные методом POST. Единственный вариант решения — это передача файла составным запросом с помощью multipart/form-data. Этот метод хорошо описан в RFC7578. Давайте взглянем как будет выглядеть тело POST запроса multipart/form-data:

POST /form.html HTTP/1.1 Host: server.com Referer: http://server.com/form.html User-Agent: Mozilla Content-Type: multipart/form-data; boundary=-------------573cf973d5228 Content-Length: 288 Connection: keep-alive Keep-Alive: 300 (пустая строка) (отсутствующая преамбула) ---------------573cf973d5228 Content-Disposition: form-data; name="field" text ---------------573cf973d5228 Content-Disposition: form-data; name="file"; filename="sample.txt" Content-Type: text/plain Content file ---------------573cf973d5228--

Наше тело состоит из двух частей, в первой части мы передаем значение поля формы name=«field» равное: text. Во второй части мы передаем поле name=«file» с содержимым файла filename=«sample.txt»: Content file. В заголовке мы указываем формат содержимого POST запроса — Content-Type: multipart/form-data, строку разделитель составных частей: boundary=————-573cf973d5228 и длину сообщения — Content-Length: 288.

Читайте также:  Вывести все значения массива javascript

Осталось, собственно, написать программу реализующий этот метод. Так как мы люди умные и не пишем по сто раз одно и тоже в разных проектах, то оформим все в виде класса реализующий этот метод. Плюс к этому, расширим его для разных вариантов отправки как файлов, так и простых элементов формы. А что бы отличить среди массива POST данных, наличие файла, создадим отдельный файл — контейнер с содержимым файла и его данных (имя и расширение). Таким образом он будет выглядеть следующим образом:

 
class oFile < private $name; private $mime; private $content; public function __construct($name, $mime=null, $content=null) < // Проверяем, если $content=null, значит в переменной $name - путь к файлу if(is_null($content)) < // Получаем информацию по файлу (путь, имя и расширение файла) $info = pathinfo($name); // проверяем содержится ли в строке имя файла и можно ли прочитать файл if(!empty($info['basename']) && is_readable($name)) < $this->name = $info['basename']; // Определяем MIME тип файла $this->mime = mime_content_type($name); // Загружаем файл $content = file_get_contents($name); // Проверяем успешно ли был загружен файл if($content!==false) $this->content = $content; else throw new Exception('Don`t get content - "'.$name.'"'); > else throw new Exception('Error param'); > else < // сохраняем имя файла $this->name = $name; // Если не был передан тип MIME пытаемся сами его определить if(is_null($mime)) $mime = mime_content_type($name); // Сохраняем тип MIME файла $this->mime = $mime; // Сохраняем в свойстве класса содержимое файла $this->content = $content; >; > // Метод возвращает имя файла public function Name() < return $this->name; > // Метод возвращает тип MIME public function Mime() < return $this->mime; > // Метод возвращает содержимое файла public function Content() < return $this->content; > >;

Теперь собственно сам класс по формированию тела multipart/form-data для POST запроса:

 
class BodyPost < //Метод формирования части составного запроса public static function PartPost($name, $val) < $body = 'Content-Disposition: form-data; name="' . $name . '"'; // Проверяем передан ли класс oFile if($val instanceof oFile) < // Извлекаем имя файла $file = $val->Name(); // Извлекаем MIME тип файла $mime = $val->Mime(); // Извлекаем содержимое файла $cont = $val->Content(); $body .= '; filename="' . $file . '"' . "\r\n"; $body .= 'Content-Type: ' . $mime ."\r\n\r\n"; $body .= $cont."\r\n"; > else $body .= "\r\n\r\n".urlencode($val)."\r\n"; return $body; > // Метод формирующий тело POST запроса из переданного массива public static function Get(array $post, $delimiter='-------------0123456789') < if(is_array($post) && !empty($post)) < $bool = false; // Проверяем есть ли среди элементов массива файл foreach($post as $val) if($val instanceof oFile) ; if($bool) < $ret = ''; // Формируем из каждого элемента массива, составное тело POST запроса foreach($post as $name=>$val) $ret .= '--' . $delimiter. "\r\n". self::PartPost($name, $val); $ret .= "--" . $delimiter . "--\r\n"; > else $ret = http_build_query($post); > else throw new \Exception('Error input param!'); return $ret; > >;

Данный класс состоит из нескольких методов. Метод — PartPost формирует отдельные части составного запроса, а метод — Get объединяет эти части и формирует тело POST запроса в формате — multipart/form-data.

Теперь у нас есть универсальный класс для отправки тела POST запроса. Осталось написать программу использующую данный класс для отправки файлов на удаленный Web сервер. Воспользуемся библиотекой CURL:

// Подключаем класс-контейнер содержимого файла include "ofile.class.php"; // Подключаем класс для формирования тела POST запроса include "bodypost.class.php"; // Генерируем уникальную строку для разделения частей POST запроса $delimiter = '-------------'.uniqid(); // Формируем объект oFile содержащий файл $file = new oFile('sample.txt', 'text/plain', 'Content file'); // Формируем тело POST запроса $post = BodyPost::Get(array('field'=>'text', 'file'=>$file), $delimiter); // Инициализируем CURL $ch = curl_init(); // Указываем на какой ресурс передаем файл curl_setopt($ch, CURLOPT_URL, 'http://server/upload/'); // Указываем, что будет осуществляться POST запрос curl_setopt($ch, CURLOPT_POST, 1); // Передаем тело POST запроса curl_setopt($ch, CURLOPT_POSTFIELDS, $post); /* Указываем дополнительные данные для заголовка: Content-Type - тип содержимого, boundary - разделитель и Content-Length - длина тела сообщения */ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $delimiter, 'Content-Length: ' . strlen($post))); // Отправляем POST запрос на удаленный Web сервер curl_exec($ch); 

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

Источник

Php как передать 2 параметра методом POST из select

Добрый вечер дорогие форумчане, столкнулся с проблемой передачи массива методом POST , есть тег select в него из бд передаются 2 значения : уникальный идентификатор категории и название категории , как с помощью метода POST передать этот массив и вставить в БД уникальный идентификатор?

Php как передать 2 параметра методом POST из select
Что то вроде этого , я правильно понимаю? <label> <span>Автор:</span> <select name="autor_ID".

Как передать 2 параметра методом POST из select?
Добрый вечер дорогие форумчане,столкнулся с проблемой передачи 2-х параметров через select тоесть.

Передать значение select методом POST
Сначала я заполняю значения selecta значениями из БД. Нужно передать выбранное значение select.

Как можно передать переменные в файл php по ссылке методом POST?
Есть ajax элемент на странице. В файле-обработчике есть такие строки: if($_POST && $_POST &&.

Лучший ответ

Сообщение было отмечено Victor123456 как решение

Решение

как вариант, передать в value уникальный идентификатор категории и название категории через, например, запятую и на обработчике разделить их по запятой

Лучший ответ

Сообщение было отмечено Victor123456 как решение

Решение

Victor123456, просто в форме — нереально
есть три обходных пути.
1. Добавить в форму скрытое поле и записывать туда категорию при изменении select
Пример

$('.select').on('change','function()  var cat_name = $(this).data('cat_name'); $("#hidden').val(cat_id) })
select class="select"> option value="cat_id" data-cat_name="cat_name">Хоть что/option> /select> input type="hidden" id="hidden">
$('.select').on('change','function()  var cat_name = $('.select :selected').text(); //Текст из выбранной options $("#hidden').val(cat_id) })
select class="select"> option value="cat_id">Название категории/option> /select> input type="hidden" id="hidden">
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var cat = {}; var cat_id = $('.select').val(); var cat_name = $(this).data('cat_name'); cat[cat_id] = cat_name; $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: {'cat':cat}, success:function(data){ //Ответ от сервера } })

Добавлено через 6 минут
БОНУС
Можно так, при этом все поля собираются автоматом, и не надо будет добавлять много переменных для отправки

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
$('.select').on('change','function()  var cat_name = $(this).data('cat_name'); $("#hidden').val(cat_id) }) //Собираем все поля var formdata = new Formdata($('.form').get(0)); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: formdata, contentType: false, processData: false, success:function(data){ //Ответ от сервера } })
$cat_name = $_POST['cat_name']; //вернет cat_name
$cat = $_POST['cat']; //вернет массив cat_id=>cat_name

Лучший ответ

Сообщение было отмечено Victor123456 как решение

Решение

brain-4-me, реально, об этом выше написали как сделать, потом с помощью explode разобрать. И зачем используете скрытое поле? Когда при изменении select’a Вы получите ид. У Вас код с ошибками, «опечатками» в первом примере. Вы сами пробовали на работоспособность код? Покажет что не определено. С инпутами Ваш способ нормально сработает, а вот с option уже нет.
Вот так нужно

select id="select" > option value="cat_id1" data-cat_name="cat_name1">Хоть что/option> option value="cat_id2" data-cat_name="cat_name2">Хоть что2/option> option value="cat_id3" data-cat_name="cat_name3">Хоть что2/option> /select>
$(document).ready(function () { $('#select').on('change',function(){ var cat_id = $(':selected', this).val(); var cat_name = $(':selected', this).data('cat_name'); console.log(cat_id); console.log(cat_name); }); });

Второй вариант, снова лишняя кавычка. 3 вариант, не сработает, ибо не указан выбранный option из которого получим значение data. И в последнем тоже кавычка А вот на счет совета, не надо будет «добавлять много переменных» Можно прописать обязательно чтобы поля были заполнены, но мало ли, чем они заполнены. Тем самым первоначально проще коду отработать на стороне клиента, тем самым проверить эти самые переменны. А потом уже слать на обработчик php и там еще раз все обработать. Нагрузка будет значительно меньше, ибо все у клиента проверяется. Так, что тут на счет переменных и сериализации я много думал. Ну и hidden обрамлено в разные кавыки.

Добавлено через 1 минуту
И да, это не обходные пути — это программирование(C)

Источник

Передача параметров с разных кнопок через POST

У меня есть форма, в которой находится 2 разных кнопки. Как сделать так, чтобы параметры передавались в разные файлы в зависимости от нажатой кнопки?

POST передача параметров
Код сканирует директорию, после создает checkbox с названием файлов в директории. После выделения.

Передача параметров методом POST
добрый день. возникла вот такая вот проблема. выполнить пхп-скрипт, обработать вывод и вывести на.

Передача параметров . Тема: Протокол HTTP. HTML-формы. GET- и POST-запросы
Напишите два PHP-скрипта: один с формой для передачи параметров, второй с расчетами, произведенными.

Передача через POST name, а не value
Существует страница index.php в ней есть кусок кода: <?php echo "<form.

Эксперт PHP

А с помощью PHP можно сделать так. Файл обработчик будет один, но если нажата кнопка 1, то require «file1.php»; если 2, то соответственно require «file2.php»

Эксперт PHP

if(isset($_POST['button1'])) include('file1.php'); elseif(isset($_POST['button2'])) include('file2.php'); else echo 'Нажми кнопку';

ЦитатаСообщение от TrustNo1 Посмотреть сообщение

А с помощью PHP можно сделать так. Файл обработчик будет один, но если нажата кнопка 1, то require «file1.php»; если 2, то соответственно require «file2.php»

Параметры передаются в script.php, который берет нужный вам файл, в зависимости от нажатой кнопки, как написал выше Jodah

Передача переменной через POST
Сайт с фильмами, рядом с каждым фильмом 2 кнопки: "Отзывы" и "В избранное", в них записывается код.

Передача параметров через форму
Всем доброго времени суток. Решил я значит начать изучать php и в процессе обучения столкнулся с.

Передача параметров в .exe через php
Привет. Пишу небольшой тестирующий модуль для проведения олимпиад по программированию и столкнулся.

Передача содержимого input radio через post
Проблема следующая. Мне нужно передать несколько параметров с помощью post. Почему-то не передается.

Передача параметров файлу, подключаемому через include
Как можно передать параметры в подключаемый через include файл. Т.е. есть некий файл, который.

Передача json данных методом POST через AJAX
нужно передать данные на сервер методом post передача на сервер req.open("POST".

Источник

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